AI/DL/ML(12) - Classification and probability

xsldihsl·2024년 5월 13일
0

AI/ML/DL

목록 보기
12/25

Contents

  1. k-NN classification with probabilities
  2. k-NN multiclass classification

1. k-NN classification with probabilities

이전에 k-NN 분류를 이용해 binary classes 를 나눈 것과 비슷하게 10개의 이웃한 채소 샘플들을 고려해보자. 만약 그 중 오이라는 class 가 3개 존재한다면 우리의 채소가 오이일 확률은 3/10 이다. 이처럼 채소의 Species 를 분류하기 위해 무게, 길이, 대각선, 높이, 그리고 두께의 총 다섯가지 특성을 참고해보자.

SpeciesWeightLengthDiagonalHeightWidth
Squash242.025.430.011.52004.0200
..................

Pandas 를 이용해 각각의 column 이 위와 같은 csv 파일을 읽어들이고 input 과 target 을 설정한다면, Species 가 유일한 target 이 되고 나머지가 input 이 되어야 한다. 이를 가장 간단히 extract 하기 위해서는 먼저 list 로 각 column 의 이름을 전달 후 numpy array 로 바꿔주는 방법이 있다.

veggie_input = veggie[[''Weight', 'Length', 'Diagonal', 'Height', 'Width']].to_numpy()
veggie_target = veggie['Species'].to_numpy()

2. k-NN multiclass classification

이후 train set 과 test set 을 나누고 표준화하여 데이터를 준비하였다면 k-NN classifier 를 한번 학습시켜볼텐데, 이때 이웃한 샘플의 개수를 3개로 지정해보자.

from sklearn.neighbors import KNeighborsClassifier

kn = KNeighborsClassifier(n_neighbors=3)
kn.fit(train_scaled, train_target)
print(kn.classes_) # ['Squash' 'Chili' 'Cucumber' 'Broccoli' 'Lettuce' 'Carrot' 'Cauliflower']
print(kn.predict(test_scaled[:5])) # ['Cucumber' 'Broccoli' 'Cucumber' 'Squash' 'Squash']

모델이 맞출 타깃으로는 string 으로 된 array 가 주어졌다. 다행히도 sklearn 은 문자열도 타깃값으로 받아들일 수 있고, 자체적으로 alphabetical order 를 따라 정수로 변환하기 때문에 문제가 되지 않는다. 이후 출력되는 class 의 값들 또한 정수가 아닌 string 으로 보여진다.

# Probability
import numpy as np

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

대부분의 sklearn 분류 모델들은 .predict_proba() method 를 제공한다. 이 함수를 이용해 첫 다섯 줄의 test_scaled 에 대한 확률들을 출력해보면 다음과 같다. 하지만 애초에 3개의 이웃만을 사용했으므로 가능한 확률로는 0 또는 1/3 또는 2/3 또는 3/3 뿐이다. 따라서 확률값이라기엔 너무 단순하므로 조금 더 합리적인 확률을 구할 수 있는 logistic regression 에 대해 다음 글에서 알아보도록 하겠다.


0개의 댓글