zoukankan      html  css  js  c++  java
  • 【机器学习】基于线性回归的波士顿房价预测

      1 import pandas as pd
      2 from sklearn.datasets import load_boston  # 波士顿房价数据
      3 from sklearn.model_selection import train_test_split  # 拆分数据集
      4 from sklearn.preprocessing import StandardScaler  # 标准差标准化
      5 from sklearn.linear_model import LinearRegression  # 线性回归模型
      6 from sklearn.linear_model import SGDRegressor  # 线性回归模型
      7 from sklearn.linear_model import Ridge  # 岭回归
      8 import matplotlib.pyplot as plt
      9 import numpy as np
     10 
     11 
     12 def show_res(y_true, y_predict):
     13     """
     14     结果显示
     15     :param y_true: 真实房价
     16     :param y_predict: 预测房价
     17     :return: None
     18     """
     19     # 1、创建画布
     20 
     21     plt.figure()
     22     # 默认不支持中文
     23     # 修改RC参数,来让其支持中文
     24     plt.rcParams['font.sans-serif'] = 'SimHei'
     25     plt.rcParams['axes.unicode_minus'] = False
     26     # 2、绘图
     27     x = np.arange(1, y_predict.shape[0] + 1)
     28     # 真实值的走势
     29     plt.plot(x, y_true, marker="*", color="g", linestyle=":", markersize=4)
     30     # 预测值的走势
     31     plt.plot(x, y_predict, marker="o", color="pink", markersize=4)
     32 
     33     # 增加图例
     34     plt.legend(["真实房价", "预测房价"])
     35     # 增加标题
     36     plt.title("波士顿房价真实与预测房价走势图")
     37 
     38     # 保存图片---如果在show之后保存图片,那么图片是完全空白的
     39     plt.savefig("./波士顿房价真实与预测房价走势图.png")
     40     # 3、展示
     41     plt.show()
     42 
     43 
     44 # 1、加载数据
     45 boston_data = load_boston()
     46 # print("boston_data:
    ", boston_data)
     47 
     48 # 2、获取特征值、获取目标值、获取特征名称
     49 feature = boston_data["data"]
     50 print("feature:
    ", feature)
     51 print("feature 的形状:
    ", feature.shape)
     52 
     53 #
     54 target = boston_data["target"]
     55 print("target:
    ", target)
     56 print("target 的形状:
    ", target.shape)
     57 
     58 #
     59 feature_names = boston_data["feature_names"]
     60 print("feature_names:
    ", feature_names)
     61 print("feature_names 的形状:
    ", feature_names.shape)
     62 print("*" * 100)
     63 
     64 # 3、可以将boston_data 保存到本地
     65 # df.to_xxx pandas 中数据保存形式
     66 # 将特征值转化为df
     67 # df_feature = pd.DataFrame(data=feature, columns=feature_names)
     68 # print("df_feature:
    ", df_feature)
     69 # # 将目标值转化为df
     70 # df_target = pd.DataFrame(data=target, columns=["MEDV"])
     71 # print("df_target:
    ", df_target)
     72 # print("*" * 100)
     73 #
     74 # # 拼接特征值与目标值
     75 # res_data = pd.concat((df_feature, df_target), axis=1)
     76 # print("res_data:
    ", res_data)
     77 #
     78 # # 保存数据
     79 # res_data.to_excel("./boston_data.xlsx", index=False)
     80 
     81 # 3、拆分数据集
     82 # 之前 手动拆分 data 为完整数据集:   data[:400,:] 训练集  data[400:,:]测试集
     83 # 拆分数据集
     84 # 参数1  特征值
     85 # 参数2 目标值
     86 # 参数3 test_size ---测试集占比
     87 # 特征值(训练集的特征值、测试集的特征值)   目标值(训练集的目标值、测试集的目标值)
     88 # 随机拆分---默认的
     89 # random_state ---给定值,把数据集拆分固定
     90 # 如果要进行超参数优化,数据集必须固定
     91 # 训练集:测试集  = 7:3
     92 # 训练集、验证集、测试集 = 8:1:1
     93 # 验证集----验证超参数
     94 train_x, test_x, train_y, test_y = train_test_split(feature, target, test_size=0.3, random_state=1)
     95 print("训练集的特征值:
    ", train_x)
     96 print("训练集的特征值:
    ", train_x.shape)
     97 print("训练集的目标值:
    ", train_y)
     98 print("训练集的目标值:
    ", train_y.shape)
     99 print("测试集的特征值:
    ", test_x)
    100 print("测试集的特征值:
    ", test_x.shape)
    101 print("测试集的目标值:
    ", test_y)
    102 print("测试集的目标值:
    ", test_y.shape)
    103 print("*" * 100)
    104 
    105 # 检测缺失值、处理缺失值 ---这个数据集无缺失值处理
    106 # 处理异常值 ---这个数据集无异常值处理
    107 # 标准化处理----法1
    108 # # (1)实例化对象
    109 stand = StandardScaler()
    110 # # (2)标准化数据
    111 # # 需要标准化哪些数据????--量级相差较大
    112 # # 特征值需要标准化,目标值不需要标准化
    113 # # 线性回归求解---w,b
    114 # # 特征值标准化,目标值不标准化,---w,b,如果得到新的标准化之后的特征值,代入模型,得到的预测值是真实的房价
    115 # # fit_transform ---(x - x.mean() / x.std())
    116 # (1)计算自身的指标(2)进行转化数据
    117 train_x = stand.fit_transform(train_x)
    118 test_x = stand.fit_transform(test_x)
    119 
    120 print("标准化之后的数据:
    ", train_x)
    121 print("标准化之后的数据:
    ", test_x)
    122 
    123 # 标准化处理---法2
    124 # (1)实例化对象
    125 # stand = StandardScaler()
    126 # # (2)标准化数据
    127 # # 计算指标
    128 # stand.fit(train_x)
    129 # # 转化
    130 # train_x = stand.transform(train_x)
    131 # # 利用训练集的特征值的指标来转化测试集的特征
    132 # test_x = stand.transform(test_x)
    133 
    134 
    135 # # 线性回归算法进行房价预测
    136 # # LinearRegression 基于正规方程的求解方式的线性回归
    137 # # 应用于数据较小,特征较少,模型构建不复杂的情况下
    138 # (1)构建算法实例
    139 lr = LinearRegression()
    140 # (2)训练数据
    141 lr.fit(train_x, train_y)
    142 # (3)预测数据
    143 y_predict = lr.predict(test_x)
    144 
    145 # 获取准确率
    146 score = lr.score(test_x, test_y)
    147 
    148 # 获取权重与偏置
    149 weight = lr.coef_
    150 bias = lr.intercept_
    151 
    152 print("准确率为:
    ", score)
    153 print("权重为:
    ", weight)
    154 print("偏置为:
    ", bias)
    155 print("预测值:
    ", y_predict)
    156 
    157 # (1)构建算法实例
    158 # 用于数据量较大、特征较多、模型较大的情况下
    159 # 随机梯度下降优化算法进行求解w,b
    160 # 梯度方向---随机的
    161 # 学习率---
    162 # penalty= "l2" 正则化--L2正则化,alpha--正则化力度
    163 # learning_rate = "invscaling" --默认学习率
    164 # 想要更改学习率
    165 # (1)将learning_rate ="constant",(2)再去更改eta0的值
    166 # 更改的学习率:不能过大,可能会造成梯度爆炸现象--会出现NaN的结果,
    167 # 也不能过小,会造成梯度消失,只训练而损失与准确率不变的情况
    168 # sgd = SGDRegressor()
    169 # # (2)训练数据
    170 # sgd.fit(train_x, train_y)
    171 # # (3)预测数据
    172 # y_predict = sgd.predict(test_x)
    173 #
    174 # # 获取准确率
    175 # score = sgd.score(test_x, test_y)
    176 #
    177 # # 获取权重与偏置
    178 # weight = sgd.coef_
    179 # bias = sgd.intercept_
    180 #
    181 # print("准确率为:
    ", score)
    182 # print("权重为:
    ", weight)
    183 # print("偏置为:
    ", bias)
    184 # print("预测值:
    ", y_predict)
    185 
    186 
    187 # (1)构建算法实例
    188 # 线性回归 + L2正则化  ---岭回归
    189 # 数据量较小,特征较少、模型不复杂的情况,也可以使用岭回归
    190 # rd = Ridge()
    191 # # (2)训练数据
    192 # rd.fit(train_x, train_y)
    193 # # (3)预测数据
    194 # y_predict = rd.predict(test_x)
    195 #
    196 # # 获取准确率
    197 # score = rd.score(test_x, test_y)
    198 #
    199 # # 获取权重与偏置
    200 # weight = rd.coef_
    201 # bias = rd.intercept_
    202 #
    203 # print("准确率为:
    ", score)
    204 # print("权重为:
    ", weight)
    205 # print("偏置为:
    ", bias)
    206 # print("预测值:
    ", y_predict)
    207 
    208 # 增加可视化---看真实值的走势 与预测值之间走势
    209 show_res(test_y, y_predict)

  • 相关阅读:
    常见的线性结构
    Lambda表达式学习笔记
    Spring Security 入门 (二)
    Spring Security 入门(一)
    Eclipse 创建 Maven 项目
    初学 Spring MVC(基于 Spring in Action)
    蓝桥杯之入学考试
    Java 学习总结
    二叉搜索树和红黑树
    Detours 劫持
  • 原文地址:https://www.cnblogs.com/Tree0108/p/12116223.html
Copyright © 2011-2022 走看看