使用boston房价数据进行线性回归分析

理解数据

import pandas as pd
import numpy as np

import sklearn.datasets as datasets
from sklearn.linear_model import LinearRegression,SGDRegressor
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error,classification_report
import matplotlib.pyplot as plt
from sklearn.linear_model import Ridge
from sklearn.externals import joblib

1.加载boston房价数据

boston=datasets.load_boston()
print(boston.DESCR)
boston.feature_names
X=boston.data
Y=boston.target

boston房价数据一共有506行。13个特征,分别是:
‘CRIM’, ‘ZN’, ‘INDUS’, ‘CHAS’, ‘NOX’, ‘RM’, ‘AGE’, ‘DIS’, ‘RAD’,
‘TAX’, ‘PTRATIO’, ‘B’, ‘LSTAT’;
各个特征的含义:
CRIM:城镇人均犯罪率。
ZN:住宅用地超过 25000 sq.ft. 的比例。
INDUS:城镇非零售商用土地的比例。
CHAS:查理斯河空变量(如果边界是河流,则为1;否则为0)。
NOX:一氧化氮浓度。
RM:住宅平均房间数。
AGE:1940 年之前建成的自用房屋比例。
DIS:到波士顿五个中心区域的加权距离。
RAD:辐射性公路的接近指数。
TAX:每 10000 美元的全值财产税率。
PTRATIO:城镇师生比例。
B:1000(Bk-0.63)^ 2,其中 Bk 指代城镇中黑人的比例。
LSTAT:人口中地位低下者的比例。
MEDV:自住房的平均房价,以千美元计

2.分割数据为训练集测试集,并可视化各个特征与目标值的关系

X=boston.data
Y=boston.target
X_train,X_test,y_train,y_test=train_test_split(X,Y,random_state=33,test_size=0.2)
#标准化
std=StandardScaler()
x_train=std.fit_transform(X_train)
x_test=std.transform(X_test)
y_train=std.fit_transform(y_train.reshape(-1,1))  #y需要转化为2维
y_test=std.transform(y_test.reshape(-1,1))

可视化

#可视化
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
titles=['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD',
       'TAX', 'PTRATIO', 'B', 'LSTAT']
plt.figure(figsize=(12,9))
for i in range(13):
    plt.subplot(4,4,i+1)
    plt.scatter(x_train[:,i],y_train,marker='.',color='g')
    plt.xlabel(titles[i])
    plt.ylabel('$1000-price')
    plt.title(str(i+1)+'.'+titles[i]+'-price')
plt.tight_layout()
plt.suptitle('各属性―地価との関連',x=0.5,y=1.05,fontsize=20)
plt.show()

使用boston房价数据进行线性回归分析_第1张图片
3.分别使用LinearRegression,SGDRegressor,Ridge进行预测

LinearRegression,SGDRegressor的区别
使用boston房价数据进行线性回归分析_第2张图片
小规模数据:LinearRegression(不能解决拟合问题)以及其它
大规模数据:SGDRegressor
Ridge岭回归解决过拟合问题。

① 正则化LinearRegression

lr=LinearRegression()
lr.fit(x_train,y_train)

y_lr_pred=std.inverse_transform(lr.predict(x_test))
error_lr=mean_squared_error(std.inverse_transform(y_test),y_lr_pred)
print('斜率:',lr.coef_)
print('截距:',lr.intercept_)
print('均方误差:',error_lr)

得出结果:
斜率: [[-0.10652353 0.1248883 0.02144814 0.08447264 -0.1851724 0.3015255
-0.00436415 -0.33801186 0.28858221 -0.23677719 -0.19424453 0.07916941
-0.43398872]]
截距: [4.18819804e-15]
均方误差: 22.04257921621329

② 梯度下降法SGDRegressor

sgd=SGDRegressor()
sgd.fit(x_train,y_train)
y_sgd_pred=std.inverse_transform(sgd.predict(x_test))
error_sgd=mean_squared_error(std.inverse_transform(y_test),y_sgd_pred)
print('斜率:',sgd.coef_)
print('截距:',sgd.intercept_)
print('均方误差:',error_sgd)

梯度下降法SGDRegressor结果:
斜率: [-0.08556966 0.08415892 -0.02406228 0.09539855 -0.12186342 0.32945003
-0.01042155 -0.28569839 0.15298948 -0.08681529 -0.18069349 0.07871156
-0.41953704]
截距: [0.00377308]
均方误差: 22.341906975421544

③ Ridge

rd=Ridge(alpha=1.0)
rd.fit(x_train,y_train)
print(rd.coef_)
print(rd.intercept_)
y_rd_pred=std.inverse_transform(rd.predict(x_test))
print('岭回归下均方误差:',mean_squared_error(std.inverse_transform(y_test),y_rd_pred))

Ridge结果:
斜率:[[-0.10546956 0.12265543 0.01810155 0.08491327 -0.18178902 0.30268784
-0.00504133 -0.33433398 0.27964259 -0.2279551 -0.19351241 0.07916974
-0.43224374]]
截距:[4.19852261e-15]
岭回归下均方误差: 21.982909442895018

4.保存模型

joblib.dump(rd,'./ri.pkl')

结论

由于boston房价数据量不大,使用LinearRegression预测效果比SGDRegressor梯度下降法效果要好。

你可能感兴趣的:(python,数据分析,可视化,机器学习)