knnを用いた多クラス分類でのパラメータ調整
前回、knn(k-近傍法)で多クラス分類を行いました。
結果は散々😢
上手く分類出来ていない結果となり悲しい泣
elsammit-beginnerblg.hatenablog.com
ということで、今回はknnに対してパラメータの調整を行いながら最適解を見つけていきたいと思います!!
■前回の結果
前回は、こちらのパラメータで実施!!
・k値:8
・トレーニング、テストの分割:50%
その結果はこちら。。。残念な結果だ。。。😢😢
合計ポケモン数:92匹 正しくでんきタイプと判断したポケモンの数: 23匹 正しくはがねタイプと判断したポケモンの数: 22匹 正しくでんきタイプではないと判断ポケモンの数: 27匹 誤ってでんきタイプと判断したポケモンの数: 3匹 誤ってはがねタイプと判断したポケモンの数: 14匹 誤ってタイプ判定したポケモンの数: 14匹 検査合計結果:92匹 識別率:78.261%
■k値調整
k値を調整するにあたり、1~100の間でk値を変化させてみた。
合わせて、k値を変化させたときのtest結果を知りたかったので、pyplotによりグラフ化してみました。
今回新規追加したコードはこちらになります。
accuracy_list = [] check_result = 0 k_range = range(1,100) for i in k_range: lr = KNeighborsClassifier(n_neighbors = i) lr.fit(X_train, y_train) Y_pred = lr.predict(X_test) accuracy_list.append(metrics.accuracy_score(y_test, Y_pred)) if check_result < metrics.accuracy_score(y_test, Y_pred): check_result = metrics.accuracy_score(y_test, Y_pred) check_X = i figure = plt.figure() ax = figure.add_subplot(111) ax.plot(k_range,accuracy_list) plt.show() print("-------------------------------------------------") print("result k:" + str(check_X)) print("result score: %.3f" % check_result) print("-------------------------------------------------")
こちらによりk値に1~100までを変化させながら予測していきます。
knnモデルでトレーニングデータを用いてフィッテングさせ、テストデータにより予測しています。
for i in k_range: lr = KNeighborsClassifier(n_neighbors = i) lr.fit(X_train, y_train) Y_pred = lr.predict(X_test)
こちらの結果をaccuracy_listにそれぞれ格納していきます。
そして、
figure = plt.figure() ax = figure.add_subplot(111) ax.plot(k_range,accuracy_list) plt.show()
によりグラフを生成しています。
※グラフ生成にはpyplotが必要になりますので、
import matplotlib.pyplot as plt
が必要です。
結果はこちらです。
------------------------------------------------- result k:8 result score: 0.821 -------------------------------------------------
kが8の時に最大で82%となるようです。
まじか。。。😨
k値は調整出来ていた。。。調整出来てこれだったのか。。。
■テスト、トレーニングデータ割合調整
k値だけではだめだった。。。
では次にtrain_test_splitのパラメータである、test_sizeを調整しました。
先ほどの結果からk値は高すぎると確率が大幅に減少するため、1~10までに変更しました。
さらに、k値を調整しただけの結果よりも低いものは確認しても仕方がないので、80%以上の結果だけ出力させました。
check_random = 0 for j in range(1,10): check_result = 0 check_X = 0 k_range = range(1,10) accuracy_list = [] sss = 0.1 * j X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=sss, random_state=0) for i in k_range: lr = KNeighborsClassifier(n_neighbors = i) lr.fit(X_train, y_train) Y_pred = lr.predict(X_test) accuracy_list.append(metrics.accuracy_score(y_test, Y_pred)) if check_result < metrics.accuracy_score(y_test, Y_pred): check_result = metrics.accuracy_score(y_test, Y_pred) check_X = i check_random = j if metrics.accuracy_score(y_test, Y_pred) > 0.80: figure = plt.figure() ax = figure.add_subplot(111) ax.plot(k_range,accuracy_list) plt.show() print("-------------------------------------------------") print("random state:" + str(check_random)) print("result k:" + str(check_X)) print("result score: %.3f" % check_result) print("-------------------------------------------------")
結果はこちら!!
test_size = 0.1の場合にこちらの結果となり、k=1にすると90%を超えることがわかりました。
------------------------------------------------- result k:1 result score: 0.917 -------------------------------------------------
では、毎度のことですが、ポケモン剣盾に出現するポケモンのみに対して、タイプ推定を行います!!
。。。結果はこちら!!
合計ポケモン数:92匹 正しくでんきタイプと判断したポケモンの数: 26匹 正しくはがねタイプと判断したポケモンの数: 24匹 正しくでんきタイプではないと判断ポケモンの数: 30匹 誤ってでんきタイプと判断したポケモンの数: 1匹 誤ってはがねタイプと判断したポケモンの数: 9匹 誤ってタイプ判定したポケモンの数: 9匹 検査合計結果:92匹 識別率:86.957%
やった!!識別率85%越え👍
■最後に
今回の結果からモデルを選択するだけでなくちゃんとパラメータ調整も必要だという言うことが身に染みて分かりました!!
ちょっと機械学習に対する知識や技術が足りない。。。足りなさすぎる😢
こちらの本を購入してみました!!勉強したこともこちらで報告出来ればいいな!!と考えております。
![]() | ゼロから作るDeep Learning ?Pythonで学ぶディープラーニングの理論と実装 新品価格 |
