아래와 같은 순서로 책을 보시면 파이썬 => 판다스 => 머신러닝, 딥러닝을 공부할 수 있습니다. 제가 정리한 글에 있습니다.
https://steemit.com/kr/@papasmf1/73cj22
핸즈온 머신러닝 책의 소스는 아래의 깃허브에 있습니다. 참고하실 수 있습니다.
https://github.com/rickiepark/handson-ml
제가 테스트하고 실습하는 환경은 맥에 아나콘다 최근 패키지를 설치해서 주피터랩으로 실행하고 있습니다.
4장 모델 훈련에 나오는 내용들입니다.
결정 경계
로지스틱 회귀를 설명하기 위해 붓꽃 데이터셋을 사용합니다. Iris-Setosa, Iris-Vesicolor, Iris-Virginica에 속하는 붓꽃 150개의 꽃잎과 꽃받침의 너비와 길이를 담고 있습니다.
from sklearn import datasets
iris = datasets.load_iris()
list(iris.keys())
['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename']
X = iris["data"][:, 3:] #꽃잎의 너비
y = (iris["target"] == 2).astype(np.int) # 1 Iris-Virginia면 1, 그렇지 않으면 0
로지스틱 회귀 모델을 훈련시킵니다.
from sklearn.linear_model import LogisticRegression
log_reg = LogisticRegression()
log_reg.fit(X, y)
꽃잎의 너비가 0~3cm인 꽃에 대해 모델의 추정 확률을 계산해 보겠습니다.
X_new = np.linspace(0, 3, 1000).reshape(-1, 1)
y_proba = log_reg.predict_proba(X_new)
plt.plot(X_new, y_proba[:, 1], "g-", label="Iris-Virginica")
plt.plot(X_new, y_proba[:, 0], "b--", label="Iris-Virginica 아님" )
Iris-Verginica(삼각형으로 표시)의 꽃잎 너비는 1.4 ~ 2.5cm에 분포합니다. 반면 다른 붓꽃(사각형으로 표시)는 일반적으로 꽃잎 너비가 더 작아 0.1 ~ 1.8cm에 분포합니다. 그래서 약간 중첩되는 부분이 있습니다. 꽃잎 너비가 2cm이상인 꽃은 분류기가 Iris-Verginica라고 강하게 확신합니다. 반면 1cm아래면 Iris-Verginica가 아니라고 강하게 확신합니다. 그렇기 때문에 양쪽의 확률이 똑같이 50%가 되는 1.6cm 근방에서 결정 경계가 만들어 집니다. 꽃잎 너비가 1.6cm보가 크면 분류기는 Iris-Verginica로 분류하고, 그보다 작으면 아니라고 예측할 것입니다.
log_reg.predict([[1.7], [1.5]])
array([1, 0])
소프트매스 회귀
로지스틱 회귀 모델은 여러 개의 이진 분류기를 훈련시켜 연결하지 않고 직접 다중 클래스를 지원하도록 일반화될 수 있습니다. 이를 소프트맥스 회귀 또는 다항 로지스틱 회귀라고 합니다.
X = iris["data"][:, (2, 3)] # 꽃잎 길이, 꽆잎 너비
y = iris["target"]
softmax_reg = LogisticRegression(multi_class="multinomial", solver="lbfgs", C=10)
softmax_reg.fit(X, y)
꽃잎의 길이가 5cm, 너비가 2cm인 붓꽃을 발견했다고 가정하고 이 붓꽃의 품종이 무엇인지 모델에 질의하면 94.2%의 확률로 Iris-Verginica(클래스 2)라고 (또는 5.8% 확률로 Iris-Versicolor라고)출력할 것입니다.
softmax_reg.predict([[5, 2]])
array([2])
softmax_reg.predict_proba([[5, 2]])
array([[6.38014896e-07, 5.74929995e-02, 9.42506362e-01]])