데이터 준비
# 데이터 불러오기
import pandas as pd
fish = pd.read_csv('<https://bit.ly/fish_csv_data>')
# Species 열에서 고유한 값 추출
print(pd.unique(fish['Species']))
# Species 열을 타깃으로 만들고, 나머지 5개 열은 입력 데이터로 사용
fish_input = fish[['Weight','Length','Diagonal','Height','Width']].to_numpy()
# 타깃 데이터 만들기
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)
# 훈련 세트와 테스트 세트를 표준화 전처리
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
ss.fit(train_input)
train_scaled = ss.transform(train_input)
test_scaled = ss.transform(test_input)
※ pd.unique() : 특정 열에서 고유한 값 추출
※ to_numpy() : 넘파이 배열로 바꾸어 저장
※ StandardScaler 클래스 : 사이킷런의 표준화 전처리해서 변환해줌
k-최근접 이웃 분류기의 확률 예측
이중 분류 : 타깃 데이터에 2개의 클래스가 포함된 문제
다중 분류 : 타깃 데이터에 2개 이상의 클래스가 포함된 문제
⇒ 사이킷런에서는 문자열로 된 타깃값을 그대로 사용 가능
타깃값을 그대로 사이킷런 모델에 전달하면 순서가 자동으로 알파벳 순으로 매겨짐
⇒ pd.unique()로 출력했던 순서와 다름 !
⇒ KNeighborsClassifier에서 정렬된 타깃값은 classes_ 속성에 저장
# KNeighborsClassifier에서 정렬된 타깃값 출력
print(kn.classes_)
# 테스트 세트에 있는 처음 5개 샘플의 타깃값을 예측
print(kn.predict(test_scaled[:5]))
# 테스트 세트에 있는 처음 5개 샘플의 타깃 클래스별 확률 출력
import numpy as np
proba = kn.predict_proba(test_scaled[:5])
print(np.round(proba,decimals=4))
# 4번째 샘플의 가까운 이웃의 비율 확인
distances, indexes = kn.kneighbors(test_scaled[3:4]) # numpy 배열의 슬라이싱 연산자 : 항상 2차원 배열이 만들어짐
print(train_target[indexes])
※ classes_ : 정렬된 타깃값 출력
※ predict() : 예측한 타깃값 출력
※ predict_proba() : 클래스별 예측 확률값 반환
※ np.round() : decimals 매개변수로 유지할 소수점 아래 자릿수를 지정해서 반올림 (기본값 : 소수점 첫째 자리)