본문 바로가기
Programming/Python

[ML] Logistic regression

import pandas as pd

fish = pd.read_csv('https://bit.ly/fish_csv')
fish.Species.unique()  # species 중복없이 나열
pd.unique(fish['Species']  # 또는 이런 코드 사용

array(['Bream', 'Roach', 'Whitefish', 'Parkki', 'Perch', 'Pike', 'Smelt'],      dtype=object)

 

생선 종류는 target. 나머지는 features(weight, length, diagonal, height, width)

 

 

 

머신러닝을 위해 feature data -> numpy 변환

fish_input = fish[['Weight','Length','Diagonal','Height','Width']].to_numpy()
print('fish_input.shape : ',fish_input.shape) # mtx 크기 출력
print(fish_input[:5])  # 첫 5개만 출력

fish_input.shape :  (159, 5)
[[242.      25.4     30.      11.52     4.02  ]
 [290.      26.3     31.2     12.48     4.3056]
 [340.      26.5     31.1     12.3778   4.6961]
 [363.      29.      33.5     12.73     4.4555]
 [430.      29.      34.      12.444    5.134 ]]

 

머신러닝을 위해 target data -> numpy 변환 후 split

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)

 

전처리(표준정규화) : scale match 작업

from sklearn.preprocessing import StandardScaler

ss = StandardScaler()
ss.fit(train_input)
train_scaled = ss.transform(train_input)  # train data기준임을 유의한다!
test_scaled = ss.transform(test_input)

 

KN 근방 알고리즘으로 생선 종류별 확률 예측

from sklearn.neighbors import KNeighborsClassifier

kn = KNeighborsClassifier(n_neighbors=3)
kn.fit(train_scaled, train_target)

print('Train Data 정확도(Accuracy) ', kn.score(train_scaled, train_target))
print('Test  Data 정확도(Accuracy) ', kn.score(test_scaled, test_target))

Train Data 정확도(Accuracy)  0.8907563025210085
Test  Data 정확도(Accuracy)  0.85

 

 

클래스 종류(생선 종류) 출력

print(kn.classes_)  # underbar_ 존재 의미는 원본에 없는 무언가 학습한 결과물이라는 의미이다.

['Bream' 'Parkki' 'Perch' 'Pike' 'Roach' 'Smelt' 'Whitefish']

 

 

 

처음 5개 test sample에 대한 클래스 예측(단순 임의 샘플 5개 추출)

print(kn.predict(test_scaled[:5]))

['Perch' 'Smelt' 'Pike' 'Perch' 'Perch']

 

이렇게 5개 나옴

 

 

 

prdict_proba() 로 확률 추정

import numpy as np

proba = kn.predict_proba(test_scaled[:5])
print(np.round(proba, decimals=4))

[[0.     0.     1.     0.     0.     0.     0.    ]
 [0.     0.     0.     0.     0.     1.     0.    ]
 [0.     0.     0.     1.     0.     0.     0.    ]
 [0.     0.     0.6667 0.     0.3333 0.     0.    ]
 [0.     0.     0.6667 0.     0.3333 0.     0.    ]]

 

col은 각 class. row는 하나하나의 샘플이다.

즉 1st row의 경우, 3열만 100%이다. 이는 1st row sample = Perch  로 예측되었고 그 확률이 100%라는 의미이다.

위 predict 함수 순서대로 각 row는 확률 결과에 따라 순서대로 ['Perch' 'Smelt' 'Pike' 'Perch' 'Perch']로 예측되었다.

 

 

4번째(5번째) 확률이 나뉜 이유는 3개 근방 결과에 의한 것이다.

print('test_scaled[3:4] \n ', test_scaled[3:4])
distances, indexes = kn.kneighbors(test_scaled[3:4])
print('test_scaled[3:4].indexes = ', indexes)
print('test_scaled[3:4].distances = ', indexes)
print(train_target[indexes])

test_scaled[3:4] 
  [[-0.34698097 -0.23396068 -0.22320459 -0.11905019 -0.12233464]]
test_scaled[3:4].indexes =  [[104 115 106]]
test_scaled[3:4].distances =  [[104 115 106]]
[['Roach' 'Perch' 'Perch']]  <- 근방이 이렇기에 3등분된 확률 출력

 

 

 

 

