30天打牢数模基础-神经网络基础讲解

发布于:2025-07-24 ⋅ 阅读:(39) ⋅ 点赞:(0)

 

一、代码说明

本代码基于模拟房价数据集,使用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}万元")

四、总结

本代码完整演示了神经网络解决回归问题的流程,小白只需理解数据预处理、模型构建、预测函数三个核心部分,即可快速上手。通过调整模型参数,可以进一步优化预测效果,适合数模比赛中的回归问题(如房价预测、销量预测等)。

 


网站公告

今日签到

点亮在社区的每一天
去签到