Bobo老师机器学习笔记第八课-如何防止过拟合和欠拟合?

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

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

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

通过上图可以看出:

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

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

举一个简单的例子: 上图中我们的数据是一个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

猜你喜欢

转载自blog.csdn.net/sxb0841901116/article/details/83997124