lightgbm.create_tree_digraph() 只显示一个特征的树而不是所有特征

lightgbm.create_tree_digraph() only show tree of one feature instead of all features

我已经建立了一个用于分类目的的 LightGBM 模型。我想使用 lightgbm.create_tree_digraph 从我的 LightGBM 模型构建一棵树。但是,它没有显示树中的所有特征,而是只显示 Purpose_Of_Loan 个特征。我真的很想看到树中可视化的所有功能。训练集中共有 12 个特征。任何帮助将不胜感激。

特点:

Loan_Amount_Requested      float64
Length_Employed            float64
Home_Owner                   int64
Annual_Income              float64
Income_Verified              int64
Purpose_Of_Loan              int64
Debt_To_Income             float64
Inquiries_Last_6Mo           int64
Months_Since_Deliquency    float64
Number_Open_Accounts         int64
Total_Accounts               int64
Gender                       int64

注意:Home_Owner, Income_Verified, Purpose_Of_Loan 是分类特征。

分类器代码:

clf = LGBMClassifier(nthread=4,
                    n_estimators=100, 
                    learning_rate=0.05,
                    bagging_fraction= 1, 
                    feature_fraction= 0.1, 
                    lambda_l1= 5, 
                    lambda_l2= 0, 
                    max_depth= 5, 
                    min_child_weight= 5, 
                    min_split_gain= 0.001, 
                    is_unbalance = True,
                    num_leaves= 36)

clf.fit(X, y)

绘制树代码:

viz = lightgbm.create_tree_digraph(clf.booster_)
viz

输出:

I would really like to see all of the features visualized in a tree

LightGBM 不保证每个功能都会被使用。

在生长每棵树时,LightGBM 一次添加一个拆分((feature, threshold) 组合),选择提供最佳“增益”的拆分(objective 函数中的更改)。这就是如何在树中选择一个特征的多个拆分,就像在您的示例中一样,以及如何可能永远不会为任何拆分选择信息量不大的特征。

训练后,您可以使用 Booster.feature_importance(importance_type="split") 检查每个特征被选择进行分割的频率。您可以将关键字参数 iteration 传递给该方法以仅查看某些迭代的此信息,例如iteration=5 查看在前 6 棵树中 选择每个特征的频率

考虑以下示例(在 Python 3.8 中使用 lightgbm==3.3.1)。

import lightgbm as lgb
import pandas as pd
from sklearn.datasets import load_breast_cancer

X, y = load_breast_cancer(return_X_y=True)
data = lgb.Dataset(X, label=y)

# train model
bst = lgb.train(
    params={
        "objective": "binary",
        "verbose": -1
    },
    train_set=data,
    num_boost_round=10
)

# compute importances
importance_df = (
    pd.DataFrame({
        'feature_name': bst.feature_name(),
        'importance_split': bst.feature_importance(importance_type='split', iteration=-1),
    })
    .sort_values('importance_split', ascending=False)
    .reset_index(drop=True)
)
print(importance_df)

此代码产生以下输出。

   feature_name  importance_split
0     Column_21                24
1     Column_28                19
2     Column_27                19
3      Column_1                15
4     Column_10                14

这表示“为 24 次拆分选择了特征 Column_21,为 19 次拆分选择了特征 Column_28,等等。”。