Logistic regressioni (로지스틱회귀): 분류 모형. 선형 방정식 학습. 인공신경망(딥러닝)의 기본바탕

                                                          이름은 회귀이지만 실질적으로는 분류 알고리즘이다.

  • z=a특성1+b특성2+c*특성3+d where z in [0, 1] 확률
  • z in [0, 1] 을 위해 Sigmoid function(시그모이드 함수, 로지스틱함수)로 0~1사이의 값 확률로 변환
  • 변환이 없으면 그냥 선형회귀이다.

* 시그모이드: 그래프가 s자 모양이여서 시그모이드라 부름

변환 전 z > 0   ->  양성 의미.  z < 0   ->  음성 의미 (변환없이 파악하는 경우). 판단 기준은 z=0.5이다.

z가 음수이면 함수는 0에, 양수이면 1에 가까워진다.

 

sigmoid function and general graph

 

 

로지스틱 회귀로 이진 분류 (0.5 넘으면 A, 적으면 B 클래스로 판단)

* 딱 0.5인 경우, 사이킷 런 패키지는 음성클래스로 판단한다.

 

도미(Bream), 빙어(smelt)만 추출하는 train set 형성

bream_smelt_indexes = (train_target == 'Bream') | (train_target == 'Smelt') 
# Bream, Smelt만 True로 인식하는 인덱스, 비트연산자(| = or)로 연결
print('bream_smelt_indexes = ', bream_smelt_indexes)

bream_smelt_indexes =  [ True False  True False False False False  True False False False  True
 False False False  True  True False False  True False  True False False
 False  True False False  True False False False False  True False False
  True  True False False False False False  True False False False False
 False  True False  True False False  True False False False  True False
 False False False False False  True False  True False False False False
 False False False False False  True False  True False False  True  True
 False False False  True False False False False False  True False False
 False  True False  True False False  True  True False False False False
 False False False False  True  True False False  True False False]

train_bream_smelt = train_scaled[bream_smelt_indexes] 
# 도미와 빙어 Train Feature(Weight, length, Diagonal, Height, Width) Data 스케일
print('train_bream_smelt = ', train_bream_smelt)

train_bream_smelt =  [[ 0.91965782  0.60943175  0.81041221  1.85194896  1.00075672]
 [-1.0858536  -1.68646987 -1.70848587 -1.70159849 -2.0044758 ]
 [ 0.63818253  0.56257661  0.73223951  1.64473401  0.50705737]
 [ 0.30041219  0.23459067  0.42823457  1.36042157  0.22329758]
 [ 0.9027693   0.70314202  0.88858491  1.89027545  0.85537174]
 [-1.0824759  -1.61150165 -1.62162731 -1.7000674  -1.92815631]
 [ 0.10337949  0.04717013  0.23714575  0.88445197  0.41799764]
 [ 1.49668216  1.03112796  1.21864741  2.44274986  1.40289707]
 [ 0.23004337  0.23459067  0.42823457  1.3336029   0.39983213]
 [-0.42579405 -0.29018684 -0.11028847  0.65627104 -0.26107519]
 [ 1.28557569  0.70314202  0.89727076  1.98228866  1.06683526]
 [ 0.93373158  0.60943175  0.83646978  1.85150445  0.97832415]
 [ 0.80706771  0.60943175  0.81041221  1.63137406  1.0255057 ]
 [-1.07262426 -1.52716241 -1.55214047 -1.67235972 -1.86207776]
 [ 1.6374198   1.17169337  1.27076255  2.41341232  1.40143407]
 [-1.07966115 -1.63961473 -1.67374245 -1.6462819  -1.87036806]
 [-1.05151362 -1.33037084 -1.39579507 -1.47914678 -1.45146425]
 [ 0.15967454  0.11276732  0.29794674  1.17051775  0.29205828]
 [ 1.56705098  1.17169337  1.32287768  2.16352457  1.17174409]
 [-0.00921063  0.1408804   0.3240043   0.94026245  0.14734384]
 [ 0.15967454  0.1408804   0.33269016  1.26991474  0.24109734]
 [-0.14994827  0.32830094  0.52377898  1.24719543  0.3806913 ]
 [-0.08520896  0.04717013  0.19371647  0.95507939  0.00439718]
 [ 0.86336276  0.42201121  0.62800925  1.5003429   0.45670601]
 [ 0.30041219  0.11276732  0.28057503  1.31303204  0.50608204]
 [-1.07262426 -1.45219419 -1.51739705 -1.62627903 -1.94607798]
 [ 0.82114147  0.51572148  0.68881023  1.76102232  0.5621025 ]
 [-1.07937967 -1.54590446 -1.56951218 -1.64420753 -2.01154694]
 [-1.07937967 -1.62087268 -1.63899902 -1.67413775 -1.93303295]
 [-0.29068592 -0.2058476  -0.0060582   0.89334213 -0.08697896]
 [-1.05095067 -1.26477365 -1.30893652 -1.46447801 -1.56606541]
 [ 0.51151865  0.51572148  0.7148678   1.54738669  0.68347   ]
 [ 0.58188748  0.32830094  0.51509312  1.50439286  0.4404302 ]]

