共计 1685 个字符,预计需要花费 5 分钟才能阅读完成。
为什么需要回归问题
回归问题在现实生活中无处不在。比如你想预测下个月的房价走势,或者预估一款新产品的销量,这些都是典型的回归问题。与分类问题不同,回归问题的输出是连续值,这使得它在很多实际场景中非常有用。

线性回归 vs 神经网络回归
线性回归是最简单的回归方法,它假设输入和输出之间存在线性关系。但当数据存在非线性关系时,线性回归的表现就会很糟糕。这时神经网络就派上用场了。
BP 神经网络(反向传播神经网络)通过多层非线性变换,可以拟合任意复杂的函数关系。特别是:
- 可以自动学习特征间的复杂交互
- 通过激活函数引入非线性
- 对噪声数据有一定鲁棒性
数据预处理
标准化 / 归一化
神经网络对输入数据的尺度很敏感,所以预处理是必须的。常见方法有:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
或者使用 MinMaxScaler 进行归一化:
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler(feature_range=(0, 1))
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
网络结构设计
设计 BP 网络时需要考虑:
- 隐藏层数量:通常 1 - 3 层足够解决大多数问题
- 神经元数量:可以从输入层大小的 1 / 2 到 2 倍开始尝试
- 激活函数:隐藏层常用 ReLU,输出层通常不用激活函数(回归问题)
损失函数选择
回归问题常用的损失函数:
- MSE(均方误差):对异常值敏感,但收敛快
- MAE(平均绝对误差):对异常值不敏感,但收敛慢
完整 Keras 示例
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.callbacks import EarlyStopping
import matplotlib.pyplot as plt
# 构建模型
model = Sequential([Dense(64, activation='relu', input_shape=(X_train.shape[1],)),
Dense(32, activation='relu'),
Dense(1) # 输出层不用激活函数
])
# 编译模型
model.compile(optimizer='adam', loss='mse')
# 设置早停
early_stop = EarlyStopping(monitor='val_loss', patience=10)
# 训练模型
history = model.fit(
X_train, y_train,
validation_data=(X_test, y_test),
epochs=100,
batch_size=32,
callbacks=[early_stop],
verbose=1
)
# 绘制训练曲线
plt.plot(history.history['loss'], label='train')
plt.plot(history.history['val_loss'], label='val')
plt.legend()
plt.show()
避坑指南
学习率设置
学习率太大容易震荡,太小收敛慢。可以从 0.001 开始尝试。
Batch Size 影响
- 太大:内存消耗大,收敛慢但稳定
- 太小:训练快但波动大
正则化方法
- L2 正则化:防止权重过大
- Dropout:随机丢弃神经元防止过拟合
进阶思考
- 如何处理输入特征量纲差异大的问题?
- 怎样判断当前模型是欠拟合还是过拟合?
- 当验证集 loss 上升但训练集 loss 下降时该如何调整?
希望这篇教程能帮助你快速上手 BP 神经网络回归任务。记住,实践出真知,多尝试不同的参数和结构,观察它们对模型性能的影响,这是提升模型能力的最佳途径。
正文完
