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

目次

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

前回、機械学習ライブラリScikit-learnの糖尿病患者のデータセットを使い、特徴量の全ての組み合わせを試すプログラムを作成しました。

あわせて読みたい
Python機械学習ライブラリScikit-learn その28:糖尿病患者のデータセットを使って、特徴量の全ての組...
Python機械学習ライブラリScikit-learn その28:糖尿病患者のデータセットを使って、特徴量の全ての組...【機械学習ライブラリScikit-learn】前回、機械学習ライブラリScikit-learnの糖尿病患者のデータセットを使い、SVRモデルのkernelのうち、polyのオプションを色々と試し...

今回はそのプログラムを使って、SVRモデルで特徴量の全ての組み合わせを試し、どんな特徴量の組み合わせを使うのがいいのか検討してみたいと思います。

まずは前回のプログラムのおさらいから。

<セル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

実行結果
<セル2>

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

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_svr_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_svr = SVR()
            model_svr.fit(x_train, y_train)
            pred_svr = model_svr.predict(x_test)
            pred_svr_score.append(r2_score(y_test, pred_svr))
            
        pred_svr_ave = np.average(np.array(pred_svr_score))
        
#         print(pred_svr_ave)
        
        if len(score_list) < 10:
            score_list.append(pred_svr_ave)
            combination_list.append(comb)
        elif len(score_list) == 10:
            if np.min(score_list) < pred_svr_ave:
                del combination_list[np.argmin(score_list)]
                del score_list[np.argmin(score_list)]
                combination_list.append(comb)
                score_list.append(pred_svr_ave)
                
for comb, score in zip(combination_list, score_list):
    print(comb, score)

実行結果
1
2
3
4
5
6
7
8
9
10
('s5',) 0.2324347008540927
('bmi', 's5') 0.25211732190510483
('bmi', 'bp', 's5') 0.2590815528704341
('bmi', 's2', 's5') 0.24376496089529925
('bmi', 'bp', 's2', 's5') 0.24234159140148792
('bmi', 'bp', 's3', 's5') 0.2270951116349605
('bmi', 'bp', 's4', 's5') 0.22518801559600696
('bmi', 's4', 's5', 's6') 0.2313280622825627
('bmi', 'bp', 's3', 's4', 's5') 0.24303507844402308
('bmi', 'bp', 's2', 's3', 's4', 's5') 0.22608041336148746

今回はこのプログラムを5回実行してみて、TOP10のスコアに入った特徴量をカウントしていくことにしましょう。

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

1回目の実行結果

特徴量スコア順位
‘s5’0.232436
‘bmi’, ‘s5’0.252112
‘bmi’, ‘bp’, ‘s5’0.259081
‘bmi’, ‘s2’, ‘s5’0.243763
‘bmi’, ‘bp’, ‘s2’, ‘s5’0.242345
‘bmi’, ‘bp’, ‘s3’, ‘s5’0.227108
‘bmi’, ‘bp’, ‘s4’, ‘s5’0.2251910
‘bmi’, ‘s4’, ‘s5’, ‘s6’0.231337
‘bmi’, ‘bp’, ‘s3’, ‘s4’, ‘s5’0.243044
‘bmi’, ‘bp’, ‘s2’, ‘s3’, ‘s4’, ‘s5’0.226089
agesexbmibps1s2s3s4s5s6
00960334101

第一位:’bmi’, ‘bp’, ‘s5’

2回目の実行結果

特徴量スコア順位
‘bmi’, ‘s5’0.284451
‘age’, ‘bmi’, ‘s5’0.233998
‘bmi’, ‘bp’, ‘s5’0.237027
‘bmi’, ‘s3’, ‘s5’0.245384
‘bmi’, ‘s4’, ‘s5’0.251682
‘age’, ‘bmi’, ‘s4’, ‘s5’0.2324410
‘bmi’, ‘bp’, ‘s4’, ‘s5’0.249123
‘bmi’, ‘s3’, ‘s5’, ‘s6’0.243165
‘age’, ‘bmi’, ‘bp’, ‘s4’, ‘s5’0.233509
‘bmi’, ‘bp’, ‘s3’, ‘s5’, ‘s6’0.241276
agesexbmibps1s2s3s4s5s6
301040034102

第一位:’bmi’, ‘s5’

3回目の実行結果

