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)