Python機械学習ライブラリScikit-learn その30:糖尿病患者のデータセットを使って、Ridgeモデルで特徴量の全ての組み合わせを検討してみる

目次

機械学習ライブラリScikit-learn

前回、機械学習ライブラリScikit-learnの糖尿病患者のデータセットでSVRモデルを使い、特徴量の全ての組み合わせを検討してみました。

その結果としては、SVRモデルでは「s5」、「bmi」を特徴量として学習させれば十分、だが「bp」、「s4」、「s3」もあっても悪くないという感じでした。

その時出てきた疑問。

この予想精度スコアの高い特徴量の組み合わせは使う機械学習モデルに依存するものなのか?

つまり機械学習モデルによっては、特徴量の他の組み合わせの方が良い予想精度を出せる、なんてことがあるんじゃないかということ。

ということで今回は、前に試した際にスコアの良かったRidgeRegressionモデルを使って特徴量の組み合わせを検討してみたいと思います。

ということでデータの読み込みから。

<セル1>

from sklearn.datasets import load_diabetes
import pandas as pd

diabetes = load_diabetes()

df = pd.DataFrame(diabetes.data, columns=diabetes.feature_names)

df["target"] = diabetes.target

df

実行結果

使用する学習モデルをRidgeRegressionモデルに変更する

データの読み込みが終わったところで、プログラムを書き換え、使用する学習モデルをRidgeRegressionモデルに変更していきましょう。

まずはライブラリのインポートから。

前回はこんな感じでした。

import itertools
from sklearn.model_selection import train_test_split
from sklearn.svm import SVR
from sklearn.metrics import r2_score
import numpy as np

今回はSVRモデルは使わないので「from sklearn.svm import SVR」を削除し、代わりにRidgeRegressionモデルを使うため「from sklearn.linear_model import Ridge」を追加します。

import itertools
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Ridge
from sklearn.metrics import r2_score
import numpy as np

あとは機械学習モデルの読み込みをSVRからRidgeに書き換えます。

つまりこの部分を

model_svr = SVR()

このように書き換えます。

model_rd = Ridge()

あとは機械学習モデルを変更したので、変数名も変更しておくと分かりやすいと思います。

私は変数名の「model_svr」とか「pred_svr」、リスト名の「pred_svr_score」などを「model_rd」、「pred_rd」、「pred_rd_score」といった感じに変更しました。

変更したプログラムがこちら。

<セル2>

import itertools
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Ridge
from sklearn.metrics import r2_score
import numpy as np

trial=10

score_list = []; combination_list = []

for i in range(1, len(diabetes.feature_names)+1):
    print(i)
    for comb in itertools.combinations(diabetes.feature_names, i):
#         print(comb)
        
        x = df.loc[:, comb]
        y = df.loc[:, "target"]
        
#         print(x)
        
        pred_rd_score = []
        
        for t in range(trial):
        
            x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, train_size=0.8)
            model_rd = Ridge()
            model_rd.fit(x_train, y_train)
            pred_rd = model_rd.predict(x_test)
            pred_rd_score.append(r2_score(y_test, pred_rd))
            
        pred_rd_ave = np.average(np.array(pred_rd_score))
        
#         print(pred_rd_ave)
        
        if len(score_list) < 10:
            score_list.append(pred_rd_ave)
            combination_list.append(comb)
        elif len(score_list) == 10:
            if np.min(score_list) < pred_rd_ave:
                del combination_list[np.argmin(score_list)]
                del score_list[np.argmin(score_list)]
                combination_list.append(comb)
                score_list.append(pred_rd_ave)
                
for comb, score in zip(combination_list, score_list):
    print(comb, score)

実行結果
('sex', 'bmi', 'bp', 's3', 's4', 's5') 0.439693010132639
('bmi', 'bp', 's1', 's3', 's5', 's6') 0.42800410791192245
('age', 'bmi', 'bp', 's3', 's4', 's5', 's6') 0.4260323203866879
('sex', 'bmi', 'bp', 's1', 's2', 's3', 's5') 0.43784734895660027
('sex', 'bmi', 'bp', 's1', 's3', 's4', 's5') 0.4291064870545248
('sex', 'bmi', 'bp', 's1', 's3', 's5', 's6') 0.43488580704318186
('bmi', 'bp', 's1', 's2', 's3', 's5', 's6') 0.4280862604485365
('age', 'sex', 'bmi', 'bp', 's2', 's3', 's5', 's6') 0.4349084526454246
('age', 'sex', 'bmi', 'bp', 's1', 's2', 's4', 's5', 's6') 0.4264502561900601
('age', 'sex', 'bmi', 'bp', 's1', 's2', 's3', 's4', 's5', 's6') 0.43040534713759004

1回実行してみただけですが、もうSVRモデルとは違うなという感じがします。

