UOMOP

Logistic Regression(다중 분류 로지스틱 회귀) 본문

Ai/ML

Logistic Regression(다중 분류 로지스틱 회귀)

Happy PinGu 2022. 1. 27. 15:13
import pandas as pd

fish_df = pd.read_csv("http://bit.ly/fish_csv_data")

target_data = fish_df["Species"].to_numpy()
input_data = fish_df.drop("Species", axis = 1).to_numpy()
fish_df 데이터를 불러와서 Species 컬럼은 target, 나머지 컬럼은 input으로 만들어주었다.

from sklearn.model_selection import train_test_split

# 학습/검증 데이터 분리
train_input, test_input, train_target, test_target = train_test_split(input_data,
                                                           target_data, random_state = 42)
                                                                
from sklearn.preprocessing import StandardScaler


ss = StandardScaler()

# Scaling 정도 설정
ss.fit(train_input, train_target)

# Scaling
train_input_scaled = ss.transform(train_input)
test_input_scaled = ss.transform(test_input)
from sklearn.linear_model import LogisticRegression

lr = LogisticRegression(C = 20, max_iter = 1000)
LogisticRegression의 매개변수를 확인해보도록 하자.

로지스틱 회귀는 L2 노름 규제(가중치에 대해 가중치 제곱을 패널티로 주는 규제)를 하는 분류 알고리즘이다.
선형 회귀에서는 alpha를 키우면서 규제를 강화했다. 로지스틱 회귀에서는 C를 키우면 규제가 완화된다.

"C"는 분류 알고리즘에서 규제를 조절하는 매개변수이고, default value는 1이다.
"max_iter"는 반복 횟수를 뜻하고, default value는 100이다.\

해당 코드에서는 규제 강도를 완화시키기 위해서 C를 키웠다.

lr.fit(train_input_scaled, train_target)

print(lr.score(train_input_scaled, train_target))
print(lr.score(test_input_scaled, test_target))
0.9327731092436975
0.925
학습 셋과 검증 셋을 통해 score(정확도)를 확인해본 결과이다.

print(lr.predict(train_input_scaled[:5]))
['Bream' 'Pike' 'Smelt' 'Perch' 'Parkki']
train_input_scaled에서 앞에 5개의 샘플을 통해 예측을 진행해보았다.

proba = lr.predict_proba(train_input_scaled[:5])
print(proba.round(decimals = 3))
각 샘플에 대한 클래스 확률이다.
7개의 클래스가 어떤 순서로 정렬이 되었는지 모르겠다면 classes_메소드를 통해서 확인해 볼수 있다.

print(lr.classes_)
['Bream' 'Parkki' 'Perch' 'Pike' 'Roach' 'Smelt' 'Whitefish']
위 내용을 종합해서 확인해보면 확률이 가장 높을 종을 예측했다는 것을 확인할 수 있다.

print(lr.coef_)
print("")
print(lr.intercept_)
가중치를 확인해보면 7 * 5 행렬이 도출되는 것을 확인할 수 있다.
각 클래스에 대한 특성의 가중치가 도출된 것이다.
클래스가 7개 이기 때문에 각 클래스의 z도 7개가 출력될 것이다.

decision = lr.decision_function(train_input_scaled[:5])

print(decision.round(decimals = 2))
5개 샘플에 대한 z를 구했다.
특성이 7개 이므로 컬럼이 7개인 것을 확인할 수 있다.

다중 분류에서는 z를 확률로 변환시키기 위해 소프트맥스 함수를 사용한다.(시그모이드 함수X)

from scipy.special import softmax

proba = softmax(decision, axis = 1)
print(proba.round(decimals = 3))
print(lr.classes_)
['Bream' 'Parkki' 'Perch' 'Pike' 'Roach' 'Smelt' 'Whitefish']
print(lr.predict(train_input_scaled[:5]))
['Bream' 'Pike' 'Smelt' 'Perch' 'Parkki']
각 샘플에 대해 해당 클래스 일 확률을 행렬로 확인해보았다.
확인 결과 가장 높은 확률의 클래스로 예측되는 것을 확인할 수 있다.
Comments