로지스틱 회귀
선형방정식을 사용한 분류 알고리즘이다. 시그모이드 함수나 소프트맥스 함수를 사용하여 클래스 확률을 출력할 수 있다.
다중 분류
타깃 클래스가 2개 이상인 분류문제이다. 로지스틱 회귀는 다중 분류를 위해 소프트맥스 함수를 사용하여 클래스를 예측한다.
시그모이드 함수
이진분류를 위해 사용하고, 선형방정식의 출력을 0~1 사이의 값으로 압축한다.
소프트맥스 함수
다중분류를 위해 사용하고, 여러 선형 방정식의 출력 결과를 정규화하여 합이 1이 되도록 만든다.
LogisticRegression
선형 분류 알고리즘인 로지스틱 회귀를 위한 클래스이다.
predict_proba()
예측 확률을 반환한다.
decision_function()
모델이 학습한 선형 방정식의 출력을 반환한다.
이진 분류일 경우 양성클래스의 확률이 반환된다.
다중 분류일 경우 각 클래스마다 선형방정식을 계산해서 가장 큰 값의 클래스가 예측 클래스가 된다.
import pandas as pd
fish = pd.read_csv('https://bit.ly/fish_csv')
fish.head()
print(pd.unique(fish['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)
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
ss.fit(train_input)
train_scaled = ss.transform(train_input)
test_scaled = ss.transform(test_input)
from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier(n_neighbors=3)
kn.fit(train_scaled, train_target)
print(kn.score(train_scaled, train_target))
print(kn.score(test_scaled, test_target))
print(kn.classes_)
print(kn.predict(test_scaled[:5]))
import numpy as np
proba = kn.predict_proba(test_scaled[:5])
print(np.round(proba, decimals=4))
distances, indexes = kn.kneighbors(test_scaled[3:4])
print(train_target[indexes])
잠깐 !!
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)
print(lr.predict(train_bream_smelt[:5]))
print(lr.predict_proba(train_bream_smelt[:5]))
print(lr.coef_,lr.intercept_)
decisions = lr.decision_function(train_bream_smelt[:5])
print(decisions)
from scipy.special import expit
print(expit(decisions))
lr=LogisticRegression(C=20,max_iter=1000)
lr.fit(train_scaled,train_target)
print(lr.score(train_scaled,train_target))
print(lr.score(test_scaled,test_target))
print(lr.classes_)
print(lr.predict(test_scaled[:5]))
proba=lr.predict_proba(test_scaled[:5])
print(np.round(proba,decimals=3))
5개 샘플에 대한 예측(행)
7개 생선에 대한 확률(열)
K최근접이웃에서는 확률이 0, 1/3, 2/3, 1 이산적)
로지스틱회귀 이중분류에서는 도미와 빙어에 대한 확률만 출력)
print(lr.coef_,lr.intercept_)
print(lr.coef_.shape,lr.intercept_.shape)
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))
참고문헌:혼공머신