K近傍法 機械学習

#KNNを試しにK=3でやってみる
from sklearn.neighbors import KNeighborsClassifier

kn = KNeighborsClassifier(n_neighbors=3)#ここの数字を変えることでKを変えられる
kn.fit(iris_X_train,iris_Y_train)
#性能評価
kn_score = kn.score(iris_X_test,iris_Y_test)
print('3-nearest neighbor score:{}'.format(kn_score))
3-nearest neighbor score:0.9736842105263158

n分割交差検証¶

データをn分割して、そのうちの1グループをテスト用データ、残りを訓練用データとする手法。

n分割したデータの1つ1つをテスト用データにして、n通りのモデル訓練を行い、その性能指標の平均値を全体の性能指標とする。

from sklearn.model_selection import cross_val_score
from sklearn.model_selection import StratifiedKFold

stratifiedkfold = StratifiedKFold(n_splits=5)#5分割交差検証してみる

#交差検証
stkfold_scores = cross_val_score(kn,iris.data,iris.target,cv=stratifiedkfold)
print('stratifiedkfold Cross-Validation scores:{}'.format(stkfold_scores))
print('stratifiedkfold Average score:{}'.format(np.mean(stkfold_scores)))
stratifiedkfold Cross-Validation scores:[0.96666667 0.96666667 0.93333333 0.96666667 1.        ]
stratifiedkfold Average score:0.9666666666666668

Kを変えた時のスコアの変化

#Kを変えていったときのスコアの変化をグラフにする

list_nn=[]
list_score1=[]
list_cv_score1=[]
for k in range(1,31):
    knc = KNeighborsClassifier(n_neighbors=k)
    knc.fit(iris_X_train,iris_Y_train)
    
    y_pred = knc.predict(iris_X_test)
    score = knc.score(iris_X_test,iris_Y_test)
    
    stkfold_scores = cross_val_score(knc,iris.data,iris.target,cv=stratifiedkfold)#5分割
    
    list_nn.append(k)
    list_score1.append(score)
    list_cv_score1.append(stkfold_scores)

cv_score1 = pd.DataFrame(list_cv_score1)
cv_average1 = cv_score1.mean(axis='columns')

fig = plt.figure(figsize=(10,5))
 matplotlibの呼び出し
sns.set_style("darkgrid")


ax1 = fig.add_subplot(1,2,1) グラフの位置を入れる
  ここで、plt.subplot(1,2,1)としても変わらない
ax1.set_ylim(0.9,1.0)
ax1.set_xlabel("n_neghbors",fontsize=13)
ax1.set_ylabel("score",fontsize=13)
ax1.plot(list_nn,list_score1)
ax1.grid(True)

ax2 = fig.add_subplot(1,2,2)
ax2.set_ylim(0.8,1.0)
ax2.set_xlabel("n_neghbors",fontsize=13)
ax2.set_ylabel("CV average score",fontsize=13)
ax2.plot(list_nn,cv_average1)
ax2.grid(True)
plt.show()

add_subplot とplt.subplotの違い
plt.subplot()はadd_subplotと同様に、引数に行数列数及び何番目かを指定できる。
add_subplotとの違いは、現在の描画領域(fig = figure()のこと)に追加するメソッドであるということ。あまりないと思うが、figure()を何個も立ち上げてるときに、どれを操作しているかわかりにくくなる。

subplotはsubplot以前に描画していたfigureとかぶった場合、前のfigureを消す性質を持っている。

plt.subplot()と似たものとしてplt.subplots()もある。
返り値はfigとAxesまたはAxesオブジェクトの配列。

コメント

タイトルとURLをコピーしました