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

 

一、代码说明

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

四、总结

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/90836.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/90836.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux应用开发基础知识——LInux学习FreeType编程(七)

目录 一、使用freetype 显示一个文字 二、使用 freetype 显示一行文字 1. 了解笛卡尔坐标系 2. 每个字符的大小可能不同 3. 怎么在指定位置显示一行文字 4. freetype 的几个重要数据结构 4.1、FT_Library结构体 4.2、FT_Face结构体 4.3、FT_GlyphSlot结构体 4.4、FT_G…

Kotlin中Flow

Kotlin Flow 深度解析:从原理到实战一、Flow 核心概念体系1. Flow 的本质与架构Flow 是 Kotlin 协程库中的异步数据流处理框架,核心特点:响应式编程:基于观察者模式的数据处理协程集成:无缝融入 Kotlin 协程生态背压支…

Java程序员学从0学AI(七)

一、前言 上一篇文章围绕 Spring AI 的 Chat Memory(聊天记忆)功能展开,先是通过代码演示了不使用 Chat Memory 时,大模型因无状态无法记住上下文(如用户姓名)的情况,随后展示了使用基于内存的 …

ESP32S3 防猫逃脱监测系统

在办公室里,两只可爱的猫咪给大家带来了不少欢乐,但其中一只总爱趁人不注意溜出房间,有时下班后还会被邻居告知它被锁在了外面。为了解决这个问题,我开发了一个基于 SeeedStudio XIAO ESP32S3 Sense 的猫咪逃脱监测预警系统&#…

Python|OpenCV-实现快速处理图像的方法(23)

前言 本文是该专栏的第25篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 在视觉算法落地流程中,数据预处理往往占用 60 % 以上的工程时间。以某沿海城市智慧旅游项目为例,我们从无人机录制的 4K 海滩视频中抽帧得到 10 000 张 PNG 原图,分辨率 38402160,单张体…

Redis四种GetShell方式完整教程

Redis作为高性能内存数据库,若未正确配置认证和访问控制,可能被攻击者利用实现远程代码执行(GetShell)。本文详细讲解四种常见的Redis GetShell方式,涵盖原理、操作步骤及防御建议。方式一:直接写入Shell脚…

clock_nanosleep系统调用及示例

41. clock_nanosleep - 高精度睡眠 函数介绍 clock_nanosleep系统调用提供纳秒级精度的睡眠功能&#xff0c;支持绝对时间和相对时间两种模式&#xff0c;比传统的nanosleep更加灵活。 函数原型 #include <time.h>int clock_nanosleep(clockid_t clock_id, int flags,con…

用了Flutter包体积增大就弃用Flutter吗?包体积与开发效率,这两者之间如何权衡?

是否因包体积增大而弃用 Flutter&#xff0c;本质上是 “短期成本&#xff08;包体积&#xff09;” 与 “长期价值&#xff08;跨平台效率、体验一致性等&#xff09;” 的权衡 。这一决策没有绝对答案&#xff0c;需结合项目阶段、用户群体、业务需求等具体场景分析。以下从核…

80道面试经典题目

1.OSI参考模型七层网络协议? 物理层:定义计算机、网络设备、以及直接连接的介质、接口类型的标准,建立比特流的传输,用来组件物理网络的连接。 数据链路层:建立逻辑连接、进行硬件地址寻址,差错校验、差错恢复等功能。 网络层:进行逻辑地址寻址,实现不同网络之间的通…

本周大模型新动向:KV缓存压缩、低成本高性能推理框架、多智能体协作

点击蓝字关注我们AI TIME欢迎每一位AI爱好者的加入&#xff01;01Compress Any Segment Anything Model (SAM)受SAM在零样本分割任务上卓越表现的驱动&#xff0c;其各类变体已被广泛应用于医疗、智能制造等场景。然而&#xff0c;SAM系列模型体量巨大&#xff0c;严重限制了在…

利用frp实现内网穿透功能(服务器)Linux、(内网)Windows

