• 线性回归模型用于波士顿房价预测的(普通VSsklearn库方法)比较


    在这里插入图片描述

    努力是为了不平庸~

    学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰

    线性回归是一种统计学习方法,用于建立一个线性模型来预测因变量与自变量之间的关系。它假设因变量与自变量之间存在线性关系,并通过最小化残差平方和来拟合数据。

    线性回归模型用于波士顿房价预测的示例是一个经典的应用场景。在这个问题中,我们希望根据一些特征(如房间数量、犯罪率、学生-教师比例等)来预测波士顿地区的房价。

    比如利用sklearn库中的方法,我们可以实现线性回归模型的三个主要模块:数据准备、模型训练和预测。

    1. 数据准备:
       首先,我们需要收集波士顿房价的相关数据集,如sklearn库中的波士顿房价数据集(load_boston)。
       然后,我们将数据集分为特征(X)和目标(y),其中X包含所有的自变量特征,y包含对应的因变量(房价)。
       我们可以通过数据预处理的方式,如标准化或归一化,对数据进行必要的转换和缩放。

    2. 模型训练:
       使用sklearn库中的线性回归模型(LinearRegression)进行模型训练。
       调用fit()方法,将特征数据X和目标数据y作为输入,拟合线性回归模型。
       在训练过程中,模型会自动计算最佳的回归系数以及截距,以最小化残差平方和。

    3. 预测:
       使用训练好的线性回归模型进行预测。
       调用predict()方法,将待预测的特征数据作为输入,得到预测结果。
       预测结果可以用于判断波士顿地区的房价。

    先来看看线性回归相关模拟

    1. # -*- coding: utf-8 -*-
    2. import matplotlib.pyplot as plt
    3. import numpy as np
    4. import pandas as pd
    5. # 1、线性回归模拟
    6. ## 1.1 读取模拟数据ex0_1.csv
    7. df = pd.read_csv("ex0_1.csv")
    8. data = df.values
    9. X = data[:, 0].reshape((-1, 1))
    10. y = data[:, 1].reshape((-1, 1))
    11. ## 1.2 绘制散点图
    12. plt.scatter(X, y)
    13. plt.xlabel('X')
    14. plt.ylabel('y')
    15. plt.title('Scatter Plot')
    16. plt.show()
    17. ## 1.3 正规方程解 inv(X.T * X ) * X.T * y
    18. X_b = np.c_[np.ones((len(X), 1)), X] # 添加偏置项
    19. theta = np.linalg.inv(X_b.T @ X_b) @ X_b.T @ y
    20. ## 1.4 绘制拟合的直线
    21. plt.scatter(X, y)
    22. plt.plot(X, X_b @ theta, color='red') # 使用X_b计算预测值
    23. plt.xlabel('X')
    24. plt.ylabel('y')
    25. plt.title('Fitted Line')
    26. plt.show()
    27. ## 1.5 函数形式
    28. intercept, slope = theta[0][0], theta[1][0]
    29. print("拟合函数形式为:y = {:.2f} + {:.2f}x".format(intercept, slope))
    30. ## 1.6 利用梯度下降法求
    31. def gradient_descent(X, y, theta, alpha, num_iters):
    32. m = len(y)
    33. for iter in range(num_iters):
    34. h = X.dot(theta)
    35. loss = h - y
    36. gradient = X.T.dot(loss) / m
    37. theta -= alpha * gradient
    38. return theta
    39. alpha = 0.01 # 学习率
    40. num_iters = 1000 # 迭代次数
    41. theta = np.zeros((X_b.shape[1], 1)) # 初始化参数
    42. theta = gradient_descent(X_b, y, theta, alpha, num_iters)
    43. print("利用梯度下降法求得的参数为:", theta)

     下面我们使用两种方法来实现波士顿房价预测

    1. # -*- coding: utf-8 -*-
    2. import pickle
    3. from sklearn.model_selection import train_test_split
    4. from sklearn.linear_model import LinearRegression
    5. from sklearn.metrics import mean_squared_error
    6. import numpy as np
    7. import matplotlib.pyplot as plt
    8. # 2.1 数据准备
    9. data = pickle.load(open("data.save","rb"))
    10. X = data[:,:-1]
    11. y = data[:,-1]
    12. print(data)
    13. # 数据划分
    14. X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=420)
    15. # 2.3 调用LR函数
    16. def LR(X, y):
    17. ones = np.ones((X.shape[0], 1))
    18. X_ones = np.hstack((ones, X))
    19. XT = X_ones.T
    20. XTX = np.dot(XT, X_ones)
    21. XTX_1 = np.linalg.inv(XTX)
    22. XTX_1XT = np.dot(XTX_1, XT)
    23. W = np.dot(XTX_1XT, y)
    24. return W
    25. W=LR(X_train,y_train)
    26. # 2.4 预测
    27. ones = np.ones((X_test.shape[0],1))
    28. X_test_ones=np.hstack((ones,X_test))
    29. y_predict=np.dot(X_test_ones,W)
    30. # 2.5 评估
    31. print("均方根误差:",mean_squared_error(y_test,y_predict))
    32. plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体为黑体
    33. plt.rcParams['axes.unicode_minus'] = False # 解决负号无法正常显示的问题
    34. # 绘制房间数量与房屋价格的关系
    35. plt.scatter(X_train[:, 5], y_train, label='训练数据')
    36. plt.scatter(X_test[:, 5], y_test, label='测试数据')
    37. plt.xlabel('每个住宅的平均房间数量')
    38. plt.ylabel('房价')
    39. plt.title('房间数量与价格的关系')
    40. plt.legend()
    41. plt.show()

     注意,这里是直接导入数据集,因为高版本python版本不适配

    下面则是采用另外的导入方法

    1. # -*- coding: utf-8 -*-
    2. # 3.利用sklearn中的方法实现
    3. from sklearn.model_selection import train_test_split
    4. from sklearn.linear_model import LinearRegression
    5. from sklearn.metrics import mean_squared_error
    6. import numpy as np
    7. import pandas as pd
    8. import matplotlib.pyplot as plt
    9. #导入数据集
    10. data_url = "http://lib.stat.cmu.edu/datasets/boston"
    11. raw_df = pd.read_csv(data_url, sep="\s+", skiprows=22, header=None)
    12. data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
    13. target = raw_df.values[1::2, 2]
    14. #划分数据集
    15. X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=0.2, random_state=38)
    16. ## 3.1 训练模型
    17. model = LinearRegression()
    18. model.fit(X_train, y_train)
    19. ## 3.2 预测
    20. y_pred = model.predict(X_test)
    21. ## 3.3 评估
    22. mse = mean_squared_error(y_test, y_pred)
    23. print("均方根误差:", mse)
    24. r2 = model.score(X_test, y_test)
    25. print("拟合优度:", r2)
    26. plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体为黑体
    27. plt.rcParams['axes.unicode_minus'] = False # 解决负号无法正常显示的问题
    28. # 绘制房间数量与房屋价格的关系
    29. plt.scatter(X_train[:, 5], y_train, label='训练数据')
    30. plt.scatter(X_test[:, 5], y_test, label='测试数据')
    31. plt.xlabel('每个住宅的平均房间数量')
    32. plt.ylabel('房价')
    33. plt.title('房间数量与价格的关系')
    34. plt.legend()
    35. plt.show()

  • 相关阅读:
    代码随想录 --- day22 -- 235. 二叉搜索树的最近公共祖先 、701.二叉搜索树中的插入操作、 450.删除二叉搜索树中的节点
    Kubernetes云原生实战02 对节点磁盘进行分区挂载
    工作流Activiti 迁移 Camunda
    24、CSS基础——定位以及透明通道
    2023高教社杯数学建模C题思路分析 - 蔬菜类商品的自动定价与补货决策
    2024年网络安全/黑客自学路线图
    3. Caller 服务调用 - dapr
    0基础学习PyFlink——使用PyFlink的Sink将结果输出到外部系统
    ceph存储快速部署
    一百八十二、大数据离线数仓完整流程——步骤一、用Kettle从Kafka、MySQL等数据源采集数据然后写入HDFS
  • 原文地址:https://blog.csdn.net/m0_63794226/article/details/134422802