决策树的默认参数比使用 GridsearchCV 优化的参数提供更好的结果

数据挖掘 决策树 网格搜索 网格搜索
2021-09-24 13:10:09

我正在使用 Gridsearch 来预测二元结果的 DecisionTreeClassifier。当我使用默认参数运行拟合和预测时,我得到以下结果:

Accuracy: 0.9602242115860793
F1: 0.9581087077004674

然后我尝试 GridsearchCV:

from sklearn.model_selection import GridSearchCV

param_grid = {"criterion": ["gini", "entropy"],
              "min_samples_split": [2, 10],
              "max_depth": [2, 5, 10]
              }

grid = GridSearchCV(dtc, param_grid, cv=3, scoring='neg_mean_squared_error')


grid.fit(X_train, y_train.values.ravel())

y_pred_class = grid.predict(X_test)

当我检查 y_pred 中的结果时,它们只包含一个类 (0),因此当我尝试查看 F1 时会收到警告:

site-packages\sklearn\metrics\classification.py:1135:UndefinedMetricWarning:F 分数定义不明确,在没有预测样本的标签中设置为 0.0。“精度”、“预测”、平均值、warn_for)

谁能建议这里可能出现的问题以及为什么最佳参数对整个集合给出相同的预测?

回答:由于我的数据集中有这么多特征,限制使用指定值拆分的最大深度和最小样本无法给出足够的结果。添加无并增加范围解决了这个问题。

4个回答

我的建议:

类的内在分离需要更复杂的模型来捕获。我这么说是因为默认模型和网格搜索之间的区别在于max_depth参数,它是决策树中的复杂性指标之一。默认值为,因此它使用可以从 max_depth 获得的最大复杂度,但您的参数值最多为 10。要检查这一点,您可以尝试在网格搜索中增加 max_depth(或将其保留为无)并查看网格的结果搜索。如果它有所改善,那么这就是重点。

您从网格搜索中获得的结果是网格搜索中给出的该范围内的最佳参数,然后所有此类情况都根据提到的性能参数(准确度、AUC、精度、F1 分数等)进行测试。选择最好的一个。

您得到的结果是上述参数范围内的最佳结果。通过更改每个超参数的值范围,您可能会获得更好的结果。

我使用的一种方法是双向方法。首先,获取更长的参数范围,并在您获得的位置进行粗略搜索,并了解需要为参数搜索提供的近似范围。

其次,进行网格搜索,但这次通过从第一步获得的直觉和近似值中选择范围来进行精细搜索。

同样,您将获得有助于调整模型的所有参数的最佳值。

首先尝试 RandomizedSearchCV 以缩小搜索范围。然后,您可以使用 GridsearchCV 在找到的范围内尝试参数以获得最佳估计器。

我在 StackOverflow 上看到了类似的问题

根据sklearn 文档,在UndefinedMetricWarning时提出因此,在您的 CV 折叠中,您会遇到模型无法预测阳性或折叠中没有阳性的情况。TP + FP == 0TP + FN == 0

对于您关于性能的问题,我鼓励您扩大在网格搜索中搜索的参数并包括默认参数,因此您总比完全不使用网格搜索要好。

此外,我建议您查看随机网格搜索,其中并未尝试所有参数,而是尝试了固定数量的参数设置。通过这种方式,您可以限制网格搜索所花费的时间,但不会遇到您可能“错过”一个非常好的参数设置的问题。查看这篇博文,了解有关 GS VS Randomized GS 的更多详细信息。