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에 가까워진다.
로지스틱 회귀로 이진 분류 (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일때 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. ]]
위에서 출력한 확률값과 동일!
'Programming > Python' 카테고리의 다른 글
[DL] over(under)fitting 최적, Dropout, Callback (0) | 2023.09.20 |
---|---|
[ML] SGDClassifier (확률적 경사하강법 분류모형) (0) | 2023.09.17 |
[DL] tensorflow, Deep Neural Network(DNN) (0) | 2023.09.15 |
[Numpy] Linear algebra package (0) | 2023.09.13 |
[ML] Feature engineering, 다중회귀, 릿지회귀, 라쏘회귀 (0) | 2023.09.11 |