# -*- coding: utf-8 -*- """ Created on 2023-10-16 @author: Your Name 本代码用于对房屋交易数据进行分析,包括数据预处理、特征工程、模型训练与评估等步骤。 目标是研究影响城市住宅价格的因素,并评估不同机器学习模型在预测房价方面的表现。 """ # 导入必要的库 import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LinearRegression from sklearn.tree import DecisionTreeRegressor from sklearn.ensemble import RandomForestRegressor from sklearn.svm import SVR from sklearn.neural_network import MLPRegressor from sklearn.metrics import mean_absolute_error, mean_squared_error import shap import matplotlib.pyplot as plt import warnings import re # 忽略警告信息 warnings.filterwarnings("ignore") # 1. 数据加载与初步查看 def load_data(file_path): """ 加载数据并进行初步查看 """ data = pd.read_excel(file_path) print("数据集基本信息:") print(data.info()) print("\n数据集前5行:") print(data.head()) print("\n数据集描述性统计:") print(data.describe()) return data # 2. 数据预处理 def data_preprocessing(data): """ 数据预处理,包括删除无效数据、变量转化或拆分、数据集整合、删除极端值等 """ # 删除无效数据(如缺失值过多的行) data = data.dropna(thresh=len(data.columns) * 2 / 3, axis=0) # 变量转化或拆分 # 拆分户型信息,适应不同的格式 def extract_room_hall(x): if pd.isna(x): return np.nan, np.nan # 尝试匹配常见的格式,如 "3室1厅"、"3房间1厅"、"3房1厅" 等 room = 0 hall = 0 if '室' in x and '厅' in x: parts = x.split('厅') if len(parts) >= 2: room_part = parts[0] hall_part = parts[1].split(' ')[0] if ' ' in parts[1] else parts[1] room = room_part.split('室')[0] if '室' in room_part else 0 hall = hall_part.split('厅')[0] if '厅' in hall_part else 0 elif '房间' in x and '厅' in x: parts = x.split('厅') if len(parts) >= 2: room_part = parts[0] hall_part = parts[1].split(' ')[0] if ' ' in parts[1] else parts[1] room = room_part.sp
时间: 2025-06-20 12:21:14 浏览: 3
<think>嗯,用户想做一个Python的房价预测项目,涉及数据预处理、特征工程、机器学习模型,还要用SHAP做解释和可视化,用到了Pandas和Scikit-learn。首先,我得理清楚整个流程的步骤,然后看看每个部分需要注意什么。
数据预处理方面,用户可能会遇到缺失值的问题,比如波士顿房价数据集可能有些特征有缺失。这时候得考虑怎么处理,比如用均值、中位数填充,或者删除缺失太多的列。还有异常值的处理,可以用Z-score或者IQR方法检测,然后决定是否剔除或用分位数截断。数据标准化或归一化也是必须的,特别是对于线性模型如岭回归来说,特征缩放很重要。
特征工程部分,可能需要处理非线性关系,比如对某些特征取对数或平方。类别型特征如果是分类型的,可能需要做独热编码。另外,组合特征可能有用,比如房间数量与面积的乘积,或者地理位置相关的特征组合。还有特征选择,可以用随机森林或XGBoost来看特征重要性,或者用方差阈值、互信息法来筛选。
模型选择的话,线性模型如岭回归、Lasso可能作为基线,树模型如随机森林、XGBoost、LightGBM适合处理非线性关系。Stacking或Voting集成方法可以提升效果。交叉验证要注意时间序列的问题,如果是时间相关的房价数据,得用TimeSeriesSplit,否则一般用KFold。超参数调优可以用GridSearchCV或Optuna自动搜索。
SHAP解释和可视化方面,需要安装shap库,然后用TreeExplainer对树模型解释,输出特征重要性的摘要图、依赖图,单个预测的force_plot,以及交互作用分析。可视化可能需要调整图表样式,比如用matplotlib的plt.subplots调整布局,或者用颜色区分正负影响。
代码示例方面,用户可能需要数据加载的代码,特别是引用[4]提到load_boston被移除了,所以需要用替代方法加载数据。预处理部分可以展示如何用SimpleImputer处理缺失值,StandardScaler标准化。特征工程部分展示PolynomialFeatures和组合特征。模型训练用交叉验证和GridSearchCV调参。SHAP部分展示如何生成各种图表。
可能遇到的问题包括数据加载错误、特征工程效果不明显、模型过拟合、SHAP可视化不清晰。比如数据加载出错时,按引用[4]的方法处理。特征工程如果效果不好,可能需要尝试不同的变换方法。过拟合的话,可以增加正则化、早停或数据增强。可视化问题可能需要调整参数或使用不同的图表类型。
用户可能还关心如何评估模型性能,比如用MAE、RMSE、R²等指标,以及如何将整个流程封装成Pipeline,方便重复使用。另外,部署模型到生产环境可能也是后续步骤,但用户现在可能主要关注建模和解释部分。
需要确保代码示例正确,特别是数据预处理和特征工程部分,避免常见的错误,比如数据泄露,应该在训练集上拟合转换器,再应用到测试集。交叉验证时也要注意这一点。引用中的信息可能需要用到,比如引用[1]提到使用随机森林分类器的例子,可以借鉴到回归问题中。引用[3]中的学习曲线绘制方法,可以应用到房价模型的调参中,比如调整n_estimators参数。
最后,生成的相关问题需要考虑用户可能的后续需求,比如如何解释模型结果、优化模型性能、处理过拟合、特征工程的其他技巧,以及如何将模型部署到生产环境。这些问题能帮助用户进一步深入项目。</think># Python房价预测项目实现指南
### 一、数据预处理(基于Pandas)
```python
import pandas as pd
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler
# 数据加载(替代已移除的load_boston)
data_url = "http://lib.stat.cmu.edu/datasets/boston"
raw_df = pd.read_csv(data_url, sep=r"\s+", skiprows=22, header=None)
data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
target = raw_df.values[1::2, 2]
features = ['CRIM','ZN','INDUS','CHAS','NOX','RM','AGE','DIS','RAD','TAX','PTRATIO','B','LSTAT']
df = pd.DataFrame(data, columns=features)
df['PRICE'] = target
# 缺失值处理
imputer = SimpleImputer(strategy='median')
df[features] = imputer.fit_transform(df[features])
# 异常值处理
Q1 = df.quantile(0.25)
Q3 = df.quantile(0.75)
df = df[~((df < (Q1 - 1.5 * (Q3-Q1))) | (df > (Q3 + 1.5 * (Q3-Q1)))).any(axis=1)]
# 数据标准化
scaler = StandardScaler()
df[features] = scaler.fit_transform(df[features])
```
### 二、特征工程优化
1. **非线性特征构造**:对$LSTAT$(低收入人群比例)进行平方和立方变换
```python
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=2, interaction_only=False, include_bias=False)
poly_features = poly.fit_transform(df[['LSTAT']])
df['LSTAT_sq'] = poly_features[:,1]
```
2. **特征组合**:创建$RM \times LSTAT$(房间数与人口比例的交互特征)
```python
df['RM_LSTAT'] = df['RM'] * df['LSTAT']
```
### 三、机器学习建模(Scikit-learn)
```python
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score
X = df.drop('PRICE', axis=1)
y = df['PRICE']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 随机森林模型
rf = RandomForestRegressor(n_estimators=500, max_depth=8, random_state=42)
rf.fit(X_train, y_train)
# 模型评估
y_pred = rf.predict(X_test)
print(f'RMSE: {np.sqrt(mean_squared_error(y_test, y_pred)):.2f}')
print(f'R²: {r2_score(y_test, y_pred):.2f}')
```
### 四、SHAP解释与可视化
```python
import shap
# 初始化JS可视化
shap.initjs()
# 创建解释器
explainer = shap.TreeExplainer(rf)
shap_values = explainer.shap_values(X_test)
# 特征重要性图
shap.summary_plot(shap_values, X_test, plot_type="bar")
# 单个样本解释
shap.force_plot(explainer.expected_value, shap_values[0,:], X_test.iloc[0,:])
# 依赖图
shap.dependence_plot("LSTAT", shap_values, X_test)
```
### 五、性能优化建议
1. **超参数调优**:使用网格搜索优化随机森林参数
```python
from sklearn.model_selection import GridSearchCV
param_grid = {
'n_estimators': [100, 200, 500],
'max_depth': [5, 8, 10],
'min_samples_split': [2, 5, 10]
}
grid_search = GridSearchCV(estimator=rf, param_grid=param_grid, cv=5, scoring='neg_mean_squared_error')
grid_search.fit(X_train, y_train)
```
2. **集成学习优化**:尝试XGBoost或LightGBM
```python
from xgboost import XGBRegressor
xgb = XGBRegressor(n_estimators=1000, learning_rate=0.01)
xgb.fit(X_train, y_train, eval_set=[(X_test, y_test)], early_stopping_rounds=50, verbose=False)
```
### 六、常见问题解决方案
1. **数据泄露预防**:始终先分割数据集再进行特征工程
2. **类别特征处理**:使用`pd.get_dummies()`进行独热编码
3. **模型解释优化**:通过`shap.TreeExplainer(model).shap_interaction_values()`分析特征交互
阅读全文
相关推荐
















