08. 로지스틱 회귀

akanana·2023년 1월 11일
0

개인공부

목록 보기
20/30
post-thumbnail
post-custom-banner

가챠박스

이번에는 특정 박스에 어떤 물고기가 들어있을지 확률을 구하는 모델이 필요하다
우선 주어진 데이터 정보를 확인하자

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)

로지스틱 회귀

이번에 위 데이터들을 통해 종을 분류하기 위해 로지스틱 회귀를 사용 할 것이다
로지스틱 회귀는 마찬가지로 선형 방정식을 통해 학습을 진행한다
z=a(Weight)+b(Length)+c(Diagonal)+d(Height)+e(Widht)+fz=a*(Weight) + b*(Length) + c*(Diagonal) + d*(Height) + e*(Widht) + f
위 값을 통해 값을 도출해낸다. 하지만 결과값은 아주 큰 음수 또는 아주 큰 양수가 나올 수 있다.
해당 값들을 확률로 나타내기 위해 시그모어 함수를 사용하였다.
ϕ=11+ez\phi = \frac{1}{1+e^{-z}}

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]]
post-custom-banner

0개의 댓글