質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
scikit-learn

scikit-learnは、Pythonで使用できるオープンソースプロジェクトの機械学習用ライブラリです。多くの機械学習アルゴリズムが実装されていますが、どのアルゴリズムも同じような書き方で利用できます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

2304閲覧

RFEにより重要と判定された特徴量を用いて回帰分析を自動で行う方法

JMS

総合スコア7

scikit-learn

scikit-learnは、Pythonで使用できるオープンソースプロジェクトの機械学習用ライブラリです。多くの機械学習アルゴリズムが実装されていますが、どのアルゴリズムも同じような書き方で利用できます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/07/04 11:38

少し難しい質問です。もし分かる方がいらっしゃれば教えてください!

特徴量が23個、従属変数が7種類(y0~y6)あるようなデータセットを回帰分析をするとします。
以下ではその回帰分析の結果としての平均二乗誤差がy0~y6までの7通り計算されています。

ここで、コードをよくみていただくとRFEにより特徴量の優先順位付けをy0~y6までのそれぞれの回帰モデルについて実施し、その結果を
ranking_dataとしてリスト表示しています。

さて、ここからが私がどうしてもできないことです。

1.この特徴量の順位付けを、randamforest等の場合のfeature_importances_のように寄与度で表せないか?
2.2つの基準(寄与度何パーセントまでor上位〇位まで)により優先的特徴量を選択し、当該優先的特徴量のみを用いて再度y0~y6までの

回帰を自動的に行い、y0~y6までの平均二乗誤差を再度計算していく・・・という処理をしたいのです。

また、特徴量総当たり戦で23個×23個=276通りの特徴量セットを用いた場合の平均二乗誤差を全て求め、誤差が少ないものから順位付け
を行うということもしてみたいと思っています。なお、この場合の順位付けは以下のコードでいう、mean_squared_error(y_test,y_test_pred)、
つまり、テストデータの回帰により計算される平均二乗誤差を基準に行いたいと思っています。
この2つの処理の方法について、方法をお分かりの方はいらっしゃいますでしょうか?

多分私がPythonのプログラミングのレベルが低く、できないのです。困っています。

Python

