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


## 機械学習(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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629668/c49c0d6e-ef3d-54ba-4b00-d15b0b057062.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629668/14db4e14-ef82-e47d-8882-d204459de96e.png)


## pandasにカラムをつける

```
pycaret_top10_df.columns = [top10_list]
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629668/bcff090a-e52c-b19b-aa1a-38a59356e60b.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629668/c4202e51-a012-9d04-ade0-8941da90569d.png)

```
importance_s_df = importance_sort_df(importance_sort,pycaret_df,2)
importance_s_df
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629668/1ff1a720-218a-1aa6-e54d-de628979c876.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')
```