欠拟合是机器学习模型训练过程中另一个常见问题。它指模型对训练数据和测试数据的拟合程度均较差。欠拟合的主要原因有:
- 模型复杂度过低:模型的表达能力有限,无法很好地拟合训练数据的trend。
- 训练数据量过小:训练数据不足以让模型学习到数据的pattern。
- 特征量不足:特征空间不能很好地描述数据,导致模型学习不到数据真实的mapping关系。
常用的防止欠拟合方法:
- 增加模型复杂度:使用更高参数模型,或增加模型层数,增强表达能力。
- 增加训练数据量:更多数据可以让模型学习到数据的真实特征,增强拟合能力。
- 增加特征数量:添加更多有意义的特征,丰富特征空间,帮助模型学习trend。
- 减小正则化强度:适当减小正则化参数,增大模型自由度,提高对训练数据的拟合程度。
- 提供数据增强:对原始数据进行变换,生成更多训练样本,增强模型学习数据分布的能力。
代码示例:
增加模型复杂度:
python
from keras.models import Sequential
from keras.layers import Dense
model = Sequential([Dense(32, input_shape=(8,)), Dense(16), Dense(1)])
model.compile(loss='mse', optimizer='adam')
model.fit(x_train, y_train)
增加训练数据:
python
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y,
train_size=0.9, test_size=0.1, random_state=1)
model.fit(x_train, y_train)
增加特征:
python
x = np.concatenate((x, x ** 2, np.sqrt(x)), axis=1)
# 添加二次项特征和开根号特征
减小正则化:
python
from sklearn.linear_model import Ridge
ridge = Ridge(alpha=0.1, normalize=True)
# alpha参数调小
ridge.fit(x_train, y_train)
数据增强:
python
rotated_x = np.rot90(x, k=1, axes=(1,2))
flipped_x = np.fliplr(x)
x = np.concatenate((x, rotated_x, flipped_x), axis=0)
# 旋转和翻转生成新的训练样本