1%matplotlib inline 2import matplotlib.pyplot as plt 3import numpy as np 4import pandas as pd 5from sklearn.linear_model import LinearRegression 6from sklearn.preprocessing import StandardScaler 7from sklearn.model_selection import train_test_split 8from sklearn.metrics import mean_squared_error 9from sklearn.preprocessing import PolynomialFeatures 10from sklearn.linear_model import Ridge 11from sklearn.linear_model import Lasso 12from sklearn.linear_model import ElasticNet 13from sklearn.linear_model import SGDRegressor 14from sklearn.feature_selection import RFE 15 16data=pd.read_excel('元データ.xlsx') 17data=data.drop([0,1]).reset_index(drop=True) 18data['date']=pd.to_datetime(data['date'],format='%Y年%m月') 19data['POSIX']=data['date'].astype('int64').values//10**9 20data['year']=data['date'].dt.year 21data['month']=data['date'].dt.month 22 23x=data.iloc[0:38:1,[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,32]] 24y0=data.iloc[:38,[23]] #0-43 25y1=data.iloc[:38,[24]]#0-42 26y2=data.iloc[:38,[25]]#0-41 27y3=data.iloc[:38,[26]]#0-40 28y4=data.iloc[:38,[27]]#0-39 29y5=data.iloc[:38,[28]]#0-38 30y6=data.iloc[:38,[29]]#0-37 31ranking_data=[] 32 33print(x.shape,y0.shape,y1.shape,y2.shape,y3.shape,y4.shape,y5.shape,y6.shape) 34 35#以下から回帰をしますが、データセットの中で従属変数が7個あり、それぞれについて平均二乗誤差を求めています 36for y in [y0, y1, y2, y3, y4, y5, y6]: 37 38 x_pos=data['POSIX'].values 39 N=len(x) 40 N_train=round(len(x)*0.8) 41 N_test=N-N_train 42 43 x_pos_train,x_pos_test=x_pos[:N_train],x_pos[N_train:] 44 x_train,y_train=x[:N_train],y[:N_train] 45 x_test,y_test=x[N_train:],y[N_train:] 46 47 sc=StandardScaler()#特徴料の標準化を行う 48 x_train_std=sc.fit_transform(x_train) 49 x_test_std=sc.transform(x_test) 50 51 model0=LinearRegression() 52 model0.fit(x_train_std,y_train) 53 54# print('傾き:',model0.coef_) 55# print('切片:',model0.intercept_) 56 57 y_train_pred=model0.predict(x_train_std) 58 y_test_pred=model0.predict(x_test_std) 59 60 print('平均二乗誤差(訓練データ):',mean_squared_error(y_train,y_train_pred)) 61 print('平均二乗誤差(テストデータ):',mean_squared_error(y_test,y_test_pred)) 62 63# #残差プロット 64 65# plt.figure(figsize=(8,4)) 66# plt.scatter(y_train_pred, y_train_pred-y_train, 67# c='red',marker='o',edgecolor='white', 68# label='Training data') 69# plt.scatter(y_test_pred, y_test_pred-y_test, 70# c='blue',marker='s',edgecolor='white', 71# label='Test data') 72# plt.xlabel('Predicted values') 73# plt.ylabel('Residuals') 74# plt.legend(loc='upper left') #凡例の場所 75# plt.hlines(y=0,xmin=0,xmax=100000000000,color='black',lw=0.5) 76# plt.xlim([10000000,100000000]) 77# plt.tight_layout() 78# plt.show() 79 80 81 #以下より特徴量選択 82 rfe=RFE(estimator=model0,n_features_to_select=1,step=1) 83 rfe.fit(x_train_std,y_train) 84 ranking=rfe.ranking_ 85 ranking_data.append(ranking) 86 87else: 88 print(ranking_data) 89# # Plot pixel ranking 90# plt.matshow(ranking_data, cmap=plt.cm.Blues) 91# plt.colorbar() 92# plt.title("Ranking of pixels with RFE") 93# plt.show() 94 95<以下、実行結果> 96(38, 23) (38, 1) (38, 1) (38, 1) (38, 1) (38, 1) (38, 1) (38, 1) 97平均二乗誤差(訓練データ): 114011291159.95395 98平均二乗誤差(テストデータ): 1267800782959.8984 99平均二乗誤差(訓練データ): 16950209332442.383 100平均二乗誤差(テストデータ): 98253998300883.72 101平均二乗誤差(訓練データ): 5200760524356.056 102平均二乗誤差(テストデータ): 151019289642192.44 103平均二乗誤差(訓練データ): 11454044835110.838 104平均二乗誤差(テストデータ): 106155038718937.3 105平均二乗誤差(訓練データ): 3440276199629.5225 106平均二乗誤差(テストデータ): 267603651190857.25 107平均二乗誤差(訓練データ): 9641806263803.537 108平均二乗誤差(テストデータ): 252002096095316.03 109平均二乗誤差(訓練データ): 6985170572173.642 110平均二乗誤差(テストデータ): 469711288726137.25 111[array([15, 6, 21, 23, 13, 12, 9, 3, 10, 8, 16, 5, 11, 4, 7, 22, 18, 112 20, 14, 17, 1, 2, 19]), array([23, 16, 12, 10, 22, 17, 21, 13, 15, 1, 7, 20, 18, 6, 3, 5, 4, 113 19, 11, 8, 9, 2, 14]), array([22, 21, 4, 20, 7, 6, 1, 2, 3, 10, 19, 5, 16, 9, 17, 15, 13, 114 23, 8, 11, 12, 14, 18]), array([22, 23, 12, 19, 16, 17, 10, 5, 11, 6, 20, 2, 3, 4, 7, 9, 8, 115 21, 18, 14, 13, 1, 15]), array([ 8, 16, 20, 23, 21, 11, 1, 2, 3, 12, 7, 9, 17, 5, 6, 4, 13, 116 14, 15, 19, 22, 10, 18]), array([19, 18, 17, 22, 6, 7, 5, 10, 14, 11, 3, 21, 8, 1, 2, 12, 13, 117 20, 9, 15, 16, 4, 23]), array([23, 12, 20, 21, 15, 16, 11, 8, 17, 9, 3, 13, 6, 1, 2, 5, 19, 118 4, 7, 22, 14, 10, 18])]

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

1.この特徴量の順位付けを、randamforest等の場合のfeature_importances_のように寄与度で表せないか?

モデル不問のPermutation Importanceを使ってみては?
AutoML系のツールではアルゴリズム間を比較する必要があり、アルゴリズム太いのこういった指標が
今後主流になると思われます。

Permutation Importanceを使ってモデルがどの特徴量から学習したかを定量化する

Permutation Importanceを使って検証データにおける特徴量の有用性を測る

SHAP等もありますね。

投稿2020/07/23 08:47

aokikenichi

総合スコア2240

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問