target_bream_smelt = train_target[bream_smelt_indexes] #  Train Target Data(도미, 빙어)
print('target_bream_smelt = ', target_bream_smelt)

target_bream_smelt =  ['Bream' 'Smelt' 'Bream' 'Bream' 'Bream' 'Smelt' 'Bream' 'Bream' 'Bream'
 'Bream' 'Bream' 'Bream' 'Bream' 'Smelt' 'Bream' 'Smelt' 'Smelt' 'Bream'
 'Bream' 'Bream' 'Bream' 'Bream' 'Bream' 'Bream' 'Bream' 'Smelt' 'Bream'
 'Smelt' 'Smelt' 'Bream' 'Smelt' 'Bream' 'Bream']

 

 

 

 

 

 

from sklearn.linear_model import LogisticRegression

lr = LogisticRegression()
lr.fit(train_bream_smelt, target_bream_smelt) # train target data 둘 다 훈련

print(lr.predict(train_bream_smelt[:5]))  # 첫 5개 샘플 추정
print(lr.predict_proba(train_bream_smelt[:5]))  # 5개 샘플 확률 세부내역 (도미, 빙어)
print(lr.classes_)  # 샘플에 해당되는 클래스 출력

['Bream' 'Smelt' 'Bream' 'Bream' 'Bream']

 

[[0.99759855 0.00240145]   <- 1열은 도미, 2열은 빙어. 1st row는 확률상 도미이다.
 [0.02735183 0.97264817]
 [0.99486072 0.00513928]
 [0.98584202 0.01415798]
 [0.99767269 0.00232731]]

 

['Bream' 'Smelt']   <- 2개 클래스만 나온다     # 'Bream'=0(음성 클래스) 'Smelt'=1(양성 클래스)

 

이걸로 로지스틱 회귀 이진분류는 완료되었으나 상세 과정을 아래에서 살펴보자

 

print('회귀계수 = ', lr.coef_)
print('절편 값  = ', lr.intercept_)

회귀계수 =  [[-0.4037798  -0.57620209 -0.66280298 -1.01290277 -0.73168947]]
절편 값  =  [-2.16155132]

 

위 회귀 계수값을 로지스틱 함수의 Z값으로 변경  by decision_function(대상) <- 양성 클래스에 대한 z값 반환

decisions = lr.decision_function(train_bream_smelt[:5])  # z값 구하기
print(decisions)

[-6.02927744  3.57123907 -5.26568906 -4.24321775 -6.0607117 ]

순서대로 Feature(Weight, length, Diagonal, Height, Width) 값이다.

 

from scipy.special import expit  # 시그모이드함수 호출

print(expit(decisions))  # exp()통한 분수계산보다 이게 더 안정적이다.

[0.00240145 0.97264817 0.00513928 0.01415798 0.00232731]

0.5를 기준으로 작으면 도미(bream), 크면 빙어(smelt)이다.

 

 

 

로지스틱 회귀로 다중 분류

  • C: 규제 제어 변수(크면 규제가 작아짐, deafult = 1)  <-> alpha in ridge(크면 규제도 커짐)    혼돈유의!
  • max_tier = 반복횟수 (default = 100)L2규제: 계수의 제곱을 규제하는 것  Ex) ridge 회귀, 로지스틱 다중분류 회귀
lr = LogisticRegression(C=20, max_iter=1000) # default 100만하면 반복횟수 부족하다는 경고가 뜬다.
lr.fit(train_scaled, train_target)  # 7개 생선이 모두 들은 전체 data 사용함을 주목!

