学习如何判断是否过拟合 欠拟合 以及模型是否效果很好,这是三组数据:
数据似乎按照二次方程式很好的分布,我们尝试拟合三个模型,第一个线性(一次)模型,效果不是太好 因为欠拟合 所以是个偏差很高的模型,第二个是二次方程式模型 效果不错,第三个是六次多项式,过拟合了 因此是高方差的模型。
现在我们将画出一些曲线 以便区分这些模型,先从高偏差线性模型开始,我们先使用几个点训练该模型,然后逐步增加点的数量,如果用四个点训练该模型,那么可以很好地拟合训练集,因此训练误差很小,我们将误差绘制在右侧图表中,但是当我们评估交叉验证数据时,因为只使用四个点训练模型,模型效果不会太好,因此交叉验证的误差肯定很高 ,我们不会显示交叉验证集,但是你可以想象出该数据的其他随机子集,我们将交叉验证误差绘制在这里,现在增加到 8 个点 ,再次训练线性模型训练误差可能会增大一点点 ,因为拟合八个点比四个点要困难,但是因为模型效果稍微好些, 我们使用了更多的数据来训练它或许交叉验证误差降低了一点点但是幅度并不大, 因为这是一个尝试拟合二次数据的线性模型,这是训练误差和交叉验证误差,现在增多到 12 个点 ,重新训练模型,同样训练误差可能会增大一点点, 因为有更多的训练数据需要拟合,但是交叉验证误差也会再降低一点点,因为有一个用更多数据进行训练的更好模型了,但是依然不会降低太多,似乎随着点的数量越来越增多训练误差将不断增大 测试误差将不断下降 如果画出这两条曲线它们将越来越接近或许在某个点还会汇合,汇合的点应该很高,因为这两个模型是欠拟合的 ,它们的误差不会很小.
现在对二次方程式模型执行相同的操作:
和之前一样 用四个点进行训练,训练集的效果很好 因此训练误差很小,但是只用了非常少的点训练模型,因此交叉验证集的结果可能不太理想,如果将点增多到 8 个,训练误差增大了 因为有更多的点要拟合,但是因为模型用更多的点进行训练 了解的信息更多,所以验证误差下降了 如果使用 12 个点进行训练.出现同样的情况,训练误差增大了 交叉验证误差下降了,和之前一样 这两条曲线越来越接近,但是交点更低.
最后对六次模型执行相同的流程:
训练误差始终不会变得太大,因为过拟合的模型在训练集中效果会很好,因为它们可以很好地拟合,交叉验证误差始终不会太低,因为我们看过过拟合的模型在交叉验证集中效果不太好,当我们增多训练点时,但是不会汇集成一点,它们之间始终存在一定的距离.
Summary:
通过学习曲线检测过拟合和欠拟合
对于这道测验,我们将使用三个模型来训练下面的圆形数据集。
- 决策树模型,
- 逻辑回归模型,以及
- 支持向量机模型。
其中一个模型会过拟合,一个欠拟合,还有一个正常。首先,我们将编写代码为每个模型绘制学习曲线,最后我们将查看这些学习曲线,判断每个模型对应哪个曲线。
首先,请记住三个模型的学习曲线外观如下所示:
对于这道测验的第一部分,你只需取消注释其中一个分类器,并点击'测试答案'以查看学习曲线的图表。但是如果你喜欢编程的话,以下是一些编程详情。我们将使用函数 learning_curve
:
train_sizes, train_scores, test_scores = learning_curve(estimator, X, y, cv=None, n_jobs=1, train_sizes=np.linspace(.1, 1.0, num_trainings))
不需要担心该函数的所有参数(你可以在此处了解详情),这里,我们将解释主要参数:
estimator
,是我们针对数据使用的实际分类器,例如LogisticRegression()
或GradientBoostingClassifier()
。X
和y
是我们的数据,分别表示特征和标签。train_sizes
是用来在曲线上绘制每个点的数据大小。train_scores
是针对每组数据进行训练后的算法训练得分。test_scores
是针对每组数据进行训练后的算法测试得分。
两个重要的现象:
- 训练和测试得分是一个包含 3 个值的列表,这是因为函数使用了 3 折交叉验证。
- 非常重要:可以看出,我们使用训练和测试误差来定义我们的曲线,而这个函数使用训练和测试得分来定义曲线。二者是相反的,因此误差越高,得分就越低。因此,当你看到曲线时,你需要自己在脑中将它颠倒过来,以便与上面的曲线对比。
第 1 部分:绘制学习曲线
这里,我们将对比三个模型:
- 逻辑回归模型。
- 决策树模型。
- 支持向量机模型,具有 RBF 内核,γ 参数为 1000(稍后我们将了解它们的含义)。
# Import, read, and split data
import pandas as pd
data = pd.read_csv('data.csv')
import numpy as np
X = np.array(data[['x1', 'x2']])
y = np.array(data['y'])# Fix random seed
np.random.seed(55)### Imports
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.svm import SVC# TODO: Uncomment one of the three classifiers, and hit "Test Run"
# to see the learning curve. Use these to answer the quiz below.### Logistic Regression
#estimator = LogisticRegression() ### Decision Tree
#estimator = GradientBoostingClassifier()### Support Vector Machine
#estimator = SVC(kernel='rbf', gamma=1000)输出图像依次为下方三图
解决方案:检测过拟合与欠拟合
以下是你应该获得的曲线:
我们可以根据这些曲线得出结论:
- 对数几率回归模型的训练和测试得分很低。
- 决策树模型的训练和测试得分很高。
- 支持向量机模型的训练得分很高,测试得分很低。
由此可以判断,逻辑回归模型欠拟合,支持向量机模型过拟合,决策树正常。
同样,我们可以翻转这些曲线(因为它们测量的是得分,而原始曲线测量的是错误),并将它们与下面的三条曲线对比,可以看出它们与我们之前看到的三条曲线很像。(注意:我们需要翻转曲线并不意味着错误是 1 减去得分。只是表示模型越来越好的话,错误会降低,得分会升高。)
现在我们应该检测在实际模型中是否这样。当我们绘制每个模型的界限曲线时,结果如下所示:
当我们查看上述模型时,第一个模型欠拟合,第二个正常,第三个过拟合,这种现象合理吗?合理吧?我们看到数据由圆圈或方框正确地划分出来。我们的模型按以下形式划分数据:
- 逻辑回归模型使用一条直线,这太简单了。在训练集上的效果不太好,因此欠拟合。
- 决策树模型使用一个方形,拟合的很好,并能够泛化。因此,该模型效果很好。
- 支持向量机模型实际上在每个点周围都画了一个小圆圈。它实际上是在记住训练集,无法泛化。因此 过拟合。
最好尽可能进行实际检查,确保模型的确具有指标所指示的行为。