ということで試していきましょう。

プログラムを5回試してみた

1回目の実行結果

特徴量スコア順位
‘sex’, ‘bmi’, ‘bp’, ‘s3’, ‘s4’, ‘s5’0.439691
‘bmi’, ‘bp’, ‘s1’, ‘s3’, ‘s5’, ‘s6’0.428008
‘age’, ‘bmi’, ‘bp’, ‘s3’, ‘s4’, ‘s5’, ‘s6’0.4260310
‘sex’, ‘bmi’, ‘bp’, ‘s1’, ‘s2’, ‘s3’, ‘s5’0.437852
‘sex’, ‘bmi’, ‘bp’, ‘s1’, ‘s3’, ‘s4’, ‘s5’0.429116
‘sex’, ‘bmi’, ‘bp’, ‘s1’, ‘s3’, ‘s5’, ‘s6’0.434894
‘bmi’, ‘bp’, ‘s1’, ‘s2’, ‘s3’, ‘s5’, ‘s6’0.428097
‘age’, ‘sex’, ‘bmi’, ‘bp’, ‘s2’, ‘s3’, ‘s5’, ‘s6’0.434913
‘age’, ‘sex’, ‘bmi’, ‘bp’, ‘s1’, ‘s2’, ‘s4’, ‘s5’, ‘s6’0.426459
‘age’, ‘sex’, ‘bmi’, ‘bp’, ‘s1’, ‘s2’, ‘s3’, ‘s4’, ‘s5’, ‘s6’0.430415
agesexbmibps1s2s3s4s5s6
4710107595107

第一位:’sex’, ‘bmi’, ‘bp’, ‘s3’, ‘s4’, ‘s5’

2回目の実行結果

特徴量スコア順位
‘sex’, ‘bmi’, ‘bp’, ‘s3’, ‘s5’0.427238
‘bmi’, ‘bp’, ‘s1’, ‘s3’, ‘s5’0.426759
‘sex’, ‘bmi’, ‘bp’, ‘s1’, ‘s3’, ‘s5’0.430326
‘age’, ‘bmi’, ‘bp’, ‘s1’, ‘s3’, ‘s4’, ‘s5’0.432794
‘sex’, ‘bmi’, ‘bp’, ‘s1’, ‘s3’, ‘s4’, ‘s5’0.430335
‘age’, ‘sex’, ‘bmi’, ‘bp’, ‘s1’, ‘s4’, ‘s5’, ‘s6’0.441931
‘age’, ‘sex’, ‘bmi’, ‘bp’, ‘s2’, ‘s3’, ‘s4’, ‘s5’0.429607
‘age’, ‘sex’, ‘bmi’, ‘bp’, ‘s2’, ‘s3’, ‘s5’, ‘s6’0.434823
‘sex’, ‘bmi’, ‘bp’, ‘s1’, ‘s2’, ‘s3’, ‘s5’, ‘s6’0.435882
‘sex’, ‘bmi’, ‘bp’, ‘s1’, ‘s2’, ‘s3’, ‘s4’, ‘s5’, ‘s6’0.4256910
agesexbmibps1s2s3s4s5s6
4810107495104

第一位:’age’, ‘sex’, ‘bmi’, ‘bp’, ‘s1’, ‘s4’, ‘s5’, ‘s6’

3回目の実行結果

特徴量スコア順位
‘sex’, ‘bmi’, ‘bp’, ‘s2’, ‘s3’, ‘s5’0.4220810
‘sex’, ‘bmi’, ‘bp’, ‘s3’, ‘s5’, ‘s6’0.423309
‘bmi’, ‘bp’, ‘s2’, ‘s3’, ‘s4’, ‘s5’0.432285
‘age’, ‘sex’, ‘bmi’, ‘bp’, ‘s3’, ‘s5’, ‘s6’0.426658
‘age’, ‘bmi’, ‘bp’, ‘s2’, ‘s4’, ‘s5’, ‘s6’0.432514
‘sex’, ‘bmi’, ‘bp’, ‘s1’, ‘s3’, ‘s5’, ‘s6’0.438261
‘bmi’, ‘bp’, ‘s2’, ‘s3’, ‘s4’, ‘s5’, ‘s6’0.429907
‘age’, ‘sex’, ‘bmi’, ‘bp’, ‘s2’, ‘s3’, ‘s5’, ‘s6’0.434203
‘age’, ‘bmi’, ‘bp’, ‘s1’, ‘s2’, ‘s3’, ‘s5’, ‘s6’0.436052
‘sex’, ‘bmi’, ‘bp’, ‘s1’, ‘s2’, ‘s3’, ‘s4’, ‘s5’, ‘s6’0.431666
agesexbmibps1s2s3s4s5s6
4610103794108

