K인접법(다중 클래스 분류)

10254 단어 sklearnPython

K인접법


KNN(K Nearest Neighbor).유별 수법.
학습 데이터를 벡터 공간에 그리고 알 수 없는 데이터를 얻으면 거리와 가까운 순서로 임의의 K개를 얻어 다수의 표결로 데이터가 속한 클래스를 추정합니다.
예를 들어 다음 그림의 경우 클래스 판별의 절차는 다음과 같다.
1 알려진 데이터(학습 데이터)를 노란색과 보라색 원으로 그립니다.
2K 수량을 결정합니다.K=3 같은 거.
3 미지의 데이터로 붉은 별을 얻으면 가까운 곳에서 3개를 얻는다.
4 이 세 가지 종류의 다수결에 따라 속하는 종류로 추정된다.
이번에 추정되는 미지의 레드스타는 클래스비에 속한다.

※ 결과는 K의 수에 따라 달라질 수 있으니 주의하세요.K=6으로 설정하면 붉은 별은 ClassA로 판정됩니다.

데이터 준비 작업


sklearn에서 아이리스 데이터 집합을 준비합니다.
get_iris_dataset.py
from sklearn.datasets import load_iris
iris= load_iris() # irisデータ取得
X = iris.data     # 説明変数(クラス推定用変数)
Y = iris.target   # 目的変数(クラス値)

# irisのデータをDataFrameに変換
iris_data = DataFrame(X, columns=['Sepal Length', 'Sepal Width', 'Petal Length', 'Petal Width'])
iris_target = DataFrame(Y, columns=['Species'])

# iris_targetが0〜2の値で分かりづらいので、あやめの名前に変換
def flower(num):
"""名前変換用関数"""
    if num == 0:
        return 'Setosa'
    elif num == 1:
        return 'Veriscolour'
    else:
        return 'Virginica'

iris_target['Species'] = iris_target['Species'].apply(flower)
iris = pd.concat([iris_data, iris_target], axis=1)

데이터 개요


describe_iris.py
iris.head()

길이와 너비의 데이터
seaban에서pairplot,반별로 개요 보기
desplay_each_data.py
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('whitegrid')
%matplotlib inline

sns.pairplot(iris, hue = 'Species', size =2) # hue:指定したデータで分割

Setosa[파란색 점]은 분류하기 쉽다.Veriscolour[녹색 점]과 Virginica[빨간색 점]은 Petal Length로 분류할 수 있습니까?좌우의 인상.

시험해 보다


sklearn을 사용하여 KNN을 실행합니다.
do_knn.py
from sklearn.neighbors import KNeighborsClassifier
from sklearn.cross_validation import train_test_split # trainとtest分割用

# train用とtest用のデータ用意。test_sizeでテスト用データの割合を指定。random_stateはseed値を適当にセット。
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.4, random_state=3) 

knn = KNeighborsClassifier(n_neighbors=6) # インスタンス生成。n_neighbors:Kの数
knn.fit(X_train, Y_train)                 # モデル作成実行
Y_pred = knn.predict(X_test)              # 予測実行

# 精度確認用のライブラリインポートと実行
from sklearn import metrics
metrics.accuracy_score(Y_test, Y_pred)    # 予測精度計測
> 0.94999999999999996
95% 정도의 정밀도.
정밀도는 K의 수에 따라 달라집니다.→K를 어느 것을 선택해야 좋을지 모르기 때문에 먼저 K를 바꾸고 정밀도 변화도를 써 본다.
create_graph_knn_accracy_change_k.py
accuracy = []
for k in range(1, 90):
    knn = KNeighborsClassifier(n_neighbors=k) # インスタンス生成。
    knn.fit(X_train, Y_train)                 # モデル作成実行
    Y_pred = knn.predict(X_test)              # 予測実行
    accuracy.append(metrics.accuracy_score(Y_test, Y_pred)) # 精度格納

plt.plot(k_range, accuracy)
90번 돌려본 결과

K=3?정도면 충분해요.30이 넘으면 정밀도가 떨어진다.
이번에는 학습용 데이터가 90개밖에 없어서 반당 30개 정도의 학습 데이터만 있다.
K의 수가 30을 넘으면 정답 클래스의 데이터가 모두 포함될 경우 이후 가장 가까운 옆에서만 다른 클래스를 주울 수 있어 정밀도가 점점 떨어질 것으로 예상된다.

좋은 웹페이지 즐겨찾기