少し難しい質問です。もし分かる方がいらっしゃれば教えてください!
特徴量が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])]
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。