【问题标题】:Very low test score result in sklearn diabetes dataset on plotting the learning curve with decision tree在用决策树绘制学习曲线时,sklearn 糖尿病数据集的测试分数非常低
【发布时间】:2016-06-24 23:13:43
【问题描述】:

我有一个关于 sklearn 上的糖尿病数据集的问题。我正在尝试绘制一种估计器的学习曲线,但不知何故我有警告:

"D:\Users\XXXX\Anaconda2\lib\site-packages\sklearn\cross_validation.p ing: y 中人口最少的类只有 1 个成员,这也是 任何类的最小标签数不能小于 n_folds=3。"

并且代码正在绘制一个奇怪的结果。训练数据集的得分非常高(总是 1,这可能是有道理的,因为它是一棵树),但测试得分表现很差(最​​好是 0.03125)

我在不同的数据集(数字)中尝试过,效果很好。我的代码如下:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_diabetes
from sklearn.learning_curve import learning_curve
from sklearn import tree


diabetes = load_diabetes()
X, y = diabetes.data, diabetes.target


estimator = tree.DecisionTreeClassifier()
estimator.fit(X, y)

title = "Learning Curves Decision Tree"
plt.figure(1)
plt.title(title)
plt.xlabel("Training examples")
plt.ylabel("Score")
train_sizes, train_scores, test_scores = learning_curve(estimator, X, y)

print train_sizes
print train_scores
print test_scores

plt.grid()
plt.plot(train_sizes, train_scores, 'o-', color="r",label="Training score")
plt.plot(train_sizes, test_scores, 'o-', color="g",label="Cross-validation score")

plt.legend(loc="best")

plt.show()

谁能解释一下为什么会这样?谢谢

【问题讨论】:

    标签: python machine-learning scikit-learn supervised-learning


    【解决方案1】:

    diabetes 数据集代表regression problem rather than a classification problem,因此不适合测试DecisionTreeClassifier。根据the docs

    糖尿病数据集包含 442 名患者的 10 个生理变量(年龄、性别、体重、血压)测量值,以及一年后疾病进展的指标

    target 向量应被视为您需要预测其值的连续(或至少有序)因变量,而不是一组类别。

    如果您将target 视为一组类标签,那么您最终会得到总共 214 个类,其中大多数只有一个成员(因此出现警告消息)。在这种情况下,您拟合的决策树本质上就像一个“查找表”,可以完美地将训练集中的每个 X 值映射到其对应的 y 值,但对于交叉中未见过的示例的预测值为零-验证集。这是overfitting的一个特别极端的例子。

    【讨论】:

      猜你喜欢
      • 2019-02-15
      • 2020-12-06
      • 2015-12-13
      • 2023-04-04
      • 2019-11-11
      • 2017-06-14
      • 2019-07-04
      • 2018-06-23
      • 1970-01-01
      相关资源
      最近更新 更多