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이 되도록 만드는 함수.
- 지수함수를 사용해서 정규화된 지수함수라고도 부름.
<전체 소스 코드>
'혼공단 > 혼공단 5기' 카테고리의 다른 글
[혼공단 5기] 혼자 공부하는 머신러닝 + 딥러닝 3주차 후기 및 미션 인증 (0) | 2021.02.12 |
---|---|
혼자 공부하는 머신러닝 + 딥러닝 4장 - 확률적 경사 하강법 (0) | 2021.02.12 |
[혼공단 5기] 혼자 공부하는 머신러닝 + 딥러닝 2주차 후기 및 미션 인증 (0) | 2021.02.04 |
혼자 공부하는 머신러닝 + 딥러닝 3장 - 특성 공학과 규제 (0) | 2021.02.04 |
혼자 공부하는 머신러닝 + 딥러닝 3장 - 선형 회귀 (0) | 2021.02.02 |