机器学习:波士顿房价数据集
波士顿房价数据集(Boston House Price Dataset)(下载地址:http://t.cn/RfHTAgY)
使用sklearn.datasets.load_boston即可加载相关数据。该数据集是一个回归问题。每个类的观察值数量是均等的,共有 506 个观察,13 个输入变量和1个输出变量。
每条数据包含房屋以及房屋周围的详细信息。其中包含城镇犯罪率,一氧化氮浓度,住宅平均房间数,到中心区域的加权距离以及自住房平均房价等等。
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:自住房的平均房价,以千美元计。
预测平均值的基准性能的均方根误差(RMSE)是约 9.21 千美元。
重要参数
加载示例
from sklearn.datasets import load_boston
boston = load_boston()
print(boston.data.shape)
(506L, 13L)
from sklearn.datasets import load_boston
data,target = load_boston(return_X_y = True)
print(data.shape)
(506L, 13L)
print(target.shape)
(506L,)
#-*- coding:UTF-8 -*-
#第一步:读取波士顿房价数据
from sklearn.datasets import load_boston
boston = load_boston()
print boston.DESCR
#从输出结果来看,该数据共有506条波士顿房价的数据,每条数据包括对指定房屋的13项数值型特征和目标房价
#此外,该数据中没有缺失的属性/特征值,更加方便了后续的分析
#第二步:波士顿房价数据分割
from sklearn.model_selection import train_test_split
import numpy as np
X_train,X_test,y_train,y_test = train_test_split(boston.data,boston.target,test_size=0.25,random_state=33)
#分析回归目标值的差异
print 'The max target value is ',np.max(boston.target)
print 'The min target value is ',np.min(boston.target)
print 'The average target value is ',np.mean(boston.target)
#第三步:训练数据和测试数据标准化处理
from sklearn.preprocessing import StandardScaler
#分别初始化对特征值和目标值的标准化器
ss_X = StandardScaler()
ss_y = StandardScaler()
#训练数据都是数值型,所以要标准化处理
X_train = ss_X.fit_transform(X_train)
X_test = ss_X.transform(X_test)
#目标数据(房价预测值)也是数值型,所以也要标准化处理
#说明一下:fit_transform与transform都要求操作2D数据,而此时的y_train与y_test都是1D的,因此需要调用reshape(-1,1),例如:[1,2,3]变成[[1],[2],[3]]
y_train = ss_y.fit_transform(y_train.reshape(-1,1))
y_test = ss_y.transform(y_test.reshape(-1,1))
#第四步:使用线性回归模型LinearRegression和SGDRegressor分别对美国房价进行预测
#不要搞混了,这里用的是LinearRegression而不是线性分类的LogisticRegression
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(X_train,y_train)
lr_y_predict = lr.predict(X_test)
from sklearn.linear_model import SGDRegressor
sgdr = SGDRegressor()
sgdr.fit(X_train,y_train)
sgdr_y_predict = sgdr.predict(X_test)
#第五步:性能测评
#主要是判断预测值与真实值之间的差距,比较直观的评价指标有
#平均绝对值误差MAE(mean absolute error)
#均方误差MSE(mean squared error)
#R-squared评价函数
#使用LinearRegression模型自带的评估模块,并输出评估结果
print 'the value of default measurement of LR:',lr.score(X_test,y_test)
from sklearn.metrics import r2_score,mean_squared_error,mean_absolute_error
print 'the value of R-squared of LR is',r2_score(y_test,lr_y_predict)
#可以使用标准化器中的inverse_transform函数还原转换前的真实值
print 'the MSE of LR is',mean_squared_error(ss_y.inverse_transform(y_test),ss_y.inverse_transform(lr_y_predict))
print 'the MAE of LR is',mean_absolute_error(ss_y.inverse_transform(y_test),ss_y.inverse_transform(lr_y_predict))
#使用SGDRegressor自带的评估模块,并输出评估结果
print 'the value of default measurement of SGDR:',sgdr.score(X_test,y_test)
from sklearn.metrics import r2_score,mean_squared_error,mean_absolute_error
print 'the value of R-squared of SGDR is',r2_score(y_test,sgdr_y_predict)
print 'the MSE of SGDR is',mean_squared_error(ss_y.inverse_transform(y_test),ss_y.inverse_transform(sgdr_y_predict))
print 'the MAE of SGDR is',mean_absolute_error(ss_y.inverse_transform(y_test),ss_y.inverse_transform(sgdr_y_predict))
#总结:
#从输出结果来看,回归模型自带的评估结果与r2_score的值是一样的,推荐使用第一种方式
#SGDRegressor在性能上表现略逊于LinearRegression,前者是随机梯度下降的方式估计参数,后者是精确解析参数
#在数据量十分庞大(10W+)的时候,推荐使用SGDRegressor