使用するアルゴリズム
- リッジ回帰
- ラッソ回帰
- 重回帰
- 決定木
- ランダムフォレスト
- エキストラツリー
以上を対象に,重要度評価をして円グラフに可視化する.
大まかなプログラムの流れ
- 各アルゴリズムを
for
で回しながらインスタンス化 - 重要度を算出
-
plt.add_subplot
でそれぞれを円グラフに
ソースコード
X
とy
を定義してるのを前提としています.
main
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
models = (Ridge(alpha=0.01),
Lasso(alpha=0.01),
LinearRegression(),
DecisionTreeRegressor(random_state=0,max_depth=4),
RandomForestRegressor(max_features=3,random_state=0,max_depth=14, n_estimators=100),
ExtraTreesRegressor(random_state=0,n_estimators=100,max_depth=5)
)
fig = plt.figure(figsize = (24,12))
for num,model in enumerate(models):
feature = Regression(model)
plot_model(feature,X.collumns)
fig.tight_layout()
plt.savefig('figure.png',bbox_inches='tight',pad_inches=0.05)
ここに,Regression()
はモデルを引き渡し,重要度評価をしてくれる関数として定義しています.
try
文で木かそれ以外かを場合分けしてるけど,これが最適とは思いにくい.
Regression(model)
def Regression(model):
model.fit(X_train, y_train)
try:
x = model.feature_importances_ #木ならこっち
except:
x = model.coef_ # リッジ,ラッソ,重回帰ならこっち
y_pred = model.predict(X_test)
kf = KFold(n_splits=5, shuffle=True, random_state=1)
result = cross_val_score(model,X,y,scoring='neg_root_mean_squared_error',cv=kf)
print(str(model))
print("RMSE:", -1*result.mean())
print("-"*40)
return abs(x)
続いて,plot_model()
は重要度とラベルを引数にとって可視化する関数.
plot_model(x,labels)
def plot_model(x,labels):
fig.patch.set_facecolor('white')
idx = np.argsort(-x)
ax = fig.add_subplot(2, 3, num+1)
ax.pie(x[idx], autopct=lambda p:'{:.1f}%'.format(p) if p>=4.0 else '',
pctdistance=0.8, startangle=90, counterclock=False,
# labeldistance=1.2,
# radius=0.8,
textprops={'color': "black",'fontweight': 'bold'} # 'size': 'small'
)
ax.set_title(str(model))
ax.legend(labels[idx],fancybox=True,loc='center left',bbox_to_anchor=(0.9,0.5))
そんでできるのがコレ.凡例は一部を隠しています(テキトーに用意するのが面倒くさかった).
参考