本文共 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/