print('C=20, max_iter=1000일때  train_data 학습의 정확도' ,lr.score(train_scaled, train_target))
print('C=20, max_iter=1000일때  test_data 학습의  정확도', lr.score(test_scaled, test_target))

C=20, max_iter=1000일때  train_data 학습의 정확도 0.9327731092436975
C=20, max_iter=1000일때  test_data 학습의  정확도 0.925

 

점수가 준수하다

 

 

  • 최적의 max_iter 횟수 찾기(for문 이용)
for c in range(10,100,10):
    for max_iter in range(100,1000,100):
        lr = LogisticRegression(C=c, max_iter=max_iter)
        lr.fit(train_scaled, train_target)

        print('C={}, max_iter={}일때  train_data 학습의 정확도: {}'.format(c, max_iter, lr.score(train_scaled, train_target)))
        print('C={}, max_iter={}일때  test_data 학습의  정확도: {}'.format(c, max_iter, lr.score(test_scaled, test_target  )))

매우 긴 출력결과이다.

더보기
C=10, max_iter=100일때  train_data 학습의 정확도: 0.9159663865546218
C=10, max_iter=100일때  test_data 학습의  정확도: 0.925
C=10, max_iter=200일때  train_data 학습의 정확도: 0.9159663865546218
C=10, max_iter=200일때  test_data 학습의  정확도: 0.925
C=10, max_iter=300일때  train_data 학습의 정확도: 0.9159663865546218
C=10, max_iter=300일때  test_data 학습의  정확도: 0.925
C=10, max_iter=400일때  train_data 학습의 정확도: 0.9159663865546218
C=10, max_iter=400일때  test_data 학습의  정확도: 0.925
C=10, max_iter=500일때  train_data 학습의 정확도: 0.9159663865546218
C=10, max_iter=500일때  test_data 학습의  정확도: 0.925
C=10, max_iter=600일때  train_data 학습의 정확도: 0.9159663865546218
C=10, max_iter=600일때  test_data 학습의  정확도: 0.925
C=10, max_iter=700일때  train_data 학습의 정확도: 0.9159663865546218
C=10, max_iter=700일때  test_data 학습의  정확도: 0.925
C=10, max_iter=800일때  train_data 학습의 정확도: 0.9159663865546218
C=10, max_iter=800일때  test_data 학습의  정확도: 0.925
C=10, max_iter=900일때  train_data 학습의 정확도: 0.9159663865546218
C=10, max_iter=900일때  test_data 학습의  정확도: 0.925
C=20, max_iter=100일때  train_data 학습의 정확도: 0.9327731092436975
C=20, max_iter=100일때  test_data 학습의  정확도: 0.925
C=20, max_iter=200일때  train_data 학습의 정확도: 0.9327731092436975
C=20, max_iter=200일때  test_data 학습의  정확도: 0.925
C=20, max_iter=300일때  train_data 학습의 정확도: 0.9327731092436975
C=20, max_iter=300일때  test_data 학습의  정확도: 0.925
C=20, max_iter=400일때  train_data 학습의 정확도: 0.9327731092436975
C=20, max_iter=400일때  test_data 학습의  정확도: 0.925
C=20, max_iter=500일때  train_data 학습의 정확도: 0.9327731092436975
C=20, max_iter=500일때  test_data 학습의  정확도: 0.925
C=20, max_iter=600일때  train_data 학습의 정확도: 0.9327731092436975
C=20, max_iter=600일때  test_data 학습의  정확도: 0.925
C:\Users\Seward Shin\anaconda3\Lib\site-packages\sklearn\linear_model\_logistic.py:458: ConvergenceWarning: lbfgs failed to converge (status=1):
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.

Increase the number of iterations (max_iter) or scale the data as shown in:
    https://scikit-learn.org/stable/modules/preprocessing.html
