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

欠拟合是机器学习模型训练过程中另一个常见问题。它指模型对训练数据和测试数据的拟合程度均较差。欠拟合的主要原因有:

  1. 模型复杂度过低:模型的表达能力有限,无法很好地拟合训练数据的trend。
  2. 训练数据量过小:训练数据不足以让模型学习到数据的pattern。
  3. 特征量不足:特征空间不能很好地描述数据,导致模型学习不到数据真实的mapping关系。

常用的防止欠拟合方法:

  1. 增加模型复杂度:使用更高参数模型,或增加模型层数,增强表达能力。
  2. 增加训练数据量:更多数据可以让模型学习到数据的真实特征,增强拟合能力。
  3. 增加特征数量:添加更多有意义的特征,丰富特征空间,帮助模型学习trend。
  4. 减小正则化强度:适当减小正则化参数,增大模型自由度,提高对训练数据的拟合程度。
  5. 提供数据增强:对原始数据进行变换,生成更多训练样本,增强模型学习数据分布的能力。

代码示例:

增加模型复杂度:

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)  
# 旋转和翻转生成新的训练样本