什么是过拟合和欠拟合,如何避免它们?代码举例讲解

过拟合和欠拟合都是机器学习模型常见的问题。

过拟合(Overfitting):模型过于复杂,学习训练数据集的噪声和随机误差,而不能泛化到新数据。表现为训练准确率很高但测试准确率很低。

欠拟合(Underfitting):模型过于简单,不能捕捉训练数据的模式,导致训练准确率和测试准确率都很低。

常用的避免过拟合和欠拟合的方法有:

  1. 增加数据集量:更多数据可以学习真实的模式,减少噪声影响。
  2. 减少特征数量:选取与目标高度相关的特征,删除冗余特征。可以减小模型复杂度。
  3. 正则化:引入正则化项惩罚模型复杂度,如L1/L2正则化。 Ridge/Lasso回归使用L2正则化。
  4. dropout:随机忽略神经网络的一些节点和连接,减少过拟合。
  5. 交叉验证:使用训练数据集的子集进行验证,选择模型的最佳复杂度。
  6. 权重衰减:随着网络深度增加,逐渐减小权重大小,减轻过拟合。

代码示例:

python
# 增加数据集
df = pd.read_csv('more_data.csv')  

# L1正则化(LASSO)
from sklearn.linear_model import Lasso
lasso = Lasso(alpha=0.1)

# 垂直dropout 
model.add(layers.Dropout(0.2))  

# 5折交叉验证 
from sklearn.model_selection import cross_val_score
scores = cross_val_score(model, X, y, cv=5)

# 权重衰减
model.add(layers.Dense(64, activation='relu', 
                       kernel_regularizer=tf.keras.regularizers.l2(0.01)))