K 최근 방법(K-Nearest Neighbor) 분류 기초
11241 단어 초보자Python3MachineLearning
K근방법 (K-Nearest Neighbor) 개요
k 근방법(이하 k-NN)은 가장 단순한 분류 알고리즘이며, 예측하고자 하는 데이터와 거리가 가까운 k개의 훈련 데이터의 정답 라벨로부터 예측값을 결정하는 알고리즘이다.
<이점>
- 모델의 과도한 조정 없이 어느 정도의 정밀도가 나온다
- 알고리즘의 이해가 용이
<단점>
- 데이터 전처리 필수
- 특징 량 (수백 이상)이 많은 데이터 세트에서는 잘 작동하지 않습니다.
- 희소한 데이터 세트에서는 정밀도가 나오지 않음
- 처리 속도가 느림
상기 단점으로부터 실무상 별로 사용되는 것은 없다.
K-NN의 다음 2가지 중 분류(Classification)에 대해 본 기사에서는 정리한다.
분류: Nearest Neighbor Classification
예측을위한 Hyper Parameter는 다음과 같습니다.
참고 => sklearn
Parameters
상세
n_neighbors
알고리즘 결정에 사용되는 이웃 점 수 (default = 5)
weights
예측 판단에 사용되는 가중치 설정 (default="uniform")"uniform": 균일한 가중치 "distance": 거리에 따른 가중치
algorithm
예측을 위한 알고리즘
leaf_size
KD Tree, Ball Tree 알고리즘을 사용할 때 리프 크기
metric
거리 측정 방법 (default="minkowski)
p
Minkowski metric의 Power Parameter
n_jobs
사용할 CPU 수 설정 (default=1)
Cancer Dataset의 예측 분류
실제로 sklearn의 cancer dataset에서 분류 예측을 실시한다.
먼저 필요한 라이브러리를 읽습니다.
classfication_report는 예측값을 평가하는 데 사용됩니다.
#必要なライブラリの読み込み
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
#sklean cancer dataの読み込み
from sklearn.datasets import load_breast_cancer
Cancer DataSet에 대해 자세히 알아보십시오.
sklearn cancer dataset에는 설명 변수(특징량)가 30, 569인 데이터 포인트가 있다.
목적 변수 (라벨) 중 "0"이 악성 종양 (malignant), "1"이 양성 종양 (benign)을 나타낸다.
dataset = load_breast_cancer()
# 特徴量 (説明変数)
X = pd.DataFrame(dataset.data,
columns=dataset.feature_names)
#ラベル(目的変数)
y = pd.Series(dataset.target, name='y')
# データ詳細確認
print('X shape: (%i,%i)' %X.shape)
print(y.value_counts())
display(X.join(y).head())
실제로 훈련 데이터/테스트 데이터로 분할한 후 예측 정밀도를 확인한다.
하이퍼파라미터 중 근방 오브젝트수를 변수(1~10)로 하고, 예측 정밀도의 변화를 플롯한다.
from sklearn.neighbors import KNeighborsClassifier
#データセットをtest sampleを割合20%でホールドアウトする。
X_train, X_test, y_train, y_test = train_test_split(X,y, random_state=0, test_size=0.2)
#近傍オブジェクト数とその予測スコアを格納するリストを準備
List_n_neighbors = []
List_train_score = []
List_test_score = []
#近傍オブジェクト数を1-10で予測値を比較。訓練データに対してfitする。
for n_neighbors in range(1,11):
clf = KNeighborsClassifier(n_neighbors = n_neighbors).fit(X_train,y_train)
#訓練スコアと予測スコアを算出してリストに格納
List_n_neighbors.append(n_neighbors)
List_train_score.append(clf.score(X_train,y_train))
List_test_score.append(clf.score(X_test,y_test))
#近傍オブジェクト数に対して訓練スコア、テストスコアをプロットする
fig = plt.figure(figsize = (10,6))
plt.plot(List_n_neighbors, List_train_score, label = "training accuracy")
plt.plot(List_n_neighbors, List_test_score, label = "test accuracy")
plt.ylabel("Accuracy")
plt.xlabel("n_neighbors")
plt.xticks(np.linspace(1,11,11))
plt.legend()
요약
Cancer Dataset을 이용한 예측에 있어서는 근방 오브젝트수(k)가 k=6당이 최상의 성능인 것을 알 수 있다. 다만 K=2의 경우에서도 88% 정도의 정밀도가 담보되어 있어 특징량 30 정도의 Cancer Dataset에 관해서는 Nearest Neighbor Classification에 의한 분류는 충분히 기능하고 있다고 할 수 있다.
이하 classification_report에 의한 결과를 확인해도 재현률(recall), 적합률(precision) 모두 큰 편향 없이 정밀도를 유지하고 있는 것을 확인할 수 있다.
다만 실제로 실무상, 암의 진단에 사용할 수 있을까 하면 이하classification_report에 의한 결과를 확인하면 malignant 재현율(recall)의 정밀도로부터 악성 47건 중 3건 정도는 악성 종양(malignant)을 양성(benign)이라고 판단해 버리는 점에서 충분한 정밀도가 아니라고 생각된다.
clf = KNeighborsClassifier(n_neighbors = 6).fit(X_train,y_train)
predict_result = clf.predict(X_test)
print(classification_report(y_test,predict_result, target_names=["malignant","benign" ]))
Reference
이 문제에 관하여(K 최근 방법(K-Nearest Neighbor) 분류 기초), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/SAKA1231/items/55ac246401cc2582e4e2
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
실제로 sklearn의 cancer dataset에서 분류 예측을 실시한다.
먼저 필요한 라이브러리를 읽습니다.
classfication_report는 예측값을 평가하는 데 사용됩니다.
#必要なライブラリの読み込み
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
#sklean cancer dataの読み込み
from sklearn.datasets import load_breast_cancer
Cancer DataSet에 대해 자세히 알아보십시오.
sklearn cancer dataset에는 설명 변수(특징량)가 30, 569인 데이터 포인트가 있다.
목적 변수 (라벨) 중 "0"이 악성 종양 (malignant), "1"이 양성 종양 (benign)을 나타낸다.
dataset = load_breast_cancer()
# 特徴量 (説明変数)
X = pd.DataFrame(dataset.data,
columns=dataset.feature_names)
#ラベル(目的変数)
y = pd.Series(dataset.target, name='y')
# データ詳細確認
print('X shape: (%i,%i)' %X.shape)
print(y.value_counts())
display(X.join(y).head())
실제로 훈련 데이터/테스트 데이터로 분할한 후 예측 정밀도를 확인한다.
하이퍼파라미터 중 근방 오브젝트수를 변수(1~10)로 하고, 예측 정밀도의 변화를 플롯한다.
from sklearn.neighbors import KNeighborsClassifier
#データセットをtest sampleを割合20%でホールドアウトする。
X_train, X_test, y_train, y_test = train_test_split(X,y, random_state=0, test_size=0.2)
#近傍オブジェクト数とその予測スコアを格納するリストを準備
List_n_neighbors = []
List_train_score = []
List_test_score = []
#近傍オブジェクト数を1-10で予測値を比較。訓練データに対してfitする。
for n_neighbors in range(1,11):
clf = KNeighborsClassifier(n_neighbors = n_neighbors).fit(X_train,y_train)
#訓練スコアと予測スコアを算出してリストに格納
List_n_neighbors.append(n_neighbors)
List_train_score.append(clf.score(X_train,y_train))
List_test_score.append(clf.score(X_test,y_test))
#近傍オブジェクト数に対して訓練スコア、テストスコアをプロットする
fig = plt.figure(figsize = (10,6))
plt.plot(List_n_neighbors, List_train_score, label = "training accuracy")
plt.plot(List_n_neighbors, List_test_score, label = "test accuracy")
plt.ylabel("Accuracy")
plt.xlabel("n_neighbors")
plt.xticks(np.linspace(1,11,11))
plt.legend()
요약
Cancer Dataset을 이용한 예측에 있어서는 근방 오브젝트수(k)가 k=6당이 최상의 성능인 것을 알 수 있다. 다만 K=2의 경우에서도 88% 정도의 정밀도가 담보되어 있어 특징량 30 정도의 Cancer Dataset에 관해서는 Nearest Neighbor Classification에 의한 분류는 충분히 기능하고 있다고 할 수 있다.
이하 classification_report에 의한 결과를 확인해도 재현률(recall), 적합률(precision) 모두 큰 편향 없이 정밀도를 유지하고 있는 것을 확인할 수 있다.
다만 실제로 실무상, 암의 진단에 사용할 수 있을까 하면 이하classification_report에 의한 결과를 확인하면 malignant 재현율(recall)의 정밀도로부터 악성 47건 중 3건 정도는 악성 종양(malignant)을 양성(benign)이라고 판단해 버리는 점에서 충분한 정밀도가 아니라고 생각된다.
clf = KNeighborsClassifier(n_neighbors = 6).fit(X_train,y_train)
predict_result = clf.predict(X_test)
print(classification_report(y_test,predict_result, target_names=["malignant","benign" ]))
Reference
이 문제에 관하여(K 최근 방법(K-Nearest Neighbor) 분류 기초), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/SAKA1231/items/55ac246401cc2582e4e2
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
clf = KNeighborsClassifier(n_neighbors = 6).fit(X_train,y_train)
predict_result = clf.predict(X_test)
print(classification_report(y_test,predict_result, target_names=["malignant","benign" ]))
Reference
이 문제에 관하여(K 최근 방법(K-Nearest Neighbor) 분류 기초), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/SAKA1231/items/55ac246401cc2582e4e2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)