决策树回归器使用较少的特征作为我的输入

Decision tree regressor used less features as my input

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

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]) 

树怎么可能只训练了 218 个特征而我输入了 223 个特征?以及我应该如何命名拆分的特征?没有 运行 给出错误结论的风险(即声称一个特征很重要,但它被错误命名)

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

只要 LabelBinarizer(在本例中是去映射器)遇到具有 2 个唯一值的分类值,它就会将其捕获在一列中(0 和 1 都代表该列的 class)。这导致 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])