适用于&#xff1a; 本地电脑&#xff08;windows&#xff09;或者Linux(本篇未介绍&#xff09; 工具&#xff1a;FRP&#xff08;fast reverse proxy&#xff09; 系统&#xff1a;Linux、Windows 架构&#xff1a;x86、amd Frp版本&#xff1a;frp_0.62.1_windows_amd64准备…

结合二八定律安排整块时间

你是不是常常感觉一天到晚忙忙碌碌&#xff0c;却总觉得没干成几件“要紧事”&#xff1f;时间仿佛从指缝间溜走&#xff0c;成就感却迟迟不来&#xff1f;其实&#xff0c;高效能人士的秘诀往往藏在最简单的原则里。今天&#xff0c;我们就来聊聊如何巧妙运用“二八定律”&…

波形发生器AWG硬件设计方案

目录 简介 设计需求 设计方案 核心原理图展示 简介 波形发生器是一种数据信号发生器&#xff0c;在调试硬件时&#xff0c;常常需要加入一些信号&#xff0c;以观察电路工作是否正常。用一般的信号发生器&#xff0c;不但笨重&#xff0c;而且只发一些简单的波形&#xff…

11.Dockerfile简介

1.是什么&#xff1f; dockerfile是用来构建镜像的文本文件&#xff0c;是由一条条构建镜像所需的指令和参数构成的脚本。 构建三步骤 编写dockerfile文件docker build命令构建镜像docker run依镜像运行的容器实列 2.dockerfile构建过程解析 1)dockerfile内容的基础知识 …

C# 接口(interface 定义接口的关键字)

目录 使用接口案例 接口继承 练习 定义一个接口&#xff0c;在语法中与定义一个抽象类是没有区别的&#xff0c;但是不允许提供接口中任意成员的实现方式&#xff0c;一般接口只会包含方法 、索引器和事件的声明&#xff0c; 不允许声明成员的修饰符&#xff0c; public都不…

5190 - 提高:DFS序和欧拉序:树上操作(区域修改1)

题目传送门 时间限制 : 2 秒 内存限制 : 256 MB 有一棵点数为 N 的树&#xff0c;以点 1 为根&#xff0c;且树点有边权。然后有 M 个 操作&#xff0c;分为三种&#xff1a; 操作 1 &#xff1a;把某个节点 x 的点权增加 a 。 操作 2 &#xff1a;把某个节点 x 为根的子树中…

【Oracle】数据泵

ORACLE数据库 数据泵 核心参数全解析 ORACLE expdp 命令使用详解 1.ATTACH[schema_name.]job_name Schema_name 用于指定方案名,job_name 用于指定导出作业名.注意,如果使用 ATTACH 选项,在命令行除了连接字符串和 ATTACH 选项外,不能指定任何其他选项,示例如下: expdp hr/hr A…

机器学习的算法有哪些?

&#x1f31f; 欢迎来到AI奇妙世界&#xff01; &#x1f31f; 亲爱的开发者朋友们&#xff0c;大家好&#xff01;&#x1f44b; 我是人工智能领域的探索者与分享者&#xff0c;很高兴在CSDN与你们相遇&#xff01;&#x1f389; 在这里&#xff0c;我将持续输出AI前沿技术、实…

【计算机网络】OSI七层模型

OSI七层模型为什么需要OSI七层模型&#xff1f;OSI七层模型具体是什么&#xff1f;Layer7&#xff1a;应用层&#xff08;Application Layer&#xff09;Layer6&#xff1a;表示层&#xff08;Presentation Layer&#xff09;Layer5&#xff1a;会话层&#xff08;Session Laye…

RS485转Profinet网关配置指南:高效启动JRT激光测距传感器测量模式

RS485转Profinet网关配置指南&#xff1a;高效启动JRT激光测距传感器测量模式RS485转Profinet网关&#xff1a;让JRT激光测距传感器高效开启测量模式在工业自动化场景中&#xff0c;设备间的高效通信是实现精准控制的关键。RS485转Profinet网关作为连接传统RS485设备与现代Prof…