# 导入必要库(补充回归任务所需库,删除分类模型相关库) import pandas as pd import numpy as np from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.tree import DecisionTreeRegressor from sklearn.ensemble import RandomForestRegressor from xgboost import XGBRegressor from lightgbm import LGBMRegressor from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error import warnings warnings.filterwarnings('ignore') # 忽略无关警告 # ---------------------- 1. 加载数据并查看原始结构 ---------------------- # 读取CSV文件(确保本地路径正确) df = pd.read_csv(r'C:\Users\asus1\Desktop\PythonStudy\housing.csv') print("=== 原始数据验证 ===") print(f"数据形状: {df.shape}") # 应输出 (20640, 10),确认数据加载成功 print(f"目标变量(房价)范围: {df['median_house_value'].min():.0f} - {df['median_house_value'].max():.0f} 美元") # ---------------------- 2. 标签翻译(英文特征名→中文) ---------------------- column_mapping = { 'longitude': '经度', 'latitude': '纬度', 'housing_median_age': '房屋年龄中位数', 'total_rooms': '总房间数', 'total_bedrooms': '总卧室数', 'population': '人口数', 'households': '家庭数', 'median_income': '收入中位数', 'median_house_value': '房屋价值中位数', # 回归任务的目标变量(连续值) 'ocean_proximity': '海洋 proximity' # 补充原代码遗漏的分类特征列 } df_cn = df.rename(columns=column_mapping) # 中文列名数据集 # ---------------------- 3. 数据预处理(缺失值+分类特征编码+分离特征/目标) ---------------------- print("\n=== 数据预处理 ===") # 3.1 处理缺失值(用中位数填充数值型缺失值) for col in df_cn.select_dtypes(include=['int', 'float']).columns: if df_cn[col].isnull().sum() > 0: median_val = df_cn[col].median() df_cn[col] = df_cn[col].fillna(median_val) print(f"{col} 缺失值已用中位数 {median_val:.2f} 填补") # 3.2 处理分类特征(ocean_proximity为字符串,需独热编码) df_cn = pd.get_dummies(df_cn, columns=['海洋 proximity'], drop_first=True) print(f"独热编码后数据形状: {df_cn.shape}") # 特征列数增加,确认编码成功 # 3.3 分离特征(X)和目标变量(y) X = df_cn.drop(columns=['房屋价值中位数']) # 所有特征(含编码后的分类特征) y = df_cn['房屋价值中位数'] # 目标变量(连续值,回归任务) # 3.4 划分训练集和测试集(避免数据泄露) X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42 # 测试集20%,固定随机种子 ) print(f"训练集形状: {X_train.shape}, 测试集形状: {X_test.shape}") # ---------------------- 4. 特征标准化(仅对数值型特征,避免分类特征受影响) ---------------------- # 筛选数值型特征列(排除独热编码后的分类特征) numeric_features = ['经度', '纬度', '房屋年龄中位数', '总房间数', '总卧室数', '人口数', '家庭数', '收入中位数'] X_train_numeric = X_train[numeric_features] X_test_numeric = X_test[numeric_features] # 标准化(仅用训练集拟合) scaler = StandardScaler() X_train_numeric_norm = scaler.fit_transform(X_train_numeric) X_test_numeric_norm = scaler.transform(X_test_numeric) # 重组特征矩阵(标准化后的数值特征 + 独热编码的分类特征) X_train_norm = np.hstack([X_train_numeric_norm, X_train.drop(columns=numeric_features).values]) X_test_norm = np.hstack([X_test_numeric_norm, X_test.drop(columns=numeric_features).values]) # 恢复DataFrame格式(方便后续查看,可选) X_train_norm_df = pd.DataFrame( X_train_norm, columns=X.columns, index=X_train.index ) print(f"\n标准化后训练集特征均值范围: [{X_train_norm_df.mean().min():.4f}, {X_train_norm_df.mean().max():.4f}]") # 验证标准化效果(均值接近0) # ---------------------- 5. 回归模型训练与评估(核心修正:替换分类模型为回归模型) ---------------------- # 定义回归模型字典(删除SVM、KNN分类器等,改用回归模型) regressors = { '线性回归': LinearRegression(), '决策树回归': DecisionTreeRegressor(random_state=42), '随机森林回归': RandomForestRegressor(random_state=42, n_estimators=100), 'XGBoost回归': XGBRegressor(random_state=42, eval_metric='rmse'), 'LightGBM回归': LGBMRegressor(random_state=42, n_estimators=100) } # 存储结果的列表和字典 results = [] preds_dict = {} # 存储各模型预测结果,便于后续分析 print("\n=== 模型训练与评估 ===") for name, model in regressors.items(): # A. 训练模型(用标准化后的训练集) model.fit(X_train_norm, y_train) # B. 预测(测试集) y_pred = model.predict(X_test_norm) preds_dict[name] = y_pred # 存储预测结果 # C. 计算回归任务核心指标(删除分类指标如accuracy、precision) r2 = r2_score(y_test, y_pred) # 决定系数(越接近1越好) mse = mean_squared_error(y_test, y_pred) rmse = np.sqrt(mse) # 均方根误差(越小越好,单位:美元) mae = mean_absolute_error(y_test, y_pred) # 平均绝对误差(越小越好) # D. 记录结果 results.append({ "模型名称": name, "R²(决定系数)": round(r2, 4), "RMSE(美元)": round(rmse, 2), "MAE(美元)": round(mae, 2) }) print(f"{name} 训练完成 | R²: {r2:.4f} | RMSE: {rmse:.2f} 美元") # ---------------------- 6. 展示模型性能排行榜(按R²降序排列) ---------------------- results_df = pd.DataFrame(results).sort_values(by="R²(决定系数)", ascending=False) print("\n" + "="*50) print(" 加州房价回归模型性能排行榜") print("="*50) print(results_df.to_string(index=False)) # 打印格式化表格DAY18 机器学习
张小明
前端开发工程师
openpnp - Smoothieware - MKS SGEN_L V1.0 + JLink-edu-mini 连接测试
文章目录openpnp - Smoothieware - MKS SGEN_L V1.0 JLink-edu-mini 连接测试概述笔记用JLink官方软件来测试板子电源调试接口的连接转接板和JLink-edu-mini的连接确定杜邦线的颜色转接板到板子SWD端子排的连接转接板端板子上的SWD接口排针用JLINK软件测试ENDopenpnp - Smooth…
设备预测性维护技术实战:云边端一体化落地与中讯烛龙系统推荐
在工业数字化加速的当下,设备预测性维护技术(PdM)正从“锦上添花”走向“能力底座”。它以状态数据为核心,借助机器学习与边缘计算,在故障发生前给出可执行的维护窗口,帮助企业实现从被动抢修到主动预防的跃…
软件打开出现找不到Vfp6rchs.dll文件 丢失的情况 下载修复
在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…
【30天从零学Python】重要补充四、检测有向环 - Kahn算法
30天从零学Python 通信工程专业科班生,用了几十年MATLAB,为了过大厂机考,不得不自学Python。 文章目录30天从零学Python重要补充四、检测有向环 - Kahn算法1. 有向环与拓扑排序1.1 Kahn 算法核心原理(通俗版)1.2 Kahn…
Flutter工程化实战:从单人开发到团队协作的规范与效率指南
Flutter工程化实战:从单人开发到团队协作的规范与效率指南 欢迎大家加入开源鸿蒙跨平台开发者社区,一起共建开源鸿蒙跨平台生态。 当Flutter项目从“单人小demo”升级为“多人协作的中大型项目”时,单纯依靠“编码能力”已无法保障项目质量—…
【Git原理与使用】(五)Git 多人协作:从分支协作到冲突解决,团队开发效率翻倍秘籍
目录 编辑 前言 一、多人协作基础:环境准备与核心原则 1.1 协作环境准备 步骤 1:创建共享远程仓库 步骤 2:添加团队成员(关键!) 步骤 3:团队成员克隆远程仓库 步骤 4:创建…