如何在决策树分类器中解码编码标签

数据挖掘 机器学习 Python scikit-学习 决策树
2022-02-17 14:31:07

我有一些数据集,其中包含我实际工作的组织采购。目的是找到最重要的特征来描述为什么某些购买过程是成功的,以及为什么不成功。

为了解决这个问题,我使用了决策树分类器。

首先,我将布尔列转换为 int

for col in ['flag_prequalification', 'flag_procurement_category_strategy']:
data.loc[:, col] = data.loc[:, col].astype(int)

然后,将对象类型转换为字符串。这用于标签编码

for cat_feature in categorical_features:
    data.loc[:, cat_feature] = data.loc[:, cat_feature].fillna('unknown').astype(str)
%%time
encoder = defaultdict(LabelEncoder)
data.loc[:, categorical_features] = (
    data
    .loc[:, categorical_features]
    .apply(lambda x: encoder[x.name].fit_transform(x), axis=0)
)

之后,让我们使用 log(sum) 代替 sum

for col in ['sum_tru_no_nds (lot)', 'price (lot)', 'count (lot)']:
data[col] = (data[col] + 1).apply(np.log)

并且,最后绘制树:

from sklearn.externals.six import StringIO  
from IPython.display import Image  
from sklearn.tree import export_graphviz
import pydotplus

import graphviz
# DOT data
dot_data = tree.export_graphviz(clf, out_file=None, 
                                feature_names=None,  
                                class_names=target_col,
                                filled=True)

# Draw graph
graph = graphviz.Source(dot_data, format="png") 
graph

在此处输入图像描述

问题是,我如何向其他人解释这棵树,更准确地说,我如何解码树中的这个标签?

2个回答

首先,设置feature_names将取代所有X[2]这些。使用feature_names=data.columns是明智的,前提是您的功能名称不会太长以便于显示。

现在,您仍将与标签编码进行比较。通过保存标签编码器对象(您的encoder字典),您可以检索哪些级别对应于整数标签(使用classes_属性,或者可能是inverse_transform方法)。如果您的功能有多个级别,那么您可能不想在每个拆分中显示所有级别,而将它们提供到某处可能是最好的。如果您的功能级别很少,那么破解生成的 DOT 代码可能会起作用;请参阅我的这个相关答案,它涉及单热编码变量。

由于您已经在使用 scikit-learn 来拟合决策树,因此您应该使用 scikit-learn 来对特征进行编码。例如,scikit-learn 的OneHotEncoder具有get_feature_names为输出特征返回特征名称的属性。