1.基本概念
过拟合与欠拟合
- 过拟合(学成书呆子了):指模型在训练集上表现优秀,在测试集上表现很差
- 欠拟合(还没学明白):指模型难以学习已有的规律,在训练集和测试集上表现得都很差;或是模型过早的停止训练
根据学习曲线判断过拟合、欠拟合
在实际的使用过程中,过拟合、欠拟合是一个较为主观的评价,没有一个指标能拍板说它就是过拟合了、或就是欠拟合了。而且,过拟合与欠拟合实际上并不是相对的概念,即并未非此即彼,往往:
- 模型效果太差:欠拟合
- 模型在训练集上还可以,但测试集上太差:过拟合
- 模型训练集和测试集都还行:不存在过拟合与欠拟合
下面是一个例子:
![在这里插入图片描述](https://img-blog.csdnimg.cn/8ff37ff7d5bd4a388124e8392d91024f.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZGG6JCM55qE5LujTWE=,size_20,color_FFFFFF,t_70,g_se,x_16)
上图是一个比较经典的示意图:
- 左上角:我们看到随着训练数据的增加(随着x不断增加),准确率趋于稳定,意味着:再添加更多数据,已经无法使模型更好了,说明模型已经到极限了,这就是正常的。但是此时模型的准确率也太低了,如果我们的预期是红色的线,说明模型已经尽力了,也无法达到我们的预测,此时它就是
欠拟合
的。
- 右上角:我们看到训练的曲线与验证的曲线相差加大(两条线离的有点远),即:在训练集上效果还行(绿色虚线比较高),但验证集上效果不行(蓝色实线),此时为
过拟合
- 右下角:完美,既不存在过拟合也不存在欠拟合
2.示例代码:绘制学习曲线
import numpy as np
import matplotlib.pyplot as plt
from sklearn.svm import SVC
from sklearn.model_selection import learning_curve
import seaborn as sns
from sklearn.datasets import make_classification
def main():
data_x, data_y = make_classification(n_samples=1000, n_classes=4, n_features=10, n_informative=8) # 生成分类任务
# 绘制学习曲线
model = SVC(kernel="linear")
train_sizes, train_scores, valid_scores = learning_curve(
model, data_x, data_y, train_sizes=np.linspace(0.1, 1.0, 10), cv=5, random_state=0)
train_scores_mean = np.mean(train_scores, axis=1) # 纵向求平均
valid_scores_mean = np.mean(valid_scores, axis=1)
# 开始绘图
sns.set()
sns.lineplot(x=train_sizes, y=train_scores_mean, label="train")
sns.lineplot(x=train_sizes, y=valid_scores_mean, label="valid")
plt.xlabel("data")
plt.ylabel("acc")
plt.title("SVM linear")
plt.show()
if __name__ == '__main__':
main()
得到结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/2c8fb4ea8bed41ae8b9b3081ee6d10a9.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZGG6JCM55qE5LujTWE=,size_20,color_FFFFFF,t_70,g_se,x_16)
3.解决过拟合、欠拟合
我们可以参考这个图
![在这里插入图片描述](https://img-blog.csdnimg.cn/b5f3a82602e845f6b9c82aa4a0b512c5.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZGG6JCM55qE5LujTWE=,size_14,color_FFFFFF,t_70,g_se,x_16)
解决过拟合
核心:降低模型复杂度,或增加数据的复杂程度
- 降低模型复杂度
- L1\L2\Dropout 正则化(这里Dropout是深度学习中的方法:随机将一些连接置零)
- Early stopping (提前终止)
- 通过数据增强处理数据
解决欠拟合
欠拟合基本上都会发生在训练刚开始的时候,因此解决欠拟合的核心是:增加模型复杂度,或降低数据的学习难度
- 增加模型复杂度
- 增加数据量
- 增加特征
4. 过拟合、欠拟合的深层理解
评价模型的指标,就是在已有的数据上平衡两种东西:表现出偏差
与方差
- 简单的模型拥有测试集上更大的偏差,但由于整体不复杂,因此偏差的方差较小,某种程度上称欠拟合;
- 复杂的模型拥有测试集上更小的偏差,但由于较为复杂,因此偏差的方差较大,称过拟合;
如果是较大的偏差较大的方差,则说明模型废了;较小的偏差与较小的方差是我们努力的方向!
![在这里插入图片描述](https://img-blog.csdnimg.cn/2d669457588c44f38a6c4ee3ec00a4bb.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ZGG6JCM55qE5LujTWE=,size_20,color_FFFFFF,t_70,g_se,x_16)