→ 분류 알고리즘을 통해 클래스별 확률을 예측하자!
특정값의 확률 → K-최근접 이웃을 통해 주변 이웃을 찾으면 이웃의 클래스 비율을 확률이라고 출력하면 되지않을까?
데이터 준비하기
import pandas as pd
fish = pd.read_csv("<https://bit.ly/fish_csv>")
fish.head()
print(pd.unique(fish["Species"])) #species 열에서 고유한 값을 추출 -> 어떤 종류의 생선이 있는가
fish_input = fish[["Weight" , "Length" , "Diagonal", "Height" , "Width"]].to_numpy() #데이터프레임에서 원하는 열을 리스트로 나열함 -> 데이터 프레임에서 열 선택
print(fish_input[:5])
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)
k-최근접 이웃 분류기의 확률 예측
from sklearn.neighbors import KNeighborsClassifier #KNeighborsClassifier 클래스객체 만들고 훈련세트로 모델 훈련
kn = KNeighborsClassifier(n_neighbors=3) #최근접 이웃개수k=3
kn.fit(train_scaled , train_target)
print(kn.score(train_scaled , train_target))
print(kn.score(test_scaled , test_target))
print(kn.classes_)
print(kn.predict(test_scaled[:5])) #타깃값으로 예측을 출력함
import numpy as np
proba = kn.predict_proba(test_scaled[:5]) #메서드의 출력 순서는 classes_ 의 속성과 같음
print(np.round(proba, decimals=4))
∴ 해당 모델이 계산한 확률이 가장 가까운 이웃의 비율
distances , indexes = kn.kneighbors(test_scaled[3:4])
print(train_target[indexes])
시그모이드 함수 : 하나의 선형 방정식의 출력값을 0~1 사이값으로 압축함
z는 확률값이므로 아주 큰 음수일때 0이 되고, 아주 큰 양수일때 1이 되도록 하는 방법
import numpy as np #넘파이를 이용해 그래프 그리기
import matplotlib.pyplot as plt
z = np.arange(-5 , 5 , 0.1) #z의 위치에 따라 시그모이드 함수 계산하기
phi = 1/(1+np.exp(-z))
plt.plot(z,phi)
plt.show()
∴ 이진분류 → 0.5 보다 크면 양성 클래스, 0.5보다 작으면 음성 클래스