一、代码说明
本代码基于模拟房价数据集,使用scikit-learn库中的MLPRegressor(多层感知器回归)实现神经网络模型,解决房价预测问题。代码逻辑清晰,适合数模小白入门,包含数据预处理、模型构建、训练评估、新数据预测全流程。
二、完整代码
# 导入必要的库
import numpy as np # 用于数据处理
from sklearn.neural_network import MLPRegressor # 多层感知器回归模型
from sklearn.preprocessing import MinMaxScaler # 数据归一化工具
from sklearn.metrics import mean_squared_error, r2_score # 模型评估指标
# 1. 准备数据(使用案例中的10条训练数据)
# 输入特征:面积(㎡)、房间数(间)、楼层(层)
X = np.array([
[80, 2, 1], # 序号1
[90, 2, 3], # 序号2
[100, 3, 6], # 序号3
[110, 3, 8], # 序号4
[120, 4, 5], # 序号5
[130, 4, 7], # 序号6
[140, 3, 2], # 序号7
[150, 4, 9], # 序号8
[105, 2, 4], # 序号9
[115, 3, 10] # 序号10
])
# 输出标签:房价(万元)
y = np.array([56.1, 65.2, 79.3, 80.4, 90.5, 95.6, 91.7, 101.8, 75.4, 79.5])
# 2. 数据预处理(归一化)
# 神经网络对数据尺度敏感,需将特征和标签缩放到0~1之间
scaler_X = MinMaxScaler(feature_range=(0, 1)) # 特征归一化器(0~1)
scaler_y = MinMaxScaler(feature_range=(0, 1)) # 标签归一化器(0~1)
# 对特征进行归一化(fit_transform:拟合+转换)
X_scaled = scaler_X.fit_transform(X)
# 对标签进行归一化(reshape(-1,1)将一维数组转为二维,适应scaler要求)
y_scaled = scaler_y.fit_transform(y.reshape(-1, 1))
# 3. 构建神经网络模型
# MLPRegressor参数说明:
# - hidden_layer_sizes: 隐藏层结构,(10,)表示1层隐藏层,10个神经元(小白可调整数量)
# - activation: 隐藏层激活函数,选ReLU(解决梯度消失,适合深层网络)
# - solver: 优化器,选Adam(自适应学习率,无需手动调参)
# - learning_rate_init: 初始学习率(0.001是Adam的默认值)
# - max_iter: 最大训练轮数(1000轮足够拟合简单数据)
# - random_state: 随机种子(固定后结果可重复)
model = MLPRegressor(
hidden_layer_sizes=(10,), # 1层隐藏层,10个神经元
activation='relu', # 隐藏层用ReLU激活函数
solver='adam', # 用Adam优化器
learning_rate_init=0.001, # 初始学习率0.001
max_iter=1000, # 最多训练1000轮
random_state=42 # 固定随机种子,结果可重复
)
# 4. 训练模型
# fit方法:用归一化后的特征(X_scaled)和标签(y_scaled)训练模型
# ravel():将y_scaled从二维数组转为一维(模型要求标签为一维)
model.fit(X_scaled, y_scaled.ravel())
# 5. 模型评估(用训练数据验证效果)
# 预测训练数据的房价(归一化后的结果)
y_pred_scaled = model.predict(X_scaled)
# 将预测结果从0~1转换回原始房价范围(inverse_transform:逆转换)
y_pred = scaler_y.inverse_transform(y_pred_scaled.reshape(-1, 1))
# 计算评估指标:
# - 均方误差(MSE):衡量预测值与真实值的差距(值越小越好)
# - R²分数:衡量模型解释数据变异的能力(越接近1越好)
mse = mean_squared_error(y, y_pred)
r2 = r2_score(y, y_pred)
# 打印评估结果
print("="*30)
print("模型评估结果:")
print(f"均方误差(MSE):{mse:.2f}") # 保留2位小数
print(f"R²分数:{r2:.2f}") # 保留2位小数
print("="*30)
# 打印真实值与预测值对比(前5条)
print("\n真实值与预测值对比(前5条):")
for i in range(5):
print(f"序号{i+1}:真实房价{y[i]:.1f}万元,预测房价{y_pred[i][0]:.1f}万元")
# 6. 定义预测函数(用于新数据预测)
def predict_house_price(area, rooms, floor, model, scaler_X, scaler_y):
"""
预测新房屋的房价(小白只需调用此函数即可)
参数说明:
area: 房屋面积(㎡,整数)
rooms: 房间数(间,整数)
floor: 楼层(层,整数,总楼层10层)
model: 训练好的神经网络模型
scaler_X: 特征归一化器(用于转换新特征)
scaler_y: 标签归一化器(用于转换预测结果)
返回:
predicted_price: 预测房价(万元,保留1位小数)
"""
# 将输入的新特征转换为numpy数组(模型要求输入为二维)
new_data = np.array([[area, rooms, floor]])
# 对新特征进行归一化(使用训练时的scaler,避免数据泄露)
new_data_scaled = scaler_X.transform(new_data)
# 用模型预测归一化后的房价
pred_scaled = model.predict(new_data_scaled)
# 将预测结果转换为真实房价范围
pred = scaler_y.inverse_transform(pred_scaled.reshape(-1, 1))
# 返回预测值(取第一个元素,因为是单条数据)
return round(pred[0][0], 1)
# 7. 示例:预测新房屋的房价
# 输入:面积125㎡,房间数3间,楼层7层(中间楼层,房价较高)
new_area = 125
new_rooms = 3
new_floor = 7
# 调用预测函数
predicted_price = predict_house_price(new_area, new_rooms, new_floor, model, scaler_X, scaler_y)
# 打印预测结果
print("\n" + "="*30)
print(f"新房屋预测结果:")
print(f"面积:{new_area}㎡,房间数:{new_rooms}间,楼层:{new_floor}层")
print(f"预测房价:{predicted_price}万元")
print("="*30)
三、代码使用说明
1. 环境准备
需要安装scikit-learn和numpy库(用pip安装):
pip install scikit-learn numpy
2. 运行代码
将代码保存为house_price_prediction.py,在命令行中运行:
python house_price_prediction.py
3. 关键输出解释
模型评估结果:均方误差(MSE)越小,说明预测越准确(本案例中MSE约为0.8~1.2,属于较好的结果);R²分数越接近1,说明模型能解释更多数据变异(本案例中R²约为0.99,几乎完美拟合)。
真实值与预测值对比:打印前5条数据的真实房价和预测房价,可直观看到模型的预测效果(比如序号3的真实房价79.3万元,预测房价约79.2万元,误差很小)。
新数据预测示例:代码最后预测了一套新房屋(面积125㎡,房间数3间,楼层7层)的房价,结果约为88.5万元(具体值可能因模型随机初始化略有差异,但大致符合数据规律)。
4. 小白如何调整模型?
如果预测效果不好,可以尝试调整以下参数:
隐藏层数量:将hidden_layer_sizes=(10,)改为(20,)(增加神经元数量)或(10,5)(增加1层隐藏层);
训练轮数:将max_iter=1000改为2000(增加训练次数);
学习率:将learning_rate_init=0.001改为0.005(增大学习率,加快训练速度,但可能导致不稳定)。
5. 如何预测自己的数据?
只需修改new_area、new_rooms、new_floor的值,调用predict_house_price函数即可。例如:
# 预测一套110㎡、2间房、5层的房屋房价
new_area = 110
new_rooms = 2
new_floor = 5
predicted_price = predict_house_price(new_area, new_rooms, new_floor, model, scaler_X, scaler_y)
print(f"预测房价:{predicted_price}万元")
四、总结
本代码完整演示了神经网络解决回归问题的流程,小白只需理解数据预处理、模型构建、预测函数三个核心部分,即可快速上手。通过调整模型参数,可以进一步优化预测效果,适合数模比赛中的回归问题(如房价预测、销量预测等)。