機械学習の精度

ゆうき( @BASEBALLY15 )です^^

前回は糖尿病進行状況についてデータ分析を行いましたね.

はい^^

そのデータを使って,機械学習の精度を求めてほしいです・・・

分かりました^^

(Jupiternotebookを使用)

機械学習とは?

機械学習とは,一言で言うなら,人間の学習能力と同じ機能をコンピュータ上で実現しようとする技術です.

コンピュータ上では,大量のデータを学習させることで,より高精度な機械学習を行うことが出来ます.

以下の,図を見てください.

機械学習とは?
(画像をクリックすると,引用元を確認できます.)

まず,大量のデータを学習させることで,型を作っていきます.

そして,対象データをその型と照らし合わせた時に,最も一致しているものを推論します.

このような流れで機械学習は行われています.

学習内容-機械学習-

今回は,前回と同様に, scikit-learn(サイキットラーン)のdiabetes(糖尿病疾患の進行状況)のデータを使いたいと思います.

それでは,コードを見ていきましょう^^

ライブラリ

import numpy as np

import pandas as pd

from pandas import Series, DataFrame

#scikit-learn(サイキットラーン)のdiabetesをインポート
from sklearn.datasets import load_diabetes

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

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

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

今回は,全データを学習用とテスト用に分けるために,train_test_split()を使います.

あと,学習用のデータを学習させるためのライブラリとして,RandomForestClassifier()を使います.

コード

まずは, scikit-learn(サイキットラーン)のdiabetes を読み込み,DataFrame化します.

DataFrameを表示させるまでの流れは,以下のサイトで紹介しています.

コードを載せておきます^^

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


#データをDataFrame化する
diabets_df = pd.DataFrame(diabets.data)


#DataFrameにカラムを表示
diabets_df.columns = diabets.feature_names


#DataFrameにtargetを追加
diabets_df["progression"] = diabets.target


#実行
diabets_df.head()

前回と同様,以下のデータフレームが表示されます.

agesexbmibps1s2s3s4s5s6progression
00.0380760.0506800.0616960.021872-0.044223-0.034821-0.043401-0.0025920.019908-0.017646151.0
1-0.001882-0.044642-0.051474-0.026328-0.008449-0.0191630.074412-0.039493-0.068330-0.09220475.0
20.0852990.0506800.044451-0.005671-0.045599-0.034194-0.032356-0.0025920.002864-0.025930141.0
3-0.089063-0.044642-0.011595-0.0366560.0121910.024991-0.0360380.0343090.022692-0.009362206.0
40.005383-0.044642-0.0363850.0218720.0039350.0155960.008142-0.002592-0.031991-0.046641135.0

精度を求めるための準備

今回の機械学習では,” PROGRESSION “以外の項目から,” PROGRESSION “のデータを推測します.

そのために,まずは ” PROGRESSION ” のデータを以下の図のようにグループ分けします.

このようにグループ分けすることで,高精度になります.

それでは,コードを見てみましょう^^

#progressionを50で割った余りに1を足す
diabets_df["ret"] = (diabets_df["progression"]//50+1).astype(int)

#実行
diabets_df.head()

すると,このようになります.

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

retの項目が追加され,番号に分けられています.

それでは,本題の機械学習を行っていきましょう^^

機械学習を体験してみよう

まずは,以下のコードで予測したいデータ(目的変数)予測に使うデータ(説明変数)に分けます.

#予測に使うデータ(progressionとret以外)
X = diabets_df.drop(["progression", "ret"], axis=1)

#予測したいデータ(ret)
Y = diabets_df.ret

そして,学習用とテスト用に分けます.

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

ちなみに,

test_size=0.2:全データの2割をテスト用に使う.(8割を学習用に使う)

shuffle=True:ランダムにデータを取り出す

ということを意味しています.

次に,以下のコードで学習させます.

#学習するためのモデルを用意
model = RandomForestClassifier()

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

そして,機械学習の精度を表示させたいと思います.

#予測データを用意
Y_pred = model.predict(X_test)

#結果を表示
print("正解率=", accuracy_score(Y_test, Y_pred))

すると,以下の結果となります.

正解率= 0.4044943820224719

40%と,あまり良くない結果になってしまいました.

なぜなのでしょうか?

retごとの精度を確認してみましょう.

#各分類ごとのレポートを表示するためのライブラリを用意
from sklearn.metrics import classification_report
#各retの精度を表示
print(classification_report(Y_test, Y_pred))
             precision    recall  f1-score   support

           1       0.50      0.25      0.33         4
           2       0.43      0.75      0.55        24
           3       0.45      0.25      0.32        20
           4       0.25      0.29      0.27        14
           5       0.50      0.40      0.44        10
           6       0.44      0.33      0.38        12
           7       0.00      0.00      0.00         5

    accuracy                           0.40        89
   macro avg       0.37      0.32      0.33        89
weighted avg       0.40      0.40      0.38        89

一番左が各retで,

precision:精度

recall:再現率

f1-score:精度と再現率の調和平均

support:正解ラベルのデータ数

を意味しています.

やはり,各retの精度が悪いことが分かります.

考察

今回は,”progression”をグループ分けしましたが,さらに,細かくグループ分けすることで,

精度を上げていけるのではないかと思いました.

終わりに

今回の機械学習では,精度が低くなってしまったけれど,

自分の中で,精度を上げるためのアイデアがいくつかあるので,次の投稿で試します!^^

それでは・・・

Q &A

コメントを残す

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

CAPTCHA