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)