基于线性回归的波士顿房价预测

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)

你可能感兴趣的:(数据分析)