活动背景
波士顿房地产市场竞争激烈,而你想成为该地区最好的房地产经纪人。为了更好地与同行竞争,你决定运用机器学习的一些基本概念,帮助客户为自己的房产定下最佳售价。幸运的是,你找到了波士顿房价的数据集,里面聚合了波士顿郊区包含多个特征维度的房价数据。你的任务是用可用的工具进行统计分析,并基于分析建立优化模型。这个模型将用来为你的客户评估房产的最佳售价。
数据介绍
详细代码解释
导入Python Packages
首先导入需要的python包
import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error plt.style.use('ggplot') %load_ext klab-autotime
读入数据 Read-In Data
将housing,csv读入
data = pd.read_csv('../data_files/2.Boston_housing/housing.csv') data.info() # No 属性 数据类型 字段描述x # 1 CRIM Float 城镇人均犯罪率 # 2 ZN Float 占地面积超过2.5万平方英尺的住宅用地比例 # 3 INDUS Float 城镇非零售业务地区的比例 # 4 CHAS Integer 查尔斯河虚拟变量 (= 1 如果土地在河边;否则是0) # 5 NOX Float 一氧化氮浓度(每1000万份) # 6 RM Float 平均每居民房数 # 7 AGE Float 在1940年之前建成的所有者占用单位的比例 # 8 DIS Float 与五个波士顿就业中心的加权距离 # 9 RAD Integer 辐射状公路的可达性指数 # 10 TAX Float 每10,000美元的全额物业税率 # 11 PTRATIO Float 城镇师生比例 # 12 B Float 1000(Bk - 0.63)^ 2其中Bk是城镇黑人的比例 # 13 LSTAT Float 人口中地位较低人群的百分数 # 14 MEDV Float (目标变量/类别属性)以1000美元计算的自有住房的中位数
从这里可以看出来,数据一共有14个特征,并且没有缺失值,所以我们可以不用缺失值处理,真不错
从Package读取Boston数据
其实在我们的sklearn库中,就有波士顿房屋数据集,我们可以直接读取数据集
from sklearn.datasets import load_boston dir(load_boston()) print(load_boston().DESCR)
这里也有对数据集详细的介绍,除此之外,我们还需要将数据集转化了类型,变为我们熟悉的pandas.core.frame.DataFrame,之后后面的操作就是一模一样的了
X = load_boston().data y = load_boston().target df = pd.DataFrame(X, columns=load_boston().feature_names) df.head()
相关性检验
看看各个特征中是否有相关性,判断一下用哪种模型比较合适
plt.figure(figsize=(12,8)) sns.heatmap(data.corr(), annot=True, fmt='.2f', cmap='PuBu')
数据不存在相关性较小的属性,也不用担心共线性,所以我们可以用线性回归模型去预测
data.corr()['MEDV'].sort_values()
多变量研究
尝试了解因变量和自变量、自变量和自变量之间的关系
sns.pairplot(data[["LSTAT","RM","PIRATIO","MEDV"]])
划分训练集和测试集
由于数据没有null值,并且,都是连续型数据,所以暂时不用对数据进行过多的处理,不够既然要建立模型,首先就要进行对housing分为训练集和测试集,取出了大概百分之20的数据作为测试集,剩下的百分之70为训练集
X ,y = data[data.columns.delete(-1)], data['MEDV'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=888)
查看训练集和测试集的维度
建立线性回归模型
首先,我利用线性回归模型对数据进行训练,并预测测试集数据,对于具体的线性回归的介绍,可以参考Linear Regression Machine Learning
linear_model = LinearRegression() linear_model.fit(X_train, y_train) coef = linear_model.coef_#回归系数 line_pre = linear_model.predict(X_test) print('SCORE:{:.4f}'.format(linear_model.score(X_test, y_test))) print('RMSE:{:.4f}'.format(np.sqrt(mean_squared_error(y_test, line_pre)))) coef
根据结果来看,预测的score为76%左右,然后均方误差RMSE大约是4.5,为了更好的看出预测数据的问题,我想试着可视化一下
df_coef = pd.DataFrame() df_coef['Title'] = data.columns.delete(-1) df_coef['Coef'] = coef df_coef
这是线性回归的相关系数
hos_pre = pd.DataFrame() hos_pre['Predict'] = line_pre hos_pre['Truth'] = y_test hos_pre.plot(figsize=(18,8))
- 得出score为76%,从上图得知预测的房价整体偏小,在10-35这个区间预测结果较为准确,超过这个区间预测价格偏小,可进一步对原始数据离群值做处理。
- 数据比较干净,练习起来缺少特征工程部分的工作,而且是预测性模型,相比分类问题少了模型选择上的空间。