import numpy import pandas from matplotlib import pyplot from sklearn.linear_model import Ridge # 岭回归---线性回归+ L2正则化【L2正则:将不重要的权重减少到几乎为0】 from sklearn.datasets import load_boston # 数据 from sklearn.linear_model import SGDRegressor # sgd线性回归---随机梯度下降线性回归 from sklearn.preprocessing import StandardScaler # 标准化 from sklearn.linear_model import LinearRegression # 正规方程求解的线性回归 from sklearn.model_selection import train_test_split # 训练集 特征值拆分 def show_res(y_text,y_predict): ''' 结果展示 :param y_text: 测试集目标值真实值 :param y_predict: 预测值 :return: ''' # 画布 pyplot.figure() # 默认不支持中文,需要配置RC 参数 pyplot.rcParams['font.sans-serif'] = 'SimHei' # 设置字体之后不支持负号,需要去设置RC参数更改编码 pyplot.rcParams['axes.unicode_minus'] = False # 绘图 # 折线图 x = numpy.arange(0,len(y_predict)) pyplot.plot(x,y_test,marker='*') pyplot.plot(x,y_predict,marker='.' ) # 增加标题 pyplot.title('房价预测与真实值的走势') # 增加横轴,纵轴名称 pyplot.xlabel('x') pyplot.ylabel('房价') # 图例 pyplot.legend(['真实值','预测值']) # 展示 pyplot.show() # 加载数据 data = load_boston() # 获取特征值 feature = data['data'] # 特征值 target = data['target'] #目标值 feature_names = data['feature_names'] # 特征值的列名 print(feature) print(target) print(feature_names) print('*='*40) # # 将特征值转化为df # df_feature = pandas.DataFrame(feature,) # # # 将目标值转化为df # df_target = pandas.DataFrame(target) # # # 拼接特征值 和 目标值 # df_data = pandas.concat((df_feature,df_target),axis=1) # # # 保存 # df_data.to_excel('data/boston_data.xlsx',index=False) # 拆分数据集 -- 拆分成训练集与测试集,特征值与目标值 # feature,target,test_size=0.3 特征值 、目标值、测试集占比 # 返回值---先特征值(先训练集,再测试集),再目标值(先训练集,再测试集) x_train,x_test,y_train,y_test = train_test_split(feature,target,test_size=0.3) # 进行标准化---目标值是具体的房价,特征值是各个特征,--量级减小--W量级变大 # 目标值不需要标准化--特征值需要标准化 stand = StandardScaler() # 先计算均值与标准差,在进行转化 x_train = stand.fit_transform(x_train) x_test = stand.fit_transform(x_test) ''' # # 正规方程进行求解的线性回归---特征不是特别多,数据不是特别复杂的情况 # 进行构建模型---线性模型 lr = LinearRegression() # 训练数据 lr.fit(x_train,y_train) # 预测数据 y_predict = lr.predict(x_test) # 计算准确率 score = lr.score(x_test,y_test) # 获取权重和偏执 weight = lr.coef_ bias = lr.intercept_ # 绘图展示 show_res(y_test,y_predict) ''' ''' # 适合用于 特征较多,数量极大的情况 # 进行自我学习修正的过程 --- 梯度方向,与学习率 #默认的学习率 为0.01 # 如果想要更改学习率 ---添加参数 1,learning_rate='constant' 2,eta0 = 学习率 # 梯度方向 ----- 无需考虑 -- 沿着损失减小的方向 # 学习率 -- 应该设置在合适的位置 0.1 0.01 0.001 不可过大或者过小 # 过大 会造成梯度爆炸,梯度爆炸经常出现复杂神经网络中----梯度爆炸-->损失、准确率 全变成NAN类型 # 过小 如果过线,会造成原地打转,此时梯度消失,---损失不减小,一直那么大 # 进行构建模型 -- 线性模型 sgd = SGDRegressor() # 训练数据 sgd.fit(x_train,y_train) # 预测数据 y_predict = sgd.predict(x_test) # 计算准确率 score = sgd.score(x_test,y_test) # 获取权重和偏执 weight = sgd.coef_ bias = sgd.intercept_ # 展示 show_res(y_test,y_predict) ''' # 线性回归+L2正则化 ---- 再小的数据集上,效果会比LinearRegression效果好一些 # 进行构建模型 -- 线性模型 rd = Ridge() # 训练数据 rd.fit(x_train,y_train) # 预测数据 y_predict = rd.predict(x_test) # 计算准确率 score = rd.score(x_test,y_test) # 获取权重和偏执 weight = rd.coef_ bias = rd.intercept_ # 展示 show_res(y_test,y_predict)
来源:51CTO
作者:BeefpasteC
链接:https://blog.csdn.net/ybw_2569/article/details/101095500