본문 바로가기
TIL - 외/빅데이터

[머신러닝] 로지스틱 회귀

by chaemj97 2023. 5. 7.
728x90

로지스틱 회귀

  • 선형 방정식을 사용한 분류 알고리즘
    • 범주형 변수를 예측
  • 선형 회귀처럼 계산한 값을 그대로 출력하는 것이 아니라 0~1 사이로 압축
    • 이진 분류 -> 시그모이드 함수
    • 다중 분류 -> 소프트맥스 함수
  • 기본적으로 릿지 회귀와 같이 계수의 제곱을 규제
    • L2 규제
    • C : 규제를 제어하는 매개변수
      • 작을수록 규제가 크다
      • 기본값 1

왼(시그모이드) 오(소프트맥스)


생선 데이터를 통해 어떤 생선인지 분류(7종류)

  • 데이터 가져오기
import pandas as pd

fish = pd.read_csv('https://bit.ly/fish_csv_data')
# 생선 종류
print(pd.unique(fish['Species']))
# ['Bream' 'Roach' 'Whitefish' 'Parkki' 'Perch' 'Pike' 'Smelt']
  • input 데이터와 target 데이터로 나누기
# target은 생선 종류인 Species
fish_target = fish['Species'].to_numpy()

# input은 나머지
fish_input = fish[['Weight','Length','Diagonal','Height','Width']].to_numpy()

to_numpy() 메서드로 넘파이 배열로 바꾸기

  • train 데이터와 test 데이터로 나누기 + 표준화
from sklearn.model_selection import train_test_split

# train과 test로 나누기 (0.75:0.25)
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)

 

이진 분류 (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)

# 결과 예측
print(lr.predict(train_bream_smelt[:5]))
# ['Bream' 'Smelt' 'Bream' 'Bream' 'Bream']

# 결과 확률 예측
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]]
'''

# 선형 방정식 만들기
print(lr.coef_, lr.intercept_)
# [[-0.4037798  -0.57620209 -0.66280298 -1.01290277 -0.73168947]] [-2.16155132]

선형 방정식

z = -0.40 x (Weight) -0.58 x (Length) -0.66 x (Diagonal) -1.01 x (Height) -0.73 x (Width) -2.16

  • z값 예측 + 확률 구하기
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]

양성 클래스의 z 값을 반환, 예측

 

다중 분류

  • 로지스틱 회귀
lr = LogisticRegression(C=20, max_iter=1000)
lr.fit(train_scaled, train_target)

print(lr.score(train_scaled, train_target)) # 0.93
print(lr.score(test_scaled, test_target)) #0.92

max_iter 매개변수에서 반복 횟수를 지정, 기본값 100

위 데이터셋을 사용해 모델을 훈련하면 반복 횟수가 부족하다는 경고가 발생해 반복 횟수를 1000으로 늘렸다.

  • 예측
# 예측
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]]
'''

# z값 계산 후 예측 확률 (소프트 맥스)
decision = lr.decision_function(test_scaled[:5])

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]]
'''
728x90
반응형

댓글