Please also refer to the documentation for alternative solver options:
    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression
  n_iter_i = _check_optimize_result(
C:\Users\Seward Shin\anaconda3\Lib\site-packages\sklearn\linear_model\_logistic.py:458: ConvergenceWarning: lbfgs failed to converge (status=1):
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.

Increase the number of iterations (max_iter) or scale the data as shown in:
    https://scikit-learn.org/stable/modules/preprocessing.html
Please also refer to the documentation for alternative solver options:
    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression
  n_iter_i = _check_optimize_result(
C=20, max_iter=700일때  train_data 학습의 정확도: 0.9327731092436975
C=20, max_iter=700일때  test_data 학습의  정확도: 0.925
C=20, max_iter=800일때  train_data 학습의 정확도: 0.9327731092436975
C=20, max_iter=800일때  test_data 학습의  정확도: 0.925
C=20, max_iter=900일때  train_data 학습의 정확도: 0.9327731092436975
C=20, max_iter=900일때  test_data 학습의  정확도: 0.925
C=30, max_iter=100일때  train_data 학습의 정확도: 0.9663865546218487
C=30, max_iter=100일때  test_data 학습의  정확도: 0.925
C=30, max_iter=200일때  train_data 학습의 정확도: 0.9663865546218487
C=30, max_iter=200일때  test_data 학습의  정확도: 0.925
C=30, max_iter=300일때  train_data 학습의 정확도: 0.9663865546218487
C=30, max_iter=300일때  test_data 학습의  정확도: 0.925
C=30, max_iter=400일때  train_data 학습의 정확도: 0.9663865546218487
C=30, max_iter=400일때  test_data 학습의  정확도: 0.925
C=30, max_iter=500일때  train_data 학습의 정확도: 0.9663865546218487
C=30, max_iter=500일때  test_data 학습의  정확도: 0.925
C=30, max_iter=600일때  train_data 학습의 정확도: 0.9663865546218487
C=30, max_iter=600일때  test_data 학습의  정확도: 0.925
C=30, max_iter=700일때  train_data 학습의 정확도: 0.9663865546218487
C=30, max_iter=700일때  test_data 학습의  정확도: 0.925
C=30, max_iter=800일때  train_data 학습의 정확도: 0.9663865546218487
C=30, max_iter=800일때  test_data 학습의  정확도: 0.925
C=30, max_iter=900일때  train_data 학습의 정확도: 0.9663865546218487
C=30, max_iter=900일때  test_data 학습의  정확도: 0.925
C:\Users\Seward Shin\anaconda3\Lib\site-packages\sklearn\linear_model\_logistic.py:458: ConvergenceWarning: lbfgs failed to converge (status=1):
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.

Increase the number of iterations (max_iter) or scale the data as shown in:
    https://scikit-learn.org/stable/modules/preprocessing.html
Please also refer to the documentation for alternative solver options:
    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression
  n_iter_i = _check_optimize_result(
C:\Users\Seward Shin\anaconda3\Lib\site-packages\sklearn\linear_model\_logistic.py:458: ConvergenceWarning: lbfgs failed to converge (status=1):
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.

Increase the number of iterations (max_iter) or scale the data as shown in:
    https://scikit-learn.org/stable/modules/preprocessing.html
Please also refer to the documentation for alternative solver options:
    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression
  n_iter_i = _check_optimize_result(
C=40, max_iter=100일때  train_data 학습의 정확도: 0.9663865546218487
C=40, max_iter=100일때  test_data 학습의  정확도: 0.925
C=40, max_iter=200일때  train_data 학습의 정확도: 0.9663865546218487
C=40, max_iter=200일때  test_data 학습의  정확도: 0.925
C=40, max_iter=300일때  train_data 학습의 정확도: 0.9663865546218487
C=40, max_iter=300일때  test_data 학습의  정확도: 0.925
C=40, max_iter=400일때  train_data 학습의 정확도: 0.9663865546218487
C=40, max_iter=400일때  test_data 학습의  정확도: 0.925
C=40, max_iter=500일때  train_data 학습의 정확도: 0.9663865546218487
C=40, max_iter=500일때  test_data 학습의  정확도: 0.925
C=40, max_iter=600일때  train_data 학습의 정확도: 0.9663865546218487
C=40, max_iter=600일때  test_data 학습의  정확도: 0.925
C=40, max_iter=700일때  train_data 학습의 정확도: 0.9663865546218487
C=40, max_iter=700일때  test_data 학습의  정확도: 0.925
C=40, max_iter=800일때  train_data 학습의 정확도: 0.9663865546218487
C=40, max_iter=800일때  test_data 학습의  정확도: 0.925
C=40, max_iter=900일때  train_data 학습의 정확도: 0.9663865546218487
C=40, max_iter=900일때  test_data 학습의  정확도: 0.925
C=50, max_iter=100일때  train_data 학습의 정확도: 0.9747899159663865
C=50, max_iter=100일때  test_data 학습의  정확도: 0.925
C=50, max_iter=200일때  train_data 학습의 정확도: 0.9747899159663865
C=50, max_iter=200일때  test_data 학습의  정확도: 0.925
C=50, max_iter=300일때  train_data 학습의 정확도: 0.9747899159663865
C=50, max_iter=300일때  test_data 학습의  정확도: 0.925
C=50, max_iter=400일때  train_data 학습의 정확도: 0.9747899159663865
C=50, max_iter=400일때  test_data 학습의  정확도: 0.925
C=50, max_iter=500일때  train_data 학습의 정확도: 0.9747899159663865
C=50, max_iter=500일때  test_data 학습의  정확도: 0.925
C=50, max_iter=600일때  train_data 학습의 정확도: 0.9747899159663865
C=50, max_iter=600일때  test_data 학습의  정확도: 0.925
C=50, max_iter=700일때  train_data 학습의 정확도: 0.9747899159663865
C=50, max_iter=700일때  test_data 학습의  정확도: 0.925
C=50, max_iter=800일때  train_data 학습의 정확도: 0.9747899159663865
C=50, max_iter=800일때  test_data 학습의  정확도: 0.925
C=50, max_iter=900일때  train_data 학습의 정확도: 0.9747899159663865
C=50, max_iter=900일때  test_data 학습의  정확도: 0.925
C=60, max_iter=100일때  train_data 학습의 정확도: 0.9747899159663865
C=60, max_iter=100일때  test_data 학습의  정확도: 0.925
C=60, max_iter=200일때  train_data 학습의 정확도: 0.9747899159663865
C=60, max_iter=200일때  test_data 학습의  정확도: 0.925
C=60, max_iter=300일때  train_data 학습의 정확도: 0.9747899159663865
C=60, max_iter=300일때  test_data 학습의  정확도: 0.925
C=60, max_iter=400일때  train_data 학습의 정확도: 0.9747899159663865
C=60, max_iter=400일때  test_data 학습의  정확도: 0.925
C=60, max_iter=500일때  train_data 학습의 정확도: 0.9747899159663865
C=60, max_iter=500일때  test_data 학습의  정확도: 0.925
C:\Users\Seward Shin\anaconda3\Lib\site-packages\sklearn\linear_model\_logistic.py:458: ConvergenceWarning: lbfgs failed to converge (status=1):
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.

Increase the number of iterations (max_iter) or scale the data as shown in:
    https://scikit-learn.org/stable/modules/preprocessing.html
Please also refer to the documentation for alternative solver options:
    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression
  n_iter_i = _check_optimize_result(
C:\Users\Seward Shin\anaconda3\Lib\site-packages\sklearn\linear_model\_logistic.py:458: ConvergenceWarning: lbfgs failed to converge (status=1):
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.

Increase the number of iterations (max_iter) or scale the data as shown in:
    https://scikit-learn.org/stable/modules/preprocessing.html
Please also refer to the documentation for alternative solver options:
    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression
  n_iter_i = _check_optimize_result(
C=60, max_iter=600일때  train_data 학습의 정확도: 0.9747899159663865
C=60, max_iter=600일때  test_data 학습의  정확도: 0.925
C=60, max_iter=700일때  train_data 학습의 정확도: 0.9747899159663865
C=60, max_iter=700일때  test_data 학습의  정확도: 0.925
C=60, max_iter=800일때  train_data 학습의 정확도: 0.9747899159663865
C=60, max_iter=800일때  test_data 학습의  정확도: 0.925
C=60, max_iter=900일때  train_data 학습의 정확도: 0.9747899159663865
C=60, max_iter=900일때  test_data 학습의  정확도: 0.925
C=70, max_iter=100일때  train_data 학습의 정확도: 0.9747899159663865
C=70, max_iter=100일때  test_data 학습의  정확도: 0.925
C=70, max_iter=200일때  train_data 학습의 정확도: 0.9747899159663865
C=70, max_iter=200일때  test_data 학습의  정확도: 0.925
C=70, max_iter=300일때  train_data 학습의 정확도: 0.9747899159663865
C=70, max_iter=300일때  test_data 학습의  정확도: 0.925
C=70, max_iter=400일때  train_data 학습의 정확도: 0.9747899159663865
C=70, max_iter=400일때  test_data 학습의  정확도: 0.925
C=70, max_iter=500일때  train_data 학습의 정확도: 0.9747899159663865
C=70, max_iter=500일때  test_data 학습의  정확도: 0.925
C=70, max_iter=600일때  train_data 학습의 정확도: 0.9747899159663865
C=70, max_iter=600일때  test_data 학습의  정확도: 0.925
C=70, max_iter=700일때  train_data 학습의 정확도: 0.9747899159663865
C=70, max_iter=700일때  test_data 학습의  정확도: 0.925
C=70, max_iter=800일때  train_data 학습의 정확도: 0.9747899159663865
C=70, max_iter=800일때  test_data 학습의  정확도: 0.925
C=70, max_iter=900일때  train_data 학습의 정확도: 0.9747899159663865
C=70, max_iter=900일때  test_data 학습의  정확도: 0.925
C=80, max_iter=100일때  train_data 학습의 정확도: 0.9747899159663865
C=80, max_iter=100일때  test_data 학습의  정확도: 0.925
C=80, max_iter=200일때  train_data 학습의 정확도: 0.9747899159663865
C=80, max_iter=200일때  test_data 학습의  정확도: 0.925
C=80, max_iter=300일때  train_data 학습의 정확도: 0.9747899159663865
C=80, max_iter=300일때  test_data 학습의  정확도: 0.925
C=80, max_iter=400일때  train_data 학습의 정확도: 0.9747899159663865
C=80, max_iter=400일때  test_data 학습의  정확도: 0.925
C=80, max_iter=500일때  train_data 학습의 정확도: 0.9747899159663865
C=80, max_iter=500일때  test_data 학습의  정확도: 0.925
C=80, max_iter=600일때  train_data 학습의 정확도: 0.9747899159663865
C=80, max_iter=600일때  test_data 학습의  정확도: 0.925
C:\Users\Seward Shin\anaconda3\Lib\site-packages\sklearn\linear_model\_logistic.py:458: ConvergenceWarning: lbfgs failed to converge (status=1):
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.

Increase the number of iterations (max_iter) or scale the data as shown in:
    https://scikit-learn.org/stable/modules/preprocessing.html
Please also refer to the documentation for alternative solver options:
    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression
  n_iter_i = _check_optimize_result(
C=80, max_iter=700일때  train_data 학습의 정확도: 0.9747899159663865
C=80, max_iter=700일때  test_data 학습의  정확도: 0.925
C=80, max_iter=800일때  train_data 학습의 정확도: 0.9747899159663865
C=80, max_iter=800일때  test_data 학습의  정확도: 0.925
C=80, max_iter=900일때  train_data 학습의 정확도: 0.9747899159663865
C=80, max_iter=900일때  test_data 학습의  정확도: 0.925
C=90, max_iter=100일때  train_data 학습의 정확도: 0.9831932773109243
C=90, max_iter=100일때  test_data 학습의  정확도: 0.925
C=90, max_iter=200일때  train_data 학습의 정확도: 0.9831932773109243
C=90, max_iter=200일때  test_data 학습의  정확도: 0.925
C=90, max_iter=300일때  train_data 학습의 정확도: 0.9831932773109243
C=90, max_iter=300일때  test_data 학습의  정확도: 0.925
C=90, max_iter=400일때  train_data 학습의 정확도: 0.9831932773109243
C=90, max_iter=400일때  test_data 학습의  정확도: 0.925
C=90, max_iter=500일때  train_data 학습의 정확도: 0.9831932773109243
C=90, max_iter=500일때  test_data 학습의  정확도: 0.925
C=90, max_iter=600일때  train_data 학습의 정확도: 0.9831932773109243
C=90, max_iter=600일때  test_data 학습의  정확도: 0.925
C:\Users\Seward Shin\anaconda3\Lib\site-packages\sklearn\linear_model\_logistic.py:458: ConvergenceWarning: lbfgs failed to converge (status=1):
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.

Increase the number of iterations (max_iter) or scale the data as shown in:
    https://scikit-learn.org/stable/modules/preprocessing.html
Please also refer to the documentation for alternative solver options:
    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression
  n_iter_i = _check_optimize_result(
C=90, max_iter=700일때  train_data 학습의 정확도: 0.9831932773109243
C=90, max_iter=700일때  test_data 학습의  정확도: 0.925
C=90, max_iter=800일때  train_data 학습의 정확도: 0.9831932773109243
C=90, max_iter=800일때  test_data 학습의  정확도: 0.925
C=90, max_iter=900일때  train_data 학습의 정확도: 0.9831932773109243
C=90, max_iter=900일때  test_data 학습의  정확도: 0.925

 

 

 

 

 

임의 첫 5개 sample에 대한 예측 확률에 대해 알아보자.

print(lr.predict(test_scaled[:5]))

['Perch' 'Smelt' 'Pike' 'Roach' 'Perch']

 

 

각 고기의 확률이 어찌 예측되었길래 이런 결과가 나왔는지 보자

proba = lr.predict_proba(test_scaled[:5])
print(lr.classes_)   # 각 col class 파악
print(np.round(proba, decimals=3))

['Bream' 'Parkki' 'Perch' 'Pike' 'Roach' 'Smelt' 'Whitefish']

[[0.    0.003 0.959 0.    0.037 0.001 0.001]     -> Perch
 [0.    0.    0.013 0.    0.001 0.985 0.   ]            -> Smelt
 [0.    0.    0.006 0.823 0.001 0.17  0.   ]         -> Pike
 [0.002 0.026 0.142 0.002 0.716 0.    0.112]   -> Roach
 [0.    0.    0.968 0.001 0.03  0.001 0.   ]]    -> Perch

 

 

다중분류 선형방정식 coefficient와 intercept

print('lr.coef_.shape = ', lr.coef_.shape) # 회귀계수 값의 모양
print('lr.coef_ \n', lr.coef_) # 각행의 회귀계수

lr.coef_.shape =  (7, 5)   <- 7개 클래스와 feature 5개 사용하는 data이기 때문
lr.coef_ 
 [[-1.48986217 -1.02993738  2.59442523  7.70317852 -1.20029196]
 [ 0.19634317 -2.00935252 -3.78045585  6.50474233 -1.99514592]
 [ 3.56250912  6.34406973 -8.4900971  -5.75745418  3.79323748]
 [-0.1050809   3.60284123  3.93066839 -3.61707744 -1.75102734]
 [-1.40030385 -6.07531395  5.25937344 -0.87220402  1.86069287]
 [-1.38523809  1.49231584  1.39234448 -5.67720457 -4.4010109 ]
 [ 0.62163272 -2.32462296 -0.90625859  1.71601937  3.69354577]]

 

 

print('lr.intercept_.shape = ', lr.intercept_.shape) # 절편값의 모양
print('lr.intercept_ \n',lr.intercept_) # 각행의 절편값

lr.intercept_.shape =  (7,)
lr.intercept_ 
 [-0.09220027 -0.26297954  3.25070805 -0.14650445  2.65466181 -6.78781452 1.38412892]

 

 

 

sigmoid: 하나 선형 방정식 출력값 in [0, 1] -> 이진분류에 사용

softmax(정규화된 지수함수): 여러 선형 방정식 출력값 in [0, 1], 전체 합 = 1.  -> 다중분류에 사용

 

 

decision_function()으로 z값 도출후 softmax 적용하기

decision = lr.decision_function(test_scaled[:5]) 
print(np.round(decision, decimals=2))

[[-10.62   1.42   7.31  -2.89   4.04   0.4    0.35]
 [-17.55   1.92   6.44  -1.86   4.22  10.77  -3.93]
 [ -7.27  -9.97   4.05   9.04   2.4    7.46  -5.71]
 [ -1.45   1.26   2.96  -1.42   4.58  -8.66   2.73]
 [-10.56  -2.98   7.88   0.44   4.41   1.24  -0.42]]

 

원본 z값 출력!

 

from scipy.special import softmax

proba = softmax(decision, axis=1)  # axis=1로 각 샘플에 대한 계산유도
print(np.round(proba, decimals=3))

[[0.    0.003 0.959 0.    0.037 0.001 0.001]
 [0.    0.    0.013 0.    0.001 0.985 0.   ]
 [0.    0.    0.006 0.823 0.001 0.17  0.   ]
 [0.002 0.026 0.142 0.002 0.716 0.    0.112]
 [0.    0.    0.968 0.001 0.03  0.001 0.   ]]

 

 

위에서 출력한 확률값과 동일!

728x90
반응형