博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Bobo老师机器学习笔记第八课-如何防止过拟合和欠拟合?
阅读量:4171 次
发布时间:2019-05-26

本文共 1732 字,大约阅读时间需要 5 分钟。

问题一、什么是过拟合和欠拟合?

首先拟合是一个统计学概念,它表示所求函数逼近目标函数的远近程度。应用的机器学习中,就是我们所求的函数与未知的映射函数之间的相似度。如何求得函数参数与潜在的函数参数越逼近,说明效果越好。 

假设我们用上篇博客中的数据,源码可以见上文:

通过上图可以看出:

欠拟合是我们求得的模型测试集和训练集都不好

过拟合是我们求得模型在训练集表现好,在测试集表现不好 

举一个简单的例子: 上图中我们的数据是一个X的2次函数生产的点。 欠拟合求得模型是1次直线,而过拟合是求得X的10次方。

二、如何判断防止过拟合和欠拟合? 

步骤一:我们要对原数据进行分割,分为训练集和测试集

在sklearn中可以用train_test_split方法进行切分。

from sklearn.model_selection import train_test_split

步骤二:求出模型我们用均方差MSE的方法来评估算法,不了解MSE可以看

在sklearn中可以直接导入

from sklearn.metrics import mean_squared_error

这个值越小就说明越好,如下图,通过MSE可以看出,在degree=2为2的时候mse最小。

三、除了MSE,还有其他可视化过拟合和欠拟合的方法吗?

当然有,那就是学习曲线。那什么是学习曲线呢?学习曲线就是指训练模型在不同的训练集和测试集表现的曲线。 

这段代码时Bobo老师在讲学习曲线时候的代码。

def plot_learning_curve(algo, X_train, X_test, y_train, y_test):    train_score = []    test_score = []    for i in range(1, len(X_train)+1):        algo.fit(X_train[:i], y_train[:i])            y_train_predict = algo.predict(X_train[:i])        train_score.append(mean_squared_error(y_train[:i], y_train_predict))            y_test_predict = algo.predict(X_test)        test_score.append(mean_squared_error(y_test, y_test_predict))            plt.plot([i for i in range(1, len(X_train)+1)],                                np.sqrt(train_score), label="train")    plt.plot([i for i in range(1, len(X_train)+1)],                                np.sqrt(test_score), label="test")    plt.legend()    plt.axis([0, len(X_train)+1, 0, 4])    plt.show()    plot_learning_curve(LinearRegression(), X_train, X_test, y_train, y_test)

在这段代码中我们要注意:

1、第一参数algo是指训练模型

2、每次给模型训练的数据是递增的,从1到训练样本总长度

3、模型的评分指标还是用mean_squared_error这个方法。 

从上面三幅图看出:

欠拟合和最佳相比,Y轴的平衡数值大(最佳大约1左右,而欠拟合是1.8左右);达到平衡点是两者距离间距交大;达到平衡点所需要样本数更多

过拟合和最佳相比,数据波动太大,无法找到数据集的平衡点

由于篇幅关系,下一篇我们一起学习一下交叉验证,看看对过拟合有什么帮助

其他资料:

 

要是你在西安,感兴趣一起学习AIOPS,欢迎加入QQ群 860794445

 

转载地址:http://ghkai.baihongyu.com/

你可能感兴趣的文章
android中使用TextView来显示某个网址的内容,使用<ScrollView>来生成下拉列表框
查看>>
andorid里关于wifi的分析
查看>>
Hibernate和IBatis对比
查看>>
Spring MVC 教程,快速入门,深入分析
查看>>
Android 的source (需安装 git repo)
查看>>
LOCAL_PRELINK_MODULE和prelink-linux-arm.map
查看>>
Ubuntu Navicat for MySQL安装以及破解方案
查看>>
java多线程中的join方法详解
查看>>
idea添加gradle模块报错The project is already registered
查看>>
在C++中如何实现模板函数的外部调用
查看>>
HTML5学习之——HTML 5 拖放
查看>>
HTML5学习之——HTML 5 Canvas vs. SVG
查看>>
HTML5学习之——HTML 5 应用程序缓存
查看>>
HTML5学习之——HTML 5 Web Workers
查看>>
HTML5学习之——HTML 5 Canvas
查看>>
HTML5学习之——HTML5 内联 SVG
查看>>
HTML5学习之——HTML 5 服务器发送事件
查看>>
SVG学习之——HTML 页面中的 SVG
查看>>
SVG 形状学习之——SVG圆形
查看>>
SVG 滤镜学习之——SVG 滤镜
查看>>