Python实战:用最小二乘法预测房价(附完整代码)
Python实战用最小二乘法预测房价附完整代码房价预测一直是数据分析领域的经典案例。想象一下你手头有一批房屋面积和售价的数据如何从中挖掘出有价值的规律最小二乘法就像一把精准的尺子能帮我们找到数据背后隐藏的直线关系。今天我们就用Python从数据导入到模型评估完整走一遍房价预测的实战流程。1. 数据准备与探索任何数据分析项目的第一步都是理解数据。我们先构造一个模拟的房价数据集import numpy as np import pandas as pd # 模拟数据面积(平方米)与价格(万元) areas np.array([50, 70, 90, 110, 130, 150, 170, 190, 210, 230]) prices np.array([180, 230, 280, 320, 370, 410, 460, 500, 550, 590]) # 创建DataFrame df pd.DataFrame({面积: areas, 价格: prices}) print(df.head())注意实际项目中建议使用真实数据可以从房产平台API或公开数据集中获取数据可视化能帮我们直观感受变量间的关系import matplotlib.pyplot as plt plt.scatter(df[面积], df[价格]) plt.title(房屋面积与价格关系) plt.xlabel(面积(㎡)) plt.ylabel(价格(万元)) plt.grid(True) plt.show()如果看到数据点大致呈线性分布最小二乘法就派上用场了。但要注意几个关键前提线性关系假设误差项服从正态分布自变量间无强相关性多元回归时2. 模型构建从数学到代码最小二乘法的核心是最小化残差平方和min Σ(y_i - (w·x_i b))²2.1 使用NumPy手动实现理解底层数学很重要我们先手动计算回归系数# 计算均值 x_mean, y_mean np.mean(areas), np.mean(prices) # 计算协方差和方差 covariance np.sum((areas - x_mean) * (prices - y_mean)) variance np.sum((areas - x_mean)**2) # 计算斜率和截距 slope covariance / variance intercept y_mean - slope * x_mean print(f回归方程: 价格 {slope:.2f} * 面积 {intercept:.2f})2.2 使用scikit-learn高效实现实际项目中更推荐使用成熟的库from sklearn.linear_model import LinearRegression # 准备数据 X df[[面积]] # 必须是二维数组 y df[价格] # 创建并训练模型 model LinearRegression() model.fit(X, y) # 输出结果 print(f斜率: {model.coef_[0]:.2f}) print(f截距: {model.intercept_:.2f}) print(fR²分数: {model.score(X, y):.3f})两种方法结果应该一致但scikit-learn提供了更多实用功能。3. 模型评估与诊断建完模型不代表工作结束我们需要评估它的可靠性。3.1 可视化拟合效果# 生成预测值 predicted model.predict(X) # 绘制对比图 plt.scatter(areas, prices, label实际价格) plt.plot(areas, predicted, colorred, label预测线) plt.title(房价预测效果) plt.legend() plt.show()3.2 关键评估指标除了R²分数还应关注均方误差(MSE)残差分布离群点检测from sklearn.metrics import mean_squared_error mse mean_squared_error(y, predicted) print(f均方误差: {mse:.2f}) # 残差分析 residuals y - predicted plt.scatter(predicted, residuals) plt.axhline(y0, colorr, linestyle-) plt.title(残差图) plt.show()健康的残差图应该随机分布在0线周围无明显模式。4. 进阶应用与注意事项掌握了基础用法后我们来看几个实战技巧。4.1 多元线性回归房价不只受面积影响我们可以加入更多特征# 模拟多特征数据 df[房龄] np.array([5, 10, 2, 8, 15, 5, 20, 10, 3, 7]) df[卧室数] np.array([1, 2, 2, 3, 3, 4, 4, 5, 5, 6]) # 多元回归 X_multi df[[面积, 房龄, 卧室数]] multi_model LinearRegression() multi_model.fit(X_multi, y) # 比较结果 print(多元回归R²:, multi_model.score(X_multi, y))4.2 常见问题处理遇到这些问题时该怎么办多重共线性特征间高度相关解决方案使用方差膨胀因子(VIF)检测或改用岭回归异方差性残差方差不等解决方案对Y值取对数或使用加权最小二乘法非线性关系数据呈现曲线分布解决方案尝试多项式回归或添加交互项# 多项式回归示例 from sklearn.preprocessing import PolynomialFeatures poly PolynomialFeatures(degree2) X_poly poly.fit_transform(X) poly_model LinearRegression() poly_model.fit(X_poly, y)5. 完整项目实战让我们整合所有步骤创建一个可复用的房价预测脚本import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import r2_score, mean_squared_error import matplotlib.pyplot as plt class HousePricePredictor: def __init__(self, data_pathNone): if data_path: self.df pd.read_csv(data_path) else: self._generate_sample_data() def _generate_sample_data(self): 生成模拟数据 np.random.seed(42) areas np.random.randint(50, 200, 100) prices 2.5 * areas 50 np.random.normal(0, 20, 100) self.df pd.DataFrame({面积: areas, 价格: prices}) def preprocess(self, test_size0.2): 数据预处理 X self.df[[面积]] y self.df[价格] self.X_train, self.X_test, self.y_train, self.y_test train_test_split( X, y, test_sizetest_size, random_state42) return self def train(self): 训练模型 self.model LinearRegression() self.model.fit(self.X_train, self.y_train) return self def evaluate(self): 模型评估 y_pred self.model.predict(self.X_test) r2 r2_score(self.y_test, y_pred) mse mean_squared_error(self.y_test, y_pred) print(fR²分数: {r2:.3f}) print(f均方误差: {mse:.2f}) # 可视化 plt.scatter(self.X_test, self.y_test, colorblue, label实际值) plt.plot(self.X_test, y_pred, colorred, label预测值) plt.legend() plt.show() return self def predict(self, new_area): 预测新数据 return self.model.predict([[new_area]])[0] # 使用示例 predictor HousePricePredictor() predictor.preprocess().train().evaluate() print(预测100平米房价:, predictor.predict(100))这个类封装了完整流程你可以轻松扩展更多功能添加更多特征实现交叉验证加入模型持久化构建Web接口6. 实际应用中的思考在真实业务场景中应用最小二乘法时有几个经验值得分享首先数据质量决定模型上限。曾经遇到一个案例原始数据中包含大量地下室面积误标为居住面积的情况导致模型严重偏离。解决方案是# 数据清洗示例 df df[df[面积] 20] # 过滤异常小面积 df df[df[单价] df[单价].quantile(0.95)] # 去除顶部5%离群点其次特征工程往往比模型选择更重要。尝试创建新特征如df[单价] df[价格] / df[面积] df[面积平方] df[面积] ** 2 df[区位因子] df.apply(lambda x: 1 if x[区域] in [A区,B区] else 0, axis1)最后模型解释性有时比精度更重要。在房价这种涉及大额交易的场景能解释为什么预测这个价格往往比单纯提高R²分数0.01更有价值。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2429353.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!