高精度

ゆうき( @BASEBALLY15 )です^^

前回,機械学習を行った際に精度が低かったので,今回は,より高精度な機械学習を行ってみました.

そういえば,前回の精度は40%くらいでしたよね・・・?

そうでしたね(・・;)
しかし, 今回の方法を試すと90%程度まで精度を上げることが出来ますよ^^

そうなんですか!?

前回までの流れ

前回は, scikit-learn(サイキットラーン)の データを使って,機械学習を行いました.

精度を検証する時に,以下のデータフレームのように,グループ分けしました.

しかし,精度が40%程度となり,かなり低い結果となってしまいました.

agesexbmibps1s2s3s4s5s6progressionret
00.0380760.0506800.0616960.021872-0.044223-0.034821-0.043401-0.0025920.019908-0.017646151.04
1-0.001882-0.044642-0.051474-0.026328-0.008449-0.0191630.074412-0.039493-0.068330-0.09220475.02
20.0852990.0506800.044451-0.005671-0.045599-0.034194-0.032356-0.0025920.002864-0.025930141.03
3-0.089063-0.044642-0.011595-0.0366560.0121910.024991-0.0360380.0343090.022692-0.009362206.05
40.005383-0.044642-0.0363850.0218720.0039350.0155960.008142-0.002592-0.031991-0.046641135.03

そこで,今回はこのグループをさらに3つのグループに分けて,精度を検証したいと思います^^

学習内容-精度の向上-

まずは,今回使ったライブラリを見ていきましょう^^

ライブラリ

import numpy as np

import pandas as pd

from pandas import Series, DataFrame

#今回使うデータを読み込むためのライブラリ
from sklearn.datasets import load_diabetes

#学習用とテスト用に分けるためのライブラリ
from sklearn.model_selection import train_test_split

#学習させるためのライブラリ
from sklearn.ensemble import RandomForestClassifier

#正解率を求めるためのライブラリ
from sklearn.metrics import accuracy_score

#各分類ごとのレポートを表示するためのライブラリを用意
from sklearn.metrics import classification_report

次に,前回までのコードを記述したいと思います.

上のブログを参考にして頂けると,コードの流れを理解できると思います.

コード

#データの読み込み
diabets = load_diabetes()

#データの詳細を表示
print(diabets.DESCR)

前回と同様に,以下の項目を使います.

:Target: Column 11 is a quantitative measure of disease progression one year after baseline

:Attribute Information:

– Age

– Sex

– Body mass index

– Average blood pressure

– S1

– S2

– S3

– S4

– S5

– S6

そして,データフレームを作っていきます.

#データフレームを作成
diabets_df = pd.DataFrame(diabets.data)

#データフレームにカラム名を追加
diabets_df.columns = diabets.feature_names
#データフレームにtargetを追加
diabets_df["progression"] = diabets.target

次に,データフレーム内の”target”の値をグループ分けします.

#データフレームの"target"の値をグループ分け
diabets_df["ret"] = (diabets_df["progression"]//50+1).astype(int)

#実行
diabets_df

すると,以下のデータフレームが表示されます.

agesexbmibps1s2s3s4s5s6progressionret
00.0380760.0506800.0616960.021872-0.044223-0.034821-0.043401-0.0025920.019908-0.017646151.04
1-0.001882-0.044642-0.051474-0.026328-0.008449-0.0191630.074412-0.039493-0.068330-0.09220475.02
20.0852990.0506800.044451-0.005671-0.045599-0.034194-0.032356-0.0025920.002864-0.025930141.03
3-0.089063-0.044642-0.011595-0.0366560.0121910.024991-0.0360380.0343090.022692-0.009362206.05
40.005383-0.044642-0.0363850.0218720.0039350.0155960.008142-0.002592-0.031991-0.046641135.03

ココまでが前回の流れとなります.

それでは,90%の精度をたたき出した方法を見ていきましょう^^

新たな検証

前回の,項目ごとの詳細を見ると,以下のように,2から6にデータが集まっていることが分かります.(詳細の表示方法は,上のブログで紹介しています.)

        precision    recall  f1-score   support

           1       0.00      0.00      0.00         5
           2       0.49      0.84      0.62        25
           3       0.08      0.06      0.07        16
           4       0.50      0.42      0.45        12
           5       0.27      0.25      0.26        12
           6       0.38      0.36      0.37        14
           7       0.00      0.00      0.00         5

    accuracy                           0.39        89
   macro avg       0.25      0.28      0.25        89
weighted avg       0.32      0.39      0.34        89

そこで,今回は,このグループを『1以下』,『2~6』,『7以上』の3つに分けたいと思います.

データフレームのグループ分け

まずは,予測するためのデータ(説明変数)と予測したいデータ(目的変数)を準備します.

(前回と同様です.)

#予測するためのデータ(説明変数)
X = diabets_df.drop(["progression","ret"], axis=1)

#予測したいデータ(目的変数)
Y = diabets_df["ret"]

ここから,以下のコードを記述し,予測したいデータ(目的変数)を3つのグループに分けたいと思います.

#Yのラベルを付け直す(1以下を0,2~6を1,7以上を2に分類する)
new = []
for i in list(Y):
    if i <=1:
        new += [0]
    elif i<=6:
        new += [1]
    else:
        new += [2]      
Y = new

Yの値を見てみましょう^^

#Yを表示してみる
pd.DataFrame(Y)
0
01
11
21
31
41
4371
4381
4391
4401
4411

このように,変換されています.(上の表示では1のみですが,0と2もあります(笑))

そして,学習用とテスト用に分け,学習させたいと思います.

#学習用とテスト用に分ける
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, shuffle=True)

#学習させる
model = RandomForestClassifier()
model.fit(X_train, Y_train)

それでは,精度を見てみましょう^^

#評価する
Y_pred = model.predict(X_test)

#精度を表示する
print("正解率=", accuracy_score(Y_pred, Y_test))

・・・・・・・

正解率= 0.9325842696629213

なんと,正解率が90%以上になりました^^

終わりに

前回の精度の検証でかなり低い結果になってしまいましたが,

学習方法を変えるだけで,精度を向上させることが出来ました.

どのように,学習させるのかということが重要ですね^^

それでは・・・

Q &A

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA