首页 > 解决方案 > 决策树回归器使用较少的特征作为我的输入

问题描述

所以我定义了一个简单的回归模型如下:

from sklearn_pandas import DataFrameMapper
from sklearn.preprocessing import LabelBinarizer
from sklearn.pipeline import Pipeline
from sklearn import tree

max_depth = 3
min_samples_leaf = 100

X = df[categorical]
y = df['target_value']

mapper = DataFrameMapper( 
      [(i,LabelBinarizer()) for i in categorical]
)

mapper.fit(X)
X_mapped = mapper.transform(X)

model = tree.DecisionTreeRegressor(max_depth=max_depth,min_samples_leaf=min_samples_leaf)
model.fit(X_mapped,y)

现在我想提取学习特征的名称以进行有意义的可视化。我可以提取特征的名称,如下所示。这给了我一个包含 223 个功能的列表。然而,问题是我的模型只使用了 218 个特征(model.n_features_给出 218 个)。这意味着 5 个特征已经消失,现在我无法知道在决策树中进行了哪些拆分,因为不确定模型没有使用哪些变量。

names = []

for feature in mapper.features:
    try:
        for feature_value in feature[1].classes_:
            names.append(feature[0]+'_'+feature_value)
    except:
        names.append(feature[0]) 

当我输入 223 时,这棵树怎么可能只训练 218 个特征?以及我应该如何命名我的拆分功能?不冒给出错误结论的风险(即声称一个特性很重要,但它被错误地命名)

编辑:我发现映射器将 X 数据转换为 218 个特征,但给了我一个包含 223 个名称的列表。所以“问题”在于映射器。

标签: pythonscikit-learndecision-treemapper

解决方案


每当 LabelBinarizer(在本例中为 de mapper)遇到具有 2 个唯一值的分类值时,它会将其捕获在一列中(0 和 1 都表示该列的一个类)。这导致 1 列具有两个特征名称。我通过将名称收集功能编辑为:

names = []

for feature in model['mapper'].features:
    try:
        if len(feature[1].classes_) == 2:
            names.append(feature[0]+'_'+feature[1].classes_[1])
        else:
            for feature_value in feature[1].classes_:
                names.append(feature[0]+'_'+feature_value)
    except:
        names.append(feature[0]) 

推荐阅读