过拟合是机器学习模型训练过程中常见的问题。它指模型对训练数据的拟合程度过高,而对测试数据的泛化能力较差。过拟合的原因主要有:
- 模型复杂度过高:模型参数太多,轻易地记忆训练集的pattern,而无法泛化。
- 训练集样本量过小:训练数据不足以学习约束模型复杂度,导致模型对noise和随机误差过敏感。
- 特征量过大:冗余和噪声特征会增加模型的不确定性,降低泛化能力。
常用的防止过拟合方法:
- 增加模型正则化:如L1/L2正则化,收缩系数,降低模型灵活度。
- 减少特征数量:使用特征选择方法选择重要特征,去除冗余和噪声特征。
- 增加训练数据量:更多数据可以使模型学到数据的真实pattern,增强泛化能力。
- 提前停止训练:当训练集和验证集的误差停止下降时停止训练,以防止过度拟合训练集。
- 简化模型:选择较简单的模型,减少模型的参数数量,降低模型的表达能力。
代码示例:
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)