Sklearn:将成本复杂性修剪与管道一起应用

数据挖掘 机器学习 Python scikit-学习 决策树 数据科学模型
2021-09-16 06:34:34

我有一个包含分类变量的数据集。我已经定义了一个决策树算法,并使用 sklearn 中的一个热编码功能将这些列转换为数值等价物:

创建决策树分类器对象:

clf2 = DecisionTreeClassifier(criterion = 'entropy')
pipe = make_pipeline(column_trans, clf2)            # (1)
pipe.fit(X_train2,y_train2)

在哪里:

column_trans = make_column_transformer(
            (OneHotEncoder(),['ShelveLoc','Urban','US']),
             remainder = 'passthrough')

现在,当我在不使用 sklearn 而是直接使用 pandas 进行分类特征编码的情况下构建决策树时,我能够找到合适的 alpha 候选者来修剪决策树

path = clf.cost_complexity_pruning_path(X_train, y_train)
ccp_alphas = path.ccp_alphas
ccp_alphas = ccp_alphas[:-1] #remove max value of alpha

现在,当我尝试查找候选 alpha 时,我的模型在 (1) 中被烘焙到管道参数中

path = pipe.cost_complexity_pruning_path(X_train2, y_train2)

我收到一条错误消息,指出管道没有称为成本复杂性修剪的属性。并查看可用于管道的所有属性,我也找不到成本复杂性修剪。

如果您在不使用 Sklearn 中的管道功能的情况下构建模型,是否只能进行成本复杂性修剪?

2个回答

除了predict, predict_proba, transform. 如果您需要访问某个步骤的方法,您应该使用以下方法之一访问该步骤本身:

pipe[-1]
pipe['decisiontreeclassifier']
pipe.named_steps['decisiontreeclassifier']

但是,在这种情况下,它有点棘手,因为cost_complexity_pruning_path需要数据集X, y,但您需要先将管道的转换器应用于它。这有点麻烦,但我认为这应该可行并且相对简单:

pipe[-1].cost_complexity_pruning_path(
    pipe[:-1].transform(X),
    y,
)

(请注意,这pipe[-1]是管道中的最终估计器,并且pipe[:-1]是除最后一步之外的每一步。)

我第一次想出一个解决方法,虽然它很丑而且不会扩展:

alpha_candidates = (np.arange(0.0,0.5, 0.001)).tolist()
alpha_accuracy_list = []
# Create Decision Tree classifer object
for i in alpha_candidates:
    clf2_entropy_alpha = DecisionTreeClassifier(criterion = 'entropy', ccp_alpha= i,random_state=42)
    pipe = make_pipeline(column_trans, clf2_entropy_alpha)
    pipe.fit(X_train2,y_train2)
    y_pred2_entropy_alpha = pipe.predict(X_test2)
    alpha_accuracy = [i, metrics.accuracy_score(y_test2, y_pred2_entropy_alpha)] 
    alpha_accuracy_list.append(alpha_accuracy)

想法?