1
0

More than 1 year has passed since last update.

python feature_importanceが高い値のみ取り出した pandas を作成する関数

Last updated at Posted at 2022-09-08

機械学習(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 で前処理したのが以下のようなデータだった場合

image.png

インポータンスでソートした 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)

image.png

pandasにカラムをつける

pycaret_top10_df.columns = [top10_list]

image.png

上記の内容を関数にして使いまわせるようにする

#関数にする

#列を取り出す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

image.png

importance_s_df = importance_sort_df(importance_sort,pycaret_df,2)
importance_s_df

image.png

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')
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0