機械学習(LightGBM)で学習した際の importance 高い値を取り出す
import lightgbm as lgb
# データセットを作成
train = lgb.Dataset(X_train, label=y_train)
valid = lgb.Dataset(X_val, label=y_val)
# モデルのパラメータを設定
params = {
'reg_lambda' : 0.2,
'objective': 'multiclass',
'metric': 'multi_logloss',
'num_class': 2,
'reg_alpha': 0.1,
'min_data_leaf': 100,
'learning_rate': 0.025,
# 'feature_fraction': 0.8,
# 'bagging_fraction': 0.8
}
# モデルを訓練
model = lgb.train(params,
train,
valid_sets=valid,
num_boost_round=5000,
early_stopping_rounds=500)
# 予測
y_pred = model.predict(X_test, num_iteration=model.best_iteration)
#y_pred = (lgb.predict_proba(X_test)[:, 0] < 0.1).astype(int)
y_pred = np.argmax(y_pred, axis=1)
#--------------------------モデルの評価-----------------------------------------------
from sklearn.metrics import confusion_matrix
from sklearn.metrics import cohen_kappa_score
# 混合行列を作成
result_matrix = pd.DataFrame(confusion_matrix(y_test,y_pred))
# クラス毎の正解率を計算
class_accuracy = [(result_matrix[i][i]/result_matrix[i].sum())*1 for i in range(len(result_matrix))]
result_matrix[2] = class_accuracy
#kappa係数を計算
kappa = cohen_kappa_score(y_test,y_pred)
print("kappa score:",kappa)
#2変数間に、どの程度、順位づけの直線関係があるかを調べる際に使う分析手段がスピアマンの順位相関
from scipy.stats import spearmanr
correlation, pvalue = spearmanr(y_test,y_pred)
print("correlation",correlation)
df_Df = pd.DataFrame({'y_test_':y_test,'y_pred_':y_pred})
df_Df.to_csv(r""+"./output/output.csv",encoding = 'shift-jis')
importance = pd.DataFrame(model.feature_importance(importance_type='gain'), columns=['importance'])
#display(importance)
C_you=merge_data.drop(["y"], axis=1)
importance["columns"] =list(C_you.columns)
importance_sort=importance.sort_values(by='importance',ascending=False)
importance_sort.to_csv(r""+"./output/importance"+"output"+'.csv', encoding = 'shift-jis')
テキストデータを pycaret で前処理したのが以下のようなデータだった場合
インポータンスでソートした pandas をリストにして 辞書☛pandas
i_df=importance_sort
top10=i_df.iloc[0:10,:]
top10_list=top10["columns"]
dict_top10 = {}
for n,i in enumerate(top10_list):
print(pycaret_df.loc[:,str(i)])
dict_top10[str(n)] = pycaret_df.loc[:,str(i)]
#pycaret_dict_top10[importance_sort_df[int(n)]] = pycaret_df.loc[:,str(i)]
pycaret_top10_df=pd.DataFrame(dict_top10)
pandasにカラムをつける
pycaret_top10_df.columns = [top10_list]
上記の内容を関数にして使いまわせるようにする
#関数にする
#列を取り出すdf
pycaret_df
#importance が sort された df
importance_sort
#num に importance が sort された df から取り出したい数を選ぶ
def importance_sort_df(importance_sort,pycaret_df,num):
i_df=importance_sort
top10=i_df.iloc[0:int(num),:]
top10_list=top10["columns"]
dict_top10 = {}
for n,i in enumerate(top10_list):
#print(pycaret_df.loc[:,str(i)])
dict_top10[str(n)] = pycaret_df.loc[:,str(i)]
#pycaret_dict_top10[importance_sort_df[int(n)]] = pycaret_df.loc[:,str(i)]
pycaret_top10_df=pd.DataFrame(dict_top10)
pycaret_top10_df.columns = [top10_list]
return pycaret_top10_df
importance_s_df = importance_sort_df(importance_sort,pycaret_df,15)
importance_s_df
関数の使い方
importance_s_df = importance_sort_df(importance_sort,pycaret_df,15)
importance が sort された df を入れてください
importance_sort
列を取り出すdf を入れてください
pycaret_df
num の数字を変えると上位から取り出す importance の値を選べます
importance_s_df = importance_sort_df(importance_sort,pycaret_df,15)
importance_s_df
importance_s_df = importance_sort_df(importance_sort,pycaret_df,2)
importance_s_df
csvで保存して R言語 等で解析するのも便利です
importance_s_df = importance_sort_df(importance_sort,pycaret_df,10)
importance_s_df.to_csv(r""+"./output/"+"importance_s_df"+'.csv', encoding = 'shift-jis')