过拟合与欠拟合
过拟合与欠拟合图解
欠拟合:个人理解就是由于数据少、正则化太厉害、模型复杂度太简单等原因,导致模型没有学习到足够的规律,准确率与模型可达到的准确率差距较大。但是模型在训练集和测试集的曲线趋势是正常收敛的。
解决方法为有:
- 增加特征,寻找与标签相关性较大的特征,在保证特征没有共线性的前提下,增加特征的数量;
- 减少正则化,正则化目的是在牺牲训练集上部分准确率的前提下,使得模型的泛化能力增强。在模型未过拟合前,可以适当降低正则化的程度,提高准确率;
- 增加模型复杂度或选择更复杂的模型。比如非线性分类问题,如果选择了简单的线性分类器,准确率较低,如果选择神经网络等非线性算法,则会有较好的拟合效果。
过拟合:个人理解就是模型复杂度过高、特征过多问题、缺乏正则化等原因,导致模型在训练集学习到了太多的只有训练集特有的规律,使得模型在训练集准确率超高,但在测试集上预测不准确的现象,模型的泛化能力变差。
解决方法:
最终目的就是要弱化模型学到的训练集里的特有规律。
- 增加正则化,正则化可以弱化训练集里的特有规律,使得模型泛化能力提高,但在训练集的准确率稍有降低。
- 增加训练样本数量,使得样本集尽量是完备的,可以代表当前的业务尝尽。
- 减少特征,在尽量保证剩余特征含有更多信息的前提下,减少特征的数量,可以适当提高模型的泛化能力,比如使用PCA降维。
- 考虑是否可以更换为更简单的算法来建模。(这个方法最后使用,毕竟更换算法相当于更换了思路)
绘制学习曲线
使用sklearn的learning_curve为例,模型使用岭回归。learning_curve可以选择使用多少个训练数据计算在验证集的评价分数score。
X_train,y_train为训练样本,用户可以用自己已有的数据来实验
reg = linear_model.Ridge(alpha=0)
#trainsize如果使用小数的话,数值在(0,1),表示训练集的样本比例。如果是整数的的话(1,len(X_train)),表示训练样本数,不建议用训练样本数,比较麻烦。
trainsize = np.linspace(0.001,0.999,20)
train_sizes, train_scores, valid_scores = learning_curve(reg, X_train, y_train, train_sizes=trainsize, cv=4)
#由于cv=4,每一组数据都有4个结果,这里使用结果的均值
train_std=train_scores.mean(axis=1)
test_std=valid_scores.mean(axis=1)
#画图
fig,axes = plt.subplots(1,1)
axes.plot(train_sizes,train_std,color=‘red’)
axes.plot(train_sizes,test_std,color=‘blue’)
plt.show()
总结
这里代码是使用sklearn的learning_curve函数,另一篇文章是手动编写的使用mse来绘制学习曲线
来源:CSDN
作者:GreenYang5277
链接:https://blog.csdn.net/GreenYang5277/article/details/103681048