
ゆうき( @BASEBALLY15 )です^^
前回,機械学習を行った際に精度が低かったので,今回は,より高精度な機械学習を行ってみました.
そういえば,前回の精度は40%くらいでしたよね・・・?
そうでしたね(・・;)
しかし, 今回の方法を試すと90%程度まで精度を上げることが出来ますよ^^
そうなんですか!?

前回までの流れ
前回は, scikit-learn(サイキットラーン)の データを使って,機械学習を行いました.
精度を検証する時に,以下のデータフレームのように,グループ分けしました.
しかし,精度が40%程度となり,かなり低い結果となってしまいました.
age | sex | bmi | bp | s1 | s2 | s3 | s4 | s5 | s6 | progression | ret | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0.038076 | 0.050680 | 0.061696 | 0.021872 | -0.044223 | -0.034821 | -0.043401 | -0.002592 | 0.019908 | -0.017646 | 151.0 | 4 |
1 | -0.001882 | -0.044642 | -0.051474 | -0.026328 | -0.008449 | -0.019163 | 0.074412 | -0.039493 | -0.068330 | -0.092204 | 75.0 | 2 |
2 | 0.085299 | 0.050680 | 0.044451 | -0.005671 | -0.045599 | -0.034194 | -0.032356 | -0.002592 | 0.002864 | -0.025930 | 141.0 | 3 |
3 | -0.089063 | -0.044642 | -0.011595 | -0.036656 | 0.012191 | 0.024991 | -0.036038 | 0.034309 | 0.022692 | -0.009362 | 206.0 | 5 |
4 | 0.005383 | -0.044642 | -0.036385 | 0.021872 | 0.003935 | 0.015596 | 0.008142 | -0.002592 | -0.031991 | -0.046641 | 135.0 | 3 |
そこで,今回はこのグループをさらに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
すると,以下のデータフレームが表示されます.
age | sex | bmi | bp | s1 | s2 | s3 | s4 | s5 | s6 | progression | ret | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0.038076 | 0.050680 | 0.061696 | 0.021872 | -0.044223 | -0.034821 | -0.043401 | -0.002592 | 0.019908 | -0.017646 | 151.0 | 4 |
1 | -0.001882 | -0.044642 | -0.051474 | -0.026328 | -0.008449 | -0.019163 | 0.074412 | -0.039493 | -0.068330 | -0.092204 | 75.0 | 2 |
2 | 0.085299 | 0.050680 | 0.044451 | -0.005671 | -0.045599 | -0.034194 | -0.032356 | -0.002592 | 0.002864 | -0.025930 | 141.0 | 3 |
3 | -0.089063 | -0.044642 | -0.011595 | -0.036656 | 0.012191 | 0.024991 | -0.036038 | 0.034309 | 0.022692 | -0.009362 | 206.0 | 5 |
4 | 0.005383 | -0.044642 | -0.036385 | 0.021872 | 0.003935 | 0.015596 | 0.008142 | -0.002592 | -0.031991 | -0.046641 | 135.0 | 3 |
ココまでが前回の流れとなります.
それでは,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 | |
---|---|
0 | 1 |
1 | 1 |
2 | 1 |
3 | 1 |
4 | 1 |
… | … |
437 | 1 |
438 | 1 |
439 | 1 |
440 | 1 |
441 | 1 |
このように,変換されています.(上の表示では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%以上になりました^^
終わりに
前回の精度の検証でかなり低い結果になってしまいましたが,
学習方法を変えるだけで,精度を向上させることが出来ました.
どのように,学習させるのかということが重要ですね^^
それでは・・・