코딩하는 타코야끼

[스터디 노트] Week12_1일차 [1 ~ 3] - ML 본문

zero-base 데이터 취업 스쿨/스터디 노트

[스터디 노트] Week12_1일차 [1 ~ 3] - ML

가스오부시 2023. 10. 10. 03:02
728x90
반응형

1. 머신러닝이란


📍 머신러닝(machine learning)

  • 컴퓨터가 데이터를 통해 학습하여 특정 작업을 수행하는 능력을 개선하는 알고리즘과 기술의 집합입니다.
  • 전통적인 프로그래밍에서는 문제를 해결하기 위해 직접 명령어를 작성하는 반면, 머신러닝에서는 대량의 데이터와 알고리즘을 사용하여 패턴을 찾아내고, 그 결과로 예측, 분류, 군집화 등의 작업을 수행합니다.

🔌 지도학습 (Supervised Learning)

  • 입력 데이터와 해당 데이터에 대한 목표 또는 라벨이 주어집니다.
  • 알고리즘은 주어진 입력에서 원하는 출력을 예측하는 방법을 학습합니다. 예를 들어, 스팸 메일 필터링이나 이미지 분류와 같은 작업에서 사용됩니다.

🔌 비지도학습 (Unsupervised Learning)

  • 입력 데이터만 주어지고 목표 또는 라벨이 주어지지 않습니다.
  • 알고리즘은 데이터의 구조나 패턴을 찾아냅니다. 예를 들어, 군집화나 차원 축소와 같은 작업에서 사용됩니다.

🔌 강화학습 (Reinforcement Learning)

  • 에이전트(agent)가 환경과 상호작용하면서 보상을 최대화하는 행동을 학습합니다. 예를 들어, 게임 플레이나 로봇 제어와 같은 작업에서 사용됩니다.

2. 데이터관찰

⚡️ 데이터 보기

from sklearn.datasets import load_iris

iris = load_iris()
iris.keys()
>>>
dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename', 'data_module'])
iris["target"] # 0번 라벨은 setosa, 1번은 versicolor, 2번은 virginica
>>>
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])

 

⚡️ 종류 라벨 추가

import pandas as pd

df = pd.DataFrame(iris.data, columns=iris.feature_names)
df["species"] = iris.target
df.head()

⚡️ 꽃입 세로 길이(sepal length)

plt.figure(figsize=(12, 6))
sns.boxplot(x="sepal length (cm)", y="species", data=df, orient="h") # orient

⚡️ 꽃입 가로 길이(sepal width)

plt.figure(figsize=(12, 6))
sns.boxplot(x="sepal width (cm)", y="species", data=df, orient="h") # orient

⚡️ 꽃받침 가로 길이(petal length)

plt.figure(figsize=(12, 6))
sns.boxplot(x="petal length (cm)", y="species", data=df, orient="h") # orient

⚡️ 꽃받침 가로 길이(petal width)

plt.figure(figsize=(12, 6))
sns.boxplot(x="petal width (cm)", y="species", data=df, orient="h") # orient

⚡️ pairplot으로 확인

sns.pairplot(df,
             vars=["petal length (cm)", "petal width (cm)"],
             hue="species", height=4, palette="Set2")

⚡️ 시각화 분석

  • petal length이 2.5 보다 작으면 다 Setosa 다.
  • petal length이 2.5 보다 크고 petal width가 1.6 이하면 Versicolor
  • petal lengthdl 2.5 보다 크고 petal width가 1.6 이상이면 Virginica

 

 

 

3. Decision Tree


📍 Decision Tree의 분할 기준(Split Criterion)

🔌 엔트로피 개념

  • 열역학의 용어로 물질의 열적 상태를 나타내는 물리 량의 단위 중 하나. 무질서의 정도를 나타냄
  • 1948년 엔트로피 개념에서 힌트를 얻어 확률 분포의 무질서도나 불확실성
  • 혹은 정보 부담 정도를 나타내는 정보 엔트로피 개념을 클로드 섀넌이 고안함

  • entropy : 얼마만큼의 정보를 담고 있는가? 또한, 무질서도(disorder)를 의미, 불확실성(uncertainty)를 나타내기도 함

  • p는 해당 데이터가 해당 클래스에 속할 확률이고 위 식을 그려보면 다음과 같다
  • 어떤 확률 분포로 일어나는 사건을 표현하는 데 필요한 정보의 양이며
  • 이 값이 커질수록 확률 분포의 불확실성이 커지며 결과에 대한 예측이 어려워짐
import numpy as np

p = np.arange(0.001, 1, 0.001)
plt.grid()
plt.title("$-p \\log_{2}{p}$")
plt.plot(p, -p*np.log2(p))


4. Scikit Learn

  • 2007년 구글 썸머 코드에서 처음 구현
  • 현재 파이썬에서 가장 유명한 기계 학습 오픈 소스 라이브러리

🔌 모델 정의

from sklearn.tree import DecisionTreeClassifier

tree = DecisionTreeClassifier(random_state=0)

🔌 모델 학습

tree.fit(iris.data[:, 2:], iris.target)

🔌 모델 예측

from sklearn.metrics import accuracy_score

y_pred_tr = tree.predict(iris.data[:, 2:])
y_pred_tr
>>>
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])

🔌 모델 정확도

accuracy_score(iris.target, y_pred_tr)
>>>
0.9933333333333333

5. 과적합(overfitting)


📍 지도 학습

  • 학습 대상이 되는 데이터에 정답(label)을 붙여서 학습 시키고
  • 모델을 얻어서 완전히 새로운 데이터에 모델을 사용해서 “답”을 얻고자 하는 것


📍 Tree model visualization

from sklearn.tree import plot_tree

plt.figure(figsize=(12, 8))
plot_tree(tree)

 


📍 결졍 경계 확인

from mlxtend.plotting import plot_decision_regions

plt.figure(figsize=(14, 8))
plot_decision_regions(X=iris.data[:, 2:], y=iris.target, clf=tree, legend=2)
plt.show()


❗️Accuracy가 높다고? 믿을 수 있는지 의심하기

  • Acc가 높게 나왔다고 해도 좀 더 들여다 볼 필요가 당연히 있다.
  • 저 경계면은 올바른 걸까?
  • 저 결과는 내가 가진 데이터를 벗어나서 일반화할 수 있는 걸까?
  • 어차피 얻은(혹은 구한) 데이터는 유한하고 내가 얻은 데이터를 이용해서 일반화를 추구하게 된다.
  • 이때 복잡한 경계면은 모델의 성능을 결국 나쁘게 만든

6. 데이터분리

  • 확보한 데이터 중에서 모델 학습에 사용하지 않고 빼둔 데이터를 가지고 모델을 테스트한다.
from sklearn.model_selection import train_test_split

X = iris.data[:, 2:]
y = iris.target

# X, y(전체 데이터셋)을 Train dataset 과 Test dataset으로 분리.
X_train, X_test, y_train, y_test = train_test_split(X, # 전체데이터셋 중 Features, input
                                                    y, # 전체데이터셋 중 Labels, output(target)
                                                    test_size=0.2,# (20%) //  전체중 test set의 비율 (기본값: 0.25)
                                                    stratify=y, # 전체 데이터셋의 출력 클래스의 비율과 동일한 비율로 나눠지도록 한다.분류 Dataset을 나눌때 필수, (회귀는 하지 않음.)
                                                    shuffle=True, # 데이터셋을 나누기 전에 섞는지(랜덤) 여부: True - 섞는다.(기본값), False - 안 섞는다.
                                                    random_state=0 # random seed 값.
                                                   )
X_train.shape
>>>
(120, 2)

❗️ 훈련용 / 테스트용이 잘 분리 되었을까?

np.unique(y_test, return_counts=True)
>>>
(array([0, 1, 2]), array([10, 10, 10]))

📍 모델 학습, 예측 및 추론

tree = DecisionTreeClassifier(random_state=0)

tree.fit(X_train, y_train)
plot_tree(tree)

 

pred_train = tree.predict(X_train)

# 예측
acc = accuracy_score(y_train, pred_train)
acc
>>>
0.9916666666666667

⚡️ 시각화

from mlxtend.plotting import plot_decision_regions

plt.figure(figsize=(14, 8))
plot_decision_regions(X=X_train, y=y_train, clf=tree, legend=2)
plt.show()


📍추론 활용기술 - zip과 언패킹

# zip
list1 = ["a", "b", "c"]
list2 = [1, 2, 3]

pairs = [pair for pair in zip(list1, list2)]
pairs
>>>
[('a', 1), ('b', 2), ('c', 3)]

dict(pairs)
>>>
{'a': 1, 'b': 2, 'c': 3}

⚡️ 언패킹

x , y = zip(*pairs)
print(x)
print(y)
>>>
('a', 'b', 'c')
(1, 2, 3)
반응형