Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

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

が必要です。

結果はこちらです。
f:id:Elsammit:20200929221211p:plain

-------------------------------------------------
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%を超えることがわかりました。
f:id:Elsammit:20200929222902p:plain

-------------------------------------------------
result k:1
result score: 0.917
-------------------------------------------------

では、毎度のことですが、ポケモン剣盾に出現するポケモンのみに対して、タイプ推定を行います!!
。。。結果はこちら!!

合計ポケモン数:92匹
正しくでんきタイプと判断したポケモンの数: 26匹
正しくはがねタイプと判断したポケモンの数: 24匹
正しくでんきタイプではないと判断ポケモンの数: 30匹
誤ってでんきタイプと判断したポケモンの数: 1匹
誤ってはがねタイプと判断したポケモンの数: 9匹
誤ってタイプ判定したポケモンの数: 9匹
検査合計結果:92匹
識別率:86.957%

やった!!識別率85%越え👍

■最後に

今回の結果からモデルを選択するだけでなくちゃんとパラメータ調整も必要だという言うことが身に染みて分かりました!!
ちょっと機械学習に対する知識や技術が足りない。。。足りなさすぎる😢
こちらの本を購入してみました!!勉強したこともこちらで報告出来ればいいな!!と考えております。

ゼロから作るDeep Learning ?Pythonで学ぶディープラーニングの理論と実装

新品価格
¥3,445から
(2020/9/29 22:40時点)