#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オブジェクトの配列。
コメント