决策树回归器使用较少的特征作为我的输入
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])
所以我定义了一个简单的回归模型如下:
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])