在决策树中缩放数据改变了我的结果?

Posted

技术标签:

【中文标题】在决策树中缩放数据改变了我的结果?【英文标题】:Scaling the data in a decision tree changed my results? 【发布时间】:2016-10-09 05:39:13 【问题描述】:

我知道决策树不会受到缩放数据的影响,但是当我在决策树中缩放数据时,它会给我带来糟糕的性能(召回率、精度和准确度都不好)

但是,当我不扩展所有性能指标时,决策树会给我带来惊人的结果。这怎么可能?

注意:我使用 GridSearchCV 但我不认为交叉验证是我的问题的原因。这是我的代码:

scaled = MinMaxScaler()

pca = PCA()

bestK = SelectKBest()

combined_transformers = FeatureUnion([ ("scale",scaled),("best", bestK),         
("pca", pca)])

clf = tree.DecisionTreeClassifier(class_weight= "balanced")

pipeline = Pipeline([("features", combined_transformers), ("tree", clf)])

param_grid = dict(features__pca__n_components=[1, 2,3],
      features__best__k=[1, 2,3],
      tree__min_samples_split=[4,5],
      tree__max_depth= [4,5],
     )

grid_search = GridSearchCV(pipeline, param_grid=param_grid,scoring='f1')
grid_search.fit(features,labels)

使用缩放函数 MinMaxScaler() 我的表现是:

f1 =  0.837209302326
recall =  1.0
precision =  0.72
accuracy =  0.948148148148

但没有缩放:

f1 =  0.918918918919
recall =  0.944444444444
precision =  0.894736842105
accuracy =  0.977777777778

【问题讨论】:

【参考方案1】:

我不熟悉 scikit-learn,如果我有什么误解,请见谅。

首先,PCA 是否标准化功能?如果没有,它将为缩放和非缩放输入给出不同的结果。

其次,由于拆分样本的随机性,CV 可能在每次运行时给出不同的结果。这将影响结果,尤其是对于小样本量。此外,如果您的样本量很小,结果可能并没有那么不同。

我有以下建议:

    可以将缩放视为额外的超参数,可以通过 CV 对其进行优化。 执行额外的 CV(称为嵌套 CV)或保留以估计性能。这是通过保留一个测试集,在训练数据上使用 CV 选择模型,然后评估它在测试集上的性能来完成的(在嵌套 CV 的情况下,您对所有折叠重复执行此操作并平均性能估计)。当然,您的最终模型应该在整个数据集上进行训练。通常,您不应使用用于模型选择的 CV 的性能估计,因为它会过于乐观。

【讨论】:

如果我已经交叉验证了我的最终模型,为什么还要在整个数据上进行训练?第二,你的意思是我在整个数据上训练它还是只在训练数据上训练它?

以上是关于在决策树中缩放数据改变了我的结果?的主要内容,如果未能解决你的问题,请参考以下文章

应用一个热编码器后如何改变决策树的特征阈值?

在决策树中寻找连续数据阈值的方法

在决策树中权衡样本

为啥我们不能在决策树中随机启动根节点?

如何返回在 sklearn 中由 DecisionTreeClassifier 创建的决策树中使用的特征

弄清楚为啥 scikit-learn DecisionTreeClassifier 决定从结果决策树中排除一个特征?