什么是过拟合?如何防止过拟合?代码举例讲解

过拟合是机器学习模型训练过程中常见的问题。它指模型对训练数据的拟合程度过高,而对测试数据的泛化能力较差。过拟合的原因主要有:

  1. 模型复杂度过高:模型参数太多,轻易地记忆训练集的pattern,而无法泛化。
  2. 训练集样本量过小:训练数据不足以学习约束模型复杂度,导致模型对noise和随机误差过敏感。
  3. 特征量过大:冗余和噪声特征会增加模型的不确定性,降低泛化能力。

常用的防止过拟合方法:

  1. 增加模型正则化:如L1/L2正则化,收缩系数,降低模型灵活度。
  2. 减少特征数量:使用特征选择方法选择重要特征,去除冗余和噪声特征。
  3. 增加训练数据量:更多数据可以使模型学到数据的真实pattern,增强泛化能力。
  4. 提前停止训练:当训练集和验证集的误差停止下降时停止训练,以防止过度拟合训练集。
  5. 简化模型:选择较简单的模型,减少模型的参数数量,降低模型的表达能力。

代码示例:

L2正则化:

python
from sklearn.linear_model import Ridge

ridge = Ridge(alpha=0.5, normalize=True)  
ridge.fit(x_train, y_train)

特征选择:

python
from sklearn.feature_selection import SelectFromModel

feature_selector = SelectFromModel(ridge, threshold=0.25)  
x_train_selected = feature_selector.fit_transform(x_train, y_train)

提前停止:

python
from keras.callbacks import EarlyStopping  

early_stopping = EarlyStopping(monitor='val_loss', patience=3) 
model.fit(x_train, y_train, epochs=100, validation_split=0.2, callbacks=[early_stopping])

简化模型:

python 
from keras.models import Sequential
from keras.layers import Dense  

model = Sequential([Dense(6, input_shape=(8,)), Dense(1)]) 
model.compile(loss='mse', optimizer='adam')
model.fit(x_train, y_train)