@数据分析-回归-波士顿房价数据集
数据来源:
boston-housing-dataset
目录
1、目标
2、数据集介绍
3、代码
3.1 导入必须的工具包
3.2 导入数据
3.3 数据探索
3.4 数据集划分
3.5 模型构建
3.6 评价
根据历史房价数据建立回归模型,预测不同类型房屋的价格。
样本数:10000
特征数量: 13个相关属性(即13个指标变量),1个目标变量(房价)。
特征 说明
CRIM 城镇人均犯罪率
ZN 大于25,000平方英尺的地块划分为住宅用地的比例
INDUS 每个城镇非零售业务的比例
CHAS 查尔斯河虚拟变量(如果 = 1则为河; =0则不为河)
NOX 一氧化氮浓度(每千万)
RM 每间住宅的平均房间数
AGE 自住房屋是在1940年之前建造的比例
DIS 到加州五个就业中心的加权距离
RAD 对径向高速公路的可达性指数
TAX 每10,000美元的全价物业税
PTRATIO 城镇的学生与教师比例
B 1000(Bk-0.63)^ 2其中Bk是城镇的黑人的比例
LSTAT 低社会阶层人口比例%
MEDV 以1000美元为单位的自住房屋的中位数价格
import numpy as np
import pandas as pd
from sklearn import preprocessing
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression,Lasso,ElasticNet
from sklearn.metrics import r2_score
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sn
data = pd.read_csv("d:/datasets/HousingData.csv")#读取csv
查看数据的类型,完整性
查看数据的统计特征(均值、方差等)
data.head() #查看前五行
data.tail()
data.sample()
data.info() #查看数据的类型,完整性
data.describe() #查看数据的统计特征(均值、方差等)
data.dropna(inplace=True) #删除有缺失的样本
通过散点图展示各特征与目标变量的关系
for id in data.columns[:-1]:
sn.pairplot(data[[id,data.columns[-1]]])
特征与标签分离,y = 波士顿房价,X = 输入变量
y = data['MEDV'] # 标签-房价
X = data.drop(['MEDV'], axis=1) #去掉标签(房价)的数据子集
X_train为训练数据, y_train为训练集标签,X_test为测试数据,y_test为测试集标签。
抽取70%的数据作为训练集, 用剩余样本进行分类结果测试。
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3)
Z-score标准化,在训练集上训练,在训练集与测试集上标准化,泛化时标准化也用训练集上的训练结果。
scaler=preprocessing.StandardScaler().fit(X_train)
X_train=scaler.transform(X_train)
X_test=scaler.transform(X_test)
LinearRegression回归模型:
lr = LinearRegression() #实例化一个线性回归对象
lr.fit(X_train, y_train) #采用fit方法,拟合回归系数和截距
print(lr.intercept_) #输出截距
print(lr.coef_) #输出系数 可分析特征的重要性以及与目标的关系
y_pred = lr.predict(X_test)#模型预测
print("R2=",r2_score(y_test, y_pred))#模型评价, 决定系数
#print("mse=",mean_squared_error(y_test, y_pred))#均方误差
#print(lr.intercept_) #输出截距
#print(lr.coef_) #系数
0.7244902005756717
可视化预测值与真实值
plt.plot(y_test.values,c="r",label="y_test")
plt.plot(y_pred,c="b",label="y_pred")
plt.legend()
ElasticNet回归
EN=ElasticNet(0.01) #实例化弹性网络回归对象
EN.fit(X_train,y_train) #训练
y_pred=EN.predict(X_test) #预测
#评价
print(r2_score(y_pred,y_test))
#print("mse=",mean_squared_error(y_test, y_pred))#均方误差
y_predt=EN.predict(X_train) #查看训练集上的效果
print(r2_score(y_predt,y_train))
0.6206474701040163 0.7143978031016661
lasso回归
la = Lasso()
la.fit(X_train, y_train)#拟合
y_pred=la.predict(X_test) #预测
#评价
print(r2_score(y_pred,y_test))
#print("mse=",mean_squared_error(y_test, y_pred))#均方误差
y_predt=la.predict(X_train) #查看训练集上的效果
print(r2_score(y_predt,y_train))
#prtin(la.coef_) #输出系数 (部分系数为“0”,lasso常用与特征提取) 可分析特征的重要性以及与目标的关系
0.6463644720156518 0.7135957871520437
岭回归
from sklearn.linear_model import Ridge
rd=Ridge(0.01)
rd.fit(X_train,y_train)
y_pred=rd.predict(X_test)
print(r2_score(y_pred,y_test))
y_predt=rd.predict(X_train)
print(r2_score(y_predt,y_train))
0.6254595151946203 0.717315101727843
贝叶斯岭回归
from sklearn.linear_model import BayesianRidge
Brd=BayesianRidge()
Brd.fit(X_train,y_train)
y_pred=Brd.predict(X_test)
print(r2_score(y_pred,y_test))
y_predt=Brd.predict(X_train)
print(r2_score(y_predt,y_train))
0.6117791860152302 0.708456749967072
K近邻回归
from sklearn.neighbors import KNeighborsRegressor
Knr=KNeighborsRegressor()
Knr.fit(X_train,y_train)
y_pred=Knr.predict(X_test)
print(r2_score(y_pred,y_test))
y_predt=Knr.predict(X_train)
r2_score(y_predt,y_train)
0.47466312380045683 0.7576061948485711
支持向量回归
from sklearn.svm import SVR
svr=SVR()
svr.fit(X_train,y_train)
y_pred=svr.predict(X_test)
print(r2_score(y_pred,y_test))
y_predt=svr.predict(X_train)
r2_score(y_predt,y_train)
-0.3945293748344476 #训练效果差到不如用均值估计 0.1313717790081549
决策树回归
from sklearn.tree import DecisionTreeRegressor
dtr=DecisionTreeRegressor(max_depth=4)
dtr.fit(X_train,y_train)
y_pred=dtr.predict(X_test)
print(r2_score(y_pred,y_test))
y_predt=dtr.predict(X_train)
print(r2_score(y_predt,y_train))
0.7795924378835133 0.8862706664213111
多项式回归
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=2) # 添加特征(升维)
poly.fit(X_train)
poly.fit(X_test)
X_1 = poly.transform(X_train)
X_2 = poly.transform(X_test)
# 训练
lin_reg = LinearRegression()
lin_reg.fit(X_1, y_train)
#预测、评价
y_pred = lin_reg.predict(X_1)
print(r2_score(y_pred,y_train))
y_pred = lin_reg.predict(X_2)
print(r2_score(y_pred,y_test))
0.9613453122107047 #训练集效果很好,测试集一般,过拟合 0.7262626772433789