이번에는 특정 박스에 어떤 물고기가 들어있을지 확률을 구하는 모델이 필요하다
우선 주어진 데이터 정보를 확인하자
import pandas as pd
import numpy as np
fish = pd.read_csv('https://bit.ly/fish_csv_data')
print(fish.head())
print(pd.unique(fish['Species']))
# 출력
Species Weight Length Diagonal Height Width
0 Bream 242.0 25.4 30.0 11.5200 4.0200
1 Bream 290.0 26.3 31.2 12.4800 4.3056
2 Bream 340.0 26.5 31.1 12.3778 4.6961
3 Bream 363.0 29.0 33.5 12.7300 4.4555
4 Bream 430.0 29.0 34.0 12.4440 5.1340
['Bream' 'Roach' 'Whitefish' 'Parkki' 'Perch' 'Pike' 'Smelt']
우리는 Species를 타겟으로, 나머지를 특성으로 이용 할 것이다.
fish_input = fish[['Weight','Length','Diagonal','Height','Width']].to_numpy()
fish_target = fish['Species'].to_numpy()
from sklearn.model_selection import train_test_split
train_input, test_input, train_target, test_target = \
train_test_split(fish_input, fish_target, random_state=42)
이번에 위 데이터들을 통해 종을 분류하기 위해 로지스틱 회귀
를 사용 할 것이다
로지스틱 회귀는 마찬가지로 선형 방정식을 통해 학습을 진행한다
위 값을 통해 값을 도출해낸다. 하지만 결과값은 아주 큰 음수 또는 아주 큰 양수가 나올 수 있다.
해당 값들을 확률로 나타내기 위해 시그모어 함수
를 사용하였다.
import matplotlib.pyplot as plt
z = np.arange(-5,5,0.1)
phi = 1/(1+np.exp(-z))
plt.plot(z,phi)
plt.xlabel('z')
plt.ylabel('phi')
plt.show()
이제 위 기술과 정보들로 분류를 시작해보자.
우선 간단하게 도미/빙어를 분류해보기로 해였다
bream_smelt_indexs = (train_target == 'Bream') | (train_target == 'Smelt')
train_bream_smelt = train_scaled[bream_smelt_indexs]
target_bream_smelt = train_target[bream_smelt_indexs]
먼저 도미, 빙어 데이터만 사용하기 위해 둘의 데이터만 따로 추출하였다
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
lr.fit(train_bream_smelt, target_bream_smelt)
print(lr.predict(train_bream_smelt[:5]))
이제 로지스틱 회귀
모델에 해당 데이터들을 학습시킨 후 출력하였다
[[0.99759855 0.00240145]
[0.02735183 0.97264817]
[0.99486072 0.00513928]
[0.98584202 0.01415798]
[0.99767269 0.00232731]]
print(lr.coef_,lr.intercept_)
[[-0.4037798 -0.57620209 -0.66280298 -1.01290277 -0.73168947]] [-2.16155132]
그럼 7종의 생선을 모두 분류하려면 어떻게 해야할까?
lr = LogisticRegression(C = 20, max_iter = 1000)
lr.fit(train_scaled, train_target)
print(lr.score(train_scaled,train_target)) # 0.933...
print(lr.score(test_scaled,test_target)) # 0.925
마찬가지로 훈련세트를 학습 후, 점수를 출력하였다
이제 5개의 샘플을 예측해보자
print(lr.predict(test_scaled[:5]))
proba = lr.predict_proba(test_scaled[:5])
print(np.round(proba, decimals=3))
['Perch' 'Smelt' 'Pike' 'Roach' 'Perch']
[[0. 0.014 0.841 0. 0.136 0.007 0.003]
[0. 0.003 0.044 0. 0.007 0.946 0. ]
[0. 0. 0.034 0.935 0.015 0.016 0. ]
[0.011 0.034 0.306 0.007 0.567 0. 0.076]
[0. 0. 0.904 0.002 0.089 0.002 0.001]]
decisions = lr.decision_function(test_scaled[:5])
print(np.round(decisions, decimals=2))
from scipy.special import softmax
proba = softmax(decisions, axis=1)
print(np.round(proba, decimals=3))
[[ -6.5 1.03 5.16 -2.73 3.34 0.33 -0.63]
[-10.86 1.93 4.77 -2.4 2.98 7.84 -4.26]
[ -4.34 -6.23 3.17 6.49 2.36 2.42 -3.87]
[ -0.68 0.45 2.65 -1.19 3.26 -5.75 1.26]
[ -6.4 -1.99 5.82 -0.11 3.5 -0.11 -0.71]]
[[0. 0.014 0.841 0. 0.136 0.007 0.003]
[0. 0.003 0.044 0. 0.007 0.946 0. ]
[0. 0. 0.034 0.935 0.015 0.016 0. ]
[0.011 0.034 0.306 0.007 0.567 0. 0.076]
[0. 0. 0.904 0.002 0.089 0.002 0.001]]