第一位:’sex’, ‘bmi’, ‘bp’, ‘s1’, ‘s3’, ‘s5’, ‘s6’

4回目の実行結果

特徴量スコア順位
‘bmi’, ‘bp’, ‘s3’, ‘s4’, ‘s5’0.4276810
‘sex’, ‘bmi’, ‘bp’, ‘s2’, ‘s3’, ‘s5’0.435143
‘sex’, ‘bmi’, ‘bp’, ‘s3’, ‘s4’, ‘s5’0.434264
‘sex’, ‘bmi’, ‘bp’, ‘s1’, ‘s3’, ‘s4’, ‘s5’0.429545
‘sex’, ‘bmi’, ‘bp’, ‘s2’, ‘s4’, ‘s5’, ‘s6’0.428907
‘bmi’, ‘bp’, ‘s2’, ‘s3’, ‘s4’, ‘s5’, ‘s6’0.429146
‘age’, ‘bmi’, ‘bp’, ‘s1’, ‘s2’, ‘s3’, ‘s4’, ‘s5’0.428299
‘age’, ‘sex’, ‘bmi’, ‘bp’, ‘s2’, ‘s3’, ‘s4’, ‘s5’, ‘s6’0.439022
‘sex’, ‘bmi’, ‘bp’, ‘s1’, ‘s2’, ‘s3’, ‘s4’, ‘s5’, ‘s6’0.428358
‘age’, ‘sex’, ‘bmi’, ‘bp’, ‘s1’, ‘s2’, ‘s3’, ‘s4’, ‘s5’, ‘s6’0.464551
agesexbmibps1s2s3s4s5s6
3710104799105

第一位:’age’, ‘sex’, ‘bmi’, ‘bp’, ‘s1’, ‘s2’, ‘s3’, ‘s4’, ‘s5’, ‘s6’

5回目の実行結果

特徴量スコア順位
‘sex’, ‘bmi’, ‘bp’, ‘s2’, ‘s4’, ‘s5’0.424709
‘sex’, ‘bmi’, ‘bp’, ‘s3’, ‘s5’, ‘s6’0.429026
‘age’, ‘sex’, ‘bmi’, ‘bp’, ‘s3’, ‘s5’, ‘s6’0.432843
‘sex’, ‘bmi’, ‘bp’, ‘s1’, ‘s3’, ‘s5’, ‘s6’0.427837
‘sex’, ‘bmi’, ‘bp’, ‘s3’, ‘s4’, ‘s5’, ‘s6’0.4246510
‘age’, ‘bmi’, ‘bp’, ‘s2’, ‘s3’, ‘s4’, ‘s5’, ‘s6’0.430884
‘sex’, ‘bmi’, ‘bp’, ‘s1’, ‘s2’, ‘s3’, ‘s4’, ‘s5’0.430255
‘age’, ‘sex’, ‘bmi’, ‘bp’, ‘s2’, ‘s3’, ‘s4’, ‘s5’, ‘s6’0.449261
‘sex’, ‘bmi’, ‘bp’, ‘s1’, ‘s2’, ‘s3’, ‘s4’, ‘s5’, ‘s6’0.446912
‘age’, ‘sex’, ‘bmi’, ‘bp’, ‘s1’, ‘s2’, ‘s3’, ‘s4’, ‘s5’, ‘s6’0.426578
agesexbmibps1s2s3s4s5s6
4910104697108

第一位:’age’, ‘sex’, ‘bmi’, ‘bp’, ‘s2’, ‘s3’, ‘s4’, ‘s5’, ‘s6’

各特徴量の出現回数まとめ

agesexbmibps1s2s3s4s5s6
19375050252945305032

RidgeRegressionモデルではSVRモデルと比べて、予想精度のスコアが高いものには特徴量の数が多い傾向がありました。

しかしながら全ての特徴量を使った方がスコアが高いかというとそうではないようです。

またSVRモデルで重要だった「bmi」、「s5」、「bp」は全ての組み合わせに含まれていますが、その3つの組み合わせだけというのは今回の結果には一度も出てきませんでした。

このことから予想するにRidgeRegressionモデルとSVRモデルではその機械学習の方向性が異なっており、それが今回の予想精度スコアの高い特徴量の組み合わせの違いとして表れたと考えられます。

つまり最初の問いである「この予想精度スコアの高い特徴量の組み合わせは使う機械学習モデルに依存するものなのか?」の答えは「依存する」ということになります。

となると一番良い機械学習モデル、特徴量の組み合わせを今回のように計算から導き出すというのも一つの方針としてありなのではないでしょうか。

ということで次回はこの全部の特徴量の組み合わせを試すプログラムを複数のモデルに対して自動で計算できるよう改変していきたいと思います。

ではでは今回はこんな感じで。

よかったらシェアしてね!

コメント

コメントする

目次
閉じる