特徴量スコア順位
‘s5’0.249782
‘bmi’, ‘s5’0.250601
‘bmi’, ‘bp’, ‘s5’0.241214
‘bmi’, ‘s1’, ‘s5’0.236566
‘bmi’, ‘s4’, ‘s5’0.245703
‘bmi’, ‘bp’, ‘s2’, ‘s5’0.2285510
‘bmi’, ‘bp’, ‘s5’, ‘s6’0.228789
‘bmi’, ‘bp’, ‘s2’, ‘s3’, ‘s5’0.230717
‘bmi’, ‘bp’, ‘s3’, ‘s4’, ‘s5’0.238805
‘bmi’, ‘s2’, ‘s3’, ‘s4’, ‘s5’0.230238
agesexbmibps1s2s3s4s5s6
00951333101

第一位:’bmi’, ‘s5’

4回目の実行結果

特徴量スコア順位
‘s5’0.251213
‘bmi’, ‘s5’0.276291
‘s3’, ‘s5’0.240684
‘bmi’, ‘bp’, ‘s5’0.260662
‘bmi’, ‘s1’, ‘s5’0.237176
‘bmi’, ‘s5’, ‘s6’0.239215
‘age’, ‘bmi’, ‘bp’, ‘s5’0.233659
‘age’, ‘bmi’, ‘s4’, ‘s5’0.2321510
‘bmi’, ‘bp’, ‘s4’, ‘s5’0.236447
‘bmi’, ‘bp’, ‘s3’, ‘s4’, ‘s5’0.235268
agesexbmibps1s2s3s4s5s6
20841023101

第一位:’bmi’, ‘s5’

5回目の実行結果

特徴量スコア順位
‘bmi’, ‘s5’0.270831
‘bp’, ‘s5’0.235516
‘bmi’, ‘bp’, ‘s5’0.245073
‘age’, ‘bmi’, ‘s2’, ‘s5’0.235615
‘bmi’, ‘bp’, ‘s3’, ‘s5’0.246662
‘bmi’, ‘bp’, ‘s4’, ‘s5’0.235167
‘bmi’, ‘bp’, ‘s1’, ‘s4’, ‘s5’0.2318410
‘bmi’, ‘bp’, ‘s2’, ‘s4’, ‘s5’0.234348
‘bmi’, ‘bp’, ‘s3’, ‘s4’, ‘s5’0.237534
‘bmi’, ‘bp’, ‘s3’, ‘s5’, ‘s6’0.232359
agesexbmibps1s2s3s4s5s6
10981234101

第一位:’bmi’, ‘s5’

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

agesexbmibps1s2s3s4s5s6
604527381418506

第一位の組み合わせで一番多かったもの:’bmi’, ‘s5’

こうみると「s5」、「bmi」は文句なく学習させる特徴量として使うべきでしょう。

前に相関マップを表示し、選択した特徴量は「bmi」、「s5」、「bp」、「s4」、「s3」、「s6」でした。

あわせて読みたい
Python機械学習ライブラリScikit-learn その19:糖尿病患者のデータセットの内容を確認、相関マップを...
Python機械学習ライブラリScikit-learn その19:糖尿病患者のデータセットの内容を確認、相関マップを...【機械学習ライブラリScikit-learn】前回までは機械学習ライブラリScikit-learnのボストン住宅価格のデータセットを使い、色々な機械学習モデル、標準化・正規化の効果...

今回の結果から言うと、「bp」、「s3」、「s4」は他の特徴量よりも出現回数が有意に多いことから、確かに選択してもいい特徴量だと考えられます。

ただし「s6」の出現回数は「age」や「s2」の出現回数と変わらず、有意に多いとは言えなさそうです。

結論としては、SVRモデルでは「s5」、「bmi」を特徴量として学習させれば十分ということです。

ただ「bp」、「s4」、「s3」もこの順を優先度として加えてもいいかもしれないです。

ここで一つ疑問が湧いてきました。

多分、どの機械学習モデルを使っても、「s5」、「bmi」、そして「bp」くらいまでは特徴量として重要だと言う結論が導き出されるでしょう。

では他の特徴量の影響は、機械学習モデルによって違うのでしょうか?

ということで次回はSVRモデルに替えて、RidgeRegressionモデルを使って同じ検討をしてみましょう。

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

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

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

コメント

コメントする

目次
閉じる