SkLearn 的决策树:过度拟合还是错误?

Posted

技术标签:

【中文标题】SkLearn 的决策树:过度拟合还是错误?【英文标题】:Decision Tree Of SkLearn: Overfitting or Bug? 【发布时间】:2014-07-19 16:46:31 【问题描述】:

我正在使用 sklearn 的 tree 包分析我的决策树模型的训练误差和验证误差。

#compute the rms error
def compute_error(x, y, model):
 yfit = model.predict(x.toarray())
 return np.mean(y != yfit) 

def drawLearningCurve(model,xTrain, yTrain, xTest, yTest):
 sizes = np.linspace(2, 25000, 50).astype(int)
 train_error = np.zeros(sizes.shape)
 crossval_error = np.zeros(sizes.shape)

 for i,size in enumerate(sizes):

  model = model.fit(xTrain[:size,:].toarray(),yTrain[:size])

  #compute the validation error
  crossval_error[i] = compute_error(xTest,yTest,model)

  #compute the training error
  train_error[i] = compute_error(xTrain[:size,:],yTrain[:size],model)

from sklearn import tree
clf = tree.DecisionTreeClassifier()
drawLearningCurve(clf, xtr, ytr, xte, yte)

问题是(我不知道是不是问题)如果我将决策树作为模型给函数drawLearningCurve,我在每个循环中都会收到训练错误的结果0.0。它与我的数据集的性质有关,还是与 sklearn 的树包的性质有关?还是有什么问题?

PS:在其他模型(如 naive-bayes、knn 或 ann)上,训练误差绝对不是 0.0。

【问题讨论】:

使用决策树作为分类器完全有可能得到 0.0 的训练误差,尤其是在没有两个具有相同输入变量和不同输出变量(分类类别)的观察值的情况下。显然,在这种情况下,您会受到大量过度拟合的影响。请注意,我说的是一般性,因为我不知道您的数据集的性质。 由于您使用的是稀疏矩阵,因此您可能有很多特征,并且使用默认设置,如果具有许多特征的数据上的决策树会严重过度拟合,我不会感到惊讶。也就是说,我投票决定关闭,因为如果不查看您的数据就无法确定发生了什么。您应该尝试不同的设置(例如使用GridSearchCV)。 我也尝试了不同的设置,但仍然给出相同的结果。我相信有什么问题,但我不知道它在哪里。无论如何,我更喜欢使用其他算法而不是决策树。 【参考方案1】:

表扬给出了一些非常有用的方向。我只想添加您可能想要调整的参数称为max_depth

更让我担心的是你的compute_error 函数很奇怪。您收到0 错误的事实表明您的分类器在训练集上没有出错。但是,如果它确实犯了任何错误,您的错误函数不会告诉您。

import numpy as np
np.mean([0,0,0,0] != [0,0,0,0]) # perfect match, error is 0
0.0

np.mean([0,0,0,0] != [1, 1, 1, 1]) # 100% wrong answers
1.0

np.mean([0,0,0,0] != [1, 1, 1, 0]) # 75% wrong answers
1.0

np.mean([0,0,0,0] != [1, 1, 0, 0]) # 50% wrong answers
1.0

np.mean([0,0,0,0] != [1, 1, 2, 2]) # 50% wrong answers
1.0

你要的是np.sum(y != yfit),或者更好的是sklearn自带的错误函数之一,比如accuracy_score

【讨论】:

以上是关于SkLearn 的决策树:过度拟合还是错误?的主要内容,如果未能解决你的问题,请参考以下文章

使用 sklearn 同时使用数字和分类变量来拟合决策树

随机森林为啥不会过度拟合

决策树——是不是过拟合?

机器学习 | 决策树 (sklearn) 官方文档

3.决策树学习

决策树决策树调参