DecisionTreeClassifier 上的 GridSearchCV

Posted

技术标签:

【中文标题】DecisionTreeClassifier 上的 GridSearchCV【英文标题】:GridSearchCV on DecisionTreeClassifier 【发布时间】:2018-02-22 06:26:06 【问题描述】:

我试图在DecisionTreeClassifier 上运行GridSearchCV,唯一的超参数是max_depth。我运行它的两个版本是:

max_depth = range(1,20)

best_estimator_ attribute 显示 max_depth 为 15,而评分函数在测试集上显示为 0.8880

max_depth = range(1,15)

best_estimator_ attribute 的 max_depth 为 10,得分更高,为 0.8907。

我的问题是,如果 GridSearchCV 给出更好的分数,为什么不第一次选择 10 的 max_depth?

代码如下:

from sklearn.grid_search import GridSearchCV
from sklearn.metrics import make_scorer

clf = tree.DecisionTreeClassifier(random_state=7)

parameters = "max_depth": range(1,20), "random_state":[7]

scorer = make_scorer(fbeta_score,beta=0.5)

grid_obj = GridSearchCV(estimator=clf,param_grid=parameters,scoring=scorer)

grid_fit =grid_obj.fit(X_train,y_train)

best_clf = grid_fit.best_estimator_

predictions = (clf.fit(X_train, y_train)).predict(X_test)
best_predictions = best_clf.predict(X_test)

# Report the before-and-afterscores
print best_clf

print "\nOptimized Model\n------"
print "Final accuracy score on the testing data: 
:.4f".format(accuracy_score(y_test, best_predictions))
print "Final F-score on the testing data: :.4f".format(fbeta_score(y_test, 
best_predictions, beta = 0.5))

【问题讨论】:

你是不是把其他问题删了再重新添加,把cmets都扔掉了? 我做到了。除了两个 cmets 要求我添加代码之外,没有什么可以“扔掉”的,我照做了。 所以你删除它是为了让我看起来你确实在你的问题中准备了一些东西?再一次,你呈现的代码没有可重现的X_train, y_train 【参考方案1】:

您的问题

为什么 GridSearchCV 第一次不选择 10 的 max_depth 如果它给出更好的分数?

我的答案(据我所知,我通过太多过去的来源获得了无法引用的答案)

树越深入,它所学习的训练数据就越复杂。这被称为“过度拟合”,它可以很好地学习训练数据,但可能无法很好地概括看不见的数据。 为什么是默认超参数 max_depth=3 ?这是 sklearn 团队的设计决定。

但为什么是max_depth=3

开发人员可能会通过考虑适用于大多数用例的默认值来确定这一点。他们也可能已经确定 3 在未见数据上的泛化效果更好。

决策树是随机的

每次重新运行时,您都不会得到相同的best_estimator_。尝试使用random_state 使其每次都可重复。

【讨论】:

以上是关于DecisionTreeClassifier 上的 GridSearchCV的主要内容,如果未能解决你的问题,请参考以下文章

处理 sklearn.tree.DecisionTreeClassifier 中的连续变量

Scikit-learn 在 DecisionTreeClassifier 上使用 GridSearchCV

sklearn.tree.DecisionTreeClassifier 详细说明

DecisiontreeClassifier,为啥值的总和是错误的?

Sklearn 的 DecisionTreeClassifier 和 CART 的区别

sklearn 的 DecisionTreeClassifier 中的“拆分器”属性有啥作用?