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
,等等。”。
我已经建立了一个用于分类目的的 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
,等等。”。