혼공단/혼공단 5기

혼자 공부하는 머신러닝 + 딥러닝 4장 - 로지스틱 회귀

하양훈 2021. 2. 11. 13:09
반응형

1. 로지스틱 회귀

- 선형 방정식을 학습하여 모델을 만든 뒤 이를 이용해 분류하는 모델(이름이 회귀이나 분류 모델에 속함)

 

 

- 위와 같이 선형 방정식 형태로 나타나는데 이때 z값의 범위는 시그모이드 함수(또는 로지스틱 함수)를 사용하면 0과 1 범위로 표현할 수 있다.

 

시그모이드 함수와 그래프

 

- 시그모이드 함수 : 선형 방정식의 출력 z의 음수를 사용해 자연 상수 e를 거듭제곱하고 1을 더한 값의 역수, 이 값을 확률처럼 해석이 가능하다.

- 사이킷런의 경우 시그모이드 함숫값이 0.5로 나오면 음수로 취급한다.

 

2. 로지스틱 회귀로 이진 분류 수행하기

#도미(bream)와 빙어(smelt)인 값들만 추출
bream_smelt_indexes = (train_target =='Bream') | (train_target =='Smelt')
train_bream_smelt = train_scaled[bream_smelt_indexes]
target_bream_smelt = train_target[bream_smelt_indexes]

#로지스틱 회귀로 훈련
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
lr.fit(train_bream_smelt, target_bream_smelt)

#훈련 모델을 사용해 처음 5개의 샘플을 예측
print(lr.predict(train_bream_smelt[:5])
>> ['Bream','Smelt','Bream','Bream','Bream']

 

- 학습모델이 LogisticRegression일뿐, 내부는 최근에 배웠던 k-최근접 이웃 분류와 큰 차이는 없다.

 

print(lr.predict_proba(train_bream_smelt[:5]))
>> 
[[0.99759855 0.00240145]
 [0.02735183 0.97264817]
 [0.99486072 0.00513928]
 [0.98584202 0.01415798]
 [0.99767269 0.00232731]]

 

- predict_proba를 통해 예측확률을 구할 수 있다.  이때 확률 리스트의 순서는 변수의 알파벳 순서로 정렬된다. 

(위의 경우에는 첫번째가 도미(bream), 두 번째가 빙어(smelt)이다.)

 

print(lr.coef_, lr.intercept_)
>> [[-0.4037798  -0.57620209 -0.66280298 -1.01290277 -0.73168947]] [-2.16155132]

decisions = lr.decision_function(train_bream_smelt[:5])
print(decisions)
>> [-6.02927744  3.57123907 -5.26568906 -4.24321775 -6.0607117 ]

from scipy.special import expit
print(expit(decisions))
>> [0.00240145 0.97264817 0.00513928 0.01415798 0.00232731]

 

- coef_, intercept 으로 로지스틱 모델이 학습한 방정식의 계수와 절편을 구할 수 있으며, decision_fuction()으로 z값을 구할 수 있다. 

- decision_fuction()으로 구한 z값을 시그모이드 함수에 통과시키면 확률을 얻을 수 있다. 시그모이드 함수는 사아파이(Scipy)에 explit함수를 이용하면 금방 구한다.(이 값은 위의 두 번째 확률 값과 동일하다)

 

 

3. 로지스틱 회귀로 다중 분류 수행하기

 

- 다중분류 : 타깃 데이터에 2개 이상의 클래스가 포함된 문제

- 사이킷런에서는 편리하게 문자열로 된 타깃 값을 그대로 사용해 다중 분류로 적용할 수 있다. 다만 그 순서가 알파벳으로 매겨지기 때문에 확인을 잘해야 한다.

- 다중 분류는 클래스마다 z값을 하나씩 계산하고, 이 중 가장 높은 z값을 출력하는 클래스가 예측 클래스가 된다. 이때 확률을 계산하는 방법은 소프트 맥스 함수를 사용한다.

 

lr = LogisticRegression(C=20, max_iter=1000)
lr.fit(train_scaled, train_target)

print(lr.score(train_scaled, train_target))
>> 0.9327731092436975
print(lr.score(test_scaled, test_target))
>> 0.925

 

- 이진 분류와 마찬가지로 predict와 preditc_proba를 쓸 수 있다.

 

print(lr.predict(test_scaled[:5]))
>> ['Perch' 'Smelt' 'Pike' 'Roach' 'Perch']

proba = lr.predict_proba(test_scaled[:5])
print(np.round(proba, decimals=3))
>> [[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]]

 

- 타깃 클래스가 7종류이기 때문에 총 7개의 열이 출력되게 된다. 이 역시 알파벳 순서로 클래스가 정렬된다는 것을 기억하자.

- 다중 분류 시 predict_proba에서 확률 계산은 소프트맥스 함수로 계산한다. 소프트맥스 함수는 사아파이(Scipy)에 softmax 함수를 이용하면 금방 구한다.(이 값은 위의 proba배열과 동일하다)

from scipy.special import softmax

proba = softmax(decision, axis=1)
print(np.round(proba, decimals=3))
>>[[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]]

 

<소프트맥스 함수>

- 여러 개의 선형 방정식의 출력 값을 0~1 사이로 압축하고 전체 합이 1이 되도록 만드는 함수.

- 지수함수를 사용해서 정규화된 지수함수라고도 부름.

 

<전체 소스 코드>

링크 : https://bit.ly/hg-04-1

반응형