시작하며, 알릴 부분이 있어 작성합니다. 그대로 따라하실 수 있게 전부 작성하면 좋겠지만 교재에서 사용되는 데이터를 가져오는 것까지 제가 적어드린다면 저자에게 혹시나 폐를 끼칠까봐 앞으로는 정확한 데이터 전체 또는 데이터의 주소를 기입하는 부분은 마스킹하거나 생략하도록 하겠습니다. 앞에 3개 단원 정도는 마치 맛보기 처럼 오히려 괜찮지 않나? 싶은 마음으로 수정은 안했습니다. 혹시 저자 당사자나 관련자 분들이 문제라고 느끼신다면 댓글이나 다른 채널로 연락주시면 바로 수정하겠습니다.
박해선님이 작성한 혼자공부하는 머신러닝 + 딥러닝 을 공부한 내용이 colab에도 있지만 복습차원에서 포스트하고 있습니다.
이번 단원에서는 물고기 중 하나를 찍었을때 그게 어떤 종일까? 분류하는 것으로 시작합니다. 데이터를 불러오겠습니다.
import pandas as pd
fish = pd.read_csv('데이터의 위치는 책을 구매하시면 보실 수 있어요!')
fish.head()
print(pd.unique(fish['Species']))
![]() ['Bream' 'Roach' 'Whitefish' 'Parkki' 'Perch' 'Pike' 'Smelt'] |
fish는 7종의 물고기의 특성이 들어 있는 데이터라는 것을 확인하실 수 있고, pandas 데이터를 sklearn라이브러리에서 사용할 수 있도록 numpy에서 지원하는 배열형태로 변경합니다.
fish_input = fish[['Weight', 'Length', 'Diagonal','Height', 'Width']].to_numpy()
print(fish_input[: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 ]] |
이제 잘 정제된 데이터를 훈련세트와 테스트 세트로 나눈 뒤 표준화 후 K-최근접이웃 알고리즘으로 학습 후 훈련세트와 테스트 세트의 스코어(결정계수)를 측정해봅니다.


K-최근접이웃 알고리즘에서 3개 이웃을 기준으로 분류하여 임의의 물고기를 선택했을때 그것이 어떤물고기일지를 연산했더니, 1/3의 배수로만 결과가 나옵니다. => 추가설명드리면 근접한 물고기가 Bream, Parkki, Perch라고 가정하면 예측확률은 각각 1/3이 되는 형태인 것이죠. 위에 5개만 뽑아온 것을 보시면 처음 세 마리에는 가장가까운 3마리의 물고기가 모두 같은 종으로 3마리씩 있던 것이고 4번째는 Perch가 2마리, roach가 1마리가 있었다는 것입니다.

이번에는 도미와 빙어만 걸러내겠습니다.
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.classes_)
print(lr.predict_proba(train_bream_smelt[:5]))
| ['Bream' 'Smelt' 'Bream' 'Bream' 'Bream'] ['Bream' 'Smelt'] [[0.99760007 0.00239993] [0.02737325 0.97262675] [0.99486386 0.00513614] [0.98585047 0.01414953] [0.99767419 0.00232581]] |
결과값을 순서대로 해석하자면,
lr.predict(train_bream_smelt[:5])) => 도미와 빙어로만 이루어진 데이터 내에서 5개를 뽑았을때 순서대로 도미, 빙어, 도미, 도미, 도미라고 예측을 했습니다.
lr.classes => target 데이터에는 bream과 smelt가 있고 bream이 음성클래스, smelt가 양성클래스라는 의미예요. (순서에 따른 의미가 있습니다.)
lr.predict_proba(train_bream_smelt[:5]) => 5마리에 대해서 [Bream일 확률, smelt일 확률] 배열을 가진 이중배열을 연산합니다. 더높은 쪽이 가장 앞선 결과에서 나온 값이 된 것입니다.
lr.decision_function 함수로 z값을 직접 구하고 scipy.special의 expit를 통해 시그모이드 함수를 통과시켜 양성클래스의 확률과 동일한 결과를 도출해낼 수도 있습니다.
두 개 내에서만 예측을 한 것이고, 이제 여러개에서 분류를 수행해봅니다.
# 로지스틱 화귀로 다중 분류 수행하기
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))
# 0.9327731092436975
# 0.925
# 결과가 과대나 과소적합이 아니고, 결정계수가 아주 높지는 않지만 꽤 괜찮습니다.
print(lr.predict(test_scaled[:5]))
# ['Perch' 'Smelt' 'Pike' 'Roach' 'Perch'] # 가장 앞 5개 데이터에 대한 예측결과입니다.
proba = lr.predict_proba(test_scaled[:5])
print(np.round(proba, decimals=3))
# 처음 5개에 대한 예측확률을 소수점 3자리 까지만 표현한 결과입니다.
# [[0. 0.014 0.842 0. 0.135 0.007 0.003]
# [0. 0.003 0.044 0. 0.007 0.946 0. ]
# [0. 0. 0.034 0.934 0.015 0.016 0. ]
# [0.011 0.034 0.305 0.006 0.567 0. 0.076]
# [0. 0. 0.904 0.002 0.089 0.002 0.001]]
print(lr.classes_)
print(lr.coef_.shape, lr.intercept_.shape)
# ['Bream' 'Parkki' 'Perch' 'Pike' 'Roach' 'Smelt' 'Whitefish']
# (7, 5) (7,)
# 7종류에 대해 각각 5가지 특성이 담겨 있어 변수가 5개인 방정식이 7개가 나옵니다.
decision = lr.decision_function(test_scaled[:5])
print(np.round(decision, decimals=2))
from scipy.special import softmax
proba = softmax(decision, axis=1)
print(np.round(proba, decimals=3))
# z값을 구하고,
# [[ -6.51 1.04 5.17 -2.76 3.34 0.35 -0.63]
# [-10.88 1.94 4.78 -2.42 2.99 7.84 -4.25]
# [ -4.34 -6.24 3.17 6.48 2.36 2.43 -3.87]
# [ -0.69 0.45 2.64 -1.21 3.26 -5.7 1.26]
# [ -6.4 -1.99 5.82 -0.13 3.5 -0.09 -0.7 ]]
# 각 z값에 대해서 시그모이드 함수에 multi로 각각 적용하는 softmax함수를 이용하여 확률을 구합니다.
# 아까 np.round(proba, decimals=3)로 구했던 확률과 동일함을 알 수 있습니다.
# [[0. 0.014 0.842 0. 0.135 0.007 0.003]
# [0. 0.003 0.044 0. 0.007 0.946 0. ]
# [0. 0. 0.034 0.934 0.015 0.016 0. ]
# [0.011 0.034 0.305 0.006 0.567 0. 0.076]
# [0. 0. 0.904 0.002 0.089 0.002 0.001]]
'AI > 머신러닝 | 딥러닝' 카테고리의 다른 글
| [혼공머신] 03-3 특성 공학과 규제 (다중회귀, 릿지, 라쏘) (0) | 2026.08.12 |
|---|---|
| [혼공머신] 03-2 선형 회귀 (0) | 2026.08.12 |
| [혼공머신] 03-1 k-최근접 이웃 회귀 (0) | 2026.08.12 |
| [머신러닝] 02-2 데이터 전처리 (0) | 2023.05.07 |
| [머신러닝] 02-1 훈련세트와 테스트 세트 (0) | 2023.04.16 |
























