【机器学习】基于线性回归的波士顿房价预测

  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:\n", boston_data)
 47 
 48 # 2、获取特征值、获取目标值、获取特征名称
 49 feature = boston_data["data"]
 50 print("feature:\n", feature)
 51 print("feature 的形状:\n", feature.shape)
 52 
 53 #
 54 target = boston_data["target"]
 55 print("target:\n", target)
 56 print("target 的形状:\n", target.shape)
 57 
 58 #
 59 feature_names = boston_data["feature_names"]
 60 print("feature_names:\n", feature_names)
 61 print("feature_names 的形状:\n", 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:\n", df_feature)
 69 # # 将目标值转化为df
 70 # df_target = pd.DataFrame(data=target, columns=["MEDV"])
 71 # print("df_target:\n", df_target)
 72 # print("*" * 100)
 73 #
 74 # # 拼接特征值与目标值
 75 # res_data = pd.concat((df_feature, df_target), axis=1)
 76 # print("res_data:\n", 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("训练集的特征值:\n", train_x)
 96 print("训练集的特征值:\n", train_x.shape)
 97 print("训练集的目标值:\n", train_y)
 98 print("训练集的目标值:\n", train_y.shape)
 99 print("测试集的特征值:\n", test_x)
100 print("测试集的特征值:\n", test_x.shape)
101 print("测试集的目标值:\n", test_y)
102 print("测试集的目标值:\n", 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("标准化之后的数据:\n", train_x)
121 print("标准化之后的数据:\n", 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("准确率为:\n", score)
153 print("权重为:\n", weight)
154 print("偏置为:\n", bias)
155 print("预测值:\n", 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("准确率为:\n", score)
182 # print("权重为:\n", weight)
183 # print("偏置为:\n", bias)
184 # print("预测值:\n", 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("准确率为:\n", score)
204 # print("权重为:\n", weight)
205 # print("偏置为:\n", bias)
206 # print("预测值:\n", y_predict)
207 
208 # 增加可视化---看真实值的走势 与预测值之间走势
209 show_res(test_y, y_predict)

猜你喜欢

转载自www.cnblogs.com/Tree0108/p/12116223.html