news 2026/6/20 9:24:16

DAY18 机器学习

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DAY18 机器学习
# 导入必要库(补充回归任务所需库,删除分类模型相关库) 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)) # 打印格式化表格
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/17 11:59:53

Python property魔法:让属性访问变得智能又安全

一、property基础:从数据封装开始 1.1 为什么需要属性封装? 在面向对象编程中,数据封装是基本原则之一。直接暴露属性可能导致数据不一致和逻辑错误。 # 问题示例:直接访问导致数据不一致 class BankAccount:def __init__(self, b…

作者头像 李华
网站建设 2026/6/15 18:56:23

基于Java Swing的打砖块小游戏(2)

1、演示视频 基于Java Swing的打砖块小游戏2、项目截图 设计说明 3.1 整体架构设计 项目采用分层设计面向对象封装的架构&#xff0c;主要分为以下几个部分&#xff1a; 界面层&#xff08;UI层&#xff09;&#xff1a;由<代码开始>BreakoutGame<代码结束>类中…

作者头像 李华
网站建设 2026/6/20 7:45:06

电科金仓数据库如何支持Oracle风格的PL/SQL操作

引言 在数据库国产化替代的浪潮中,企业面临的最大挑战之一就是如何平滑迁移现有的Oracle应用系统。KingbaseES(简称KES)作为国产数据库的代表产品,通过深度的Oracle兼容性设计,特别是在PL/SQL操作层面的全面支持,为企业提供了一条低成本、低风险的迁移路径。本文将详细介绍Kin…

作者头像 李华
网站建设 2026/6/20 8:33:18

全员 RTO5 政策,TikTok 开卷?

TikTok 开卷&#xff1f; TikTok 虽然和抖音性质类似&#xff0c;母公司也都是字节跳动。 但两者的工作节奏&#xff0c;其实差异挺大&#xff0c;毕竟 TikTok 的主要办公地点&#xff0c;是在美国洛杉矶或新加坡。 一些海外 IT 公司常见的福利待遇&#xff0c;TikTok 还是享受…

作者头像 李华
网站建设 2026/6/18 13:27:54

JSP如何结合AES加密实现大文件上传存储?

文件管理系统毕业设计&#xff1a;从零到崩溃的全过程 1. 我的毕业设计困境 "卧槽&#xff0c;这毕业设计是要我命啊&#xff01;"当我看到老师给出的文件管理系统需求时&#xff0c;差点把刚买的珍珠奶茶喷出来。 10G大文件上传&#xff1f;断点续传&#xff1f;…

作者头像 李华
网站建设 2026/6/19 3:24:24

毕业设计项目 基于机器视觉的目标跟踪算法

文章目录 0 前言2 目标跟踪效果3 目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 0 前言 &#x1f525; 今天学长向大家分享一个毕业设计项目 为了大家能够顺利以及最少的精力通过毕设&…

作者头像 李华