- 深度学习训练营 21天实战TensorFlow+Keras+scikit-learn
- 张强
- 1740字
- 2020-08-27 11:30:47
1.1 数据准备
数据集是公开的,可以在前言所提供的链接下找到。本章使用的数据集是早期的房屋统计数据集,作为项目数据集来讲解也较为经典。波士顿的房屋数据集文件是housing.csv,北京的房屋数据集文件是bj_housing.csv。开始的时候,我们会用scikit-learn库来分析和预测,然后会用TensorFlow下的Keras的神经网络模型来预测,在预测结束后,都会使用一张对照图来直观地查看。
1.1.1 环境准备
◇ numpy=1.14.6。
◇ pandas=0.22.0。
◇ sklearn=0.19.2。
◇ seaborn=0.7.1。
◇ matplotlib=2.1.2。
◇ tensorflow=1.10.0。
1.1.2 预处理数据
在训练人工智能模型前,我们需要先观察和分析要训练的数据集,然后进行必要的预处理。这里我们先通过pandas的read_csv()函数加载housing.csv数据,获得489行乘以4列的数据,返回的是一个pandas的DataFrame对象(DataFrame可以简单地理解成类似Excel表格的数据对象,但它并不是Excel表格),然后查看前5行数据以观察。
import pandas as pd # 加载数据集 data=pd.read_csv('housing.csv') print("波士顿房屋数据有{}行x{}列。".format(data.shape[0],data.shape[1])) # 查看前5行数据 data.head()
输出如下。
波士顿房屋数据有489行x4列。
输出前5行数据,如图1.1所示。
图1.1 波士顿房屋数据集的前5行数据
图中该数据集的4列数据的含义分别如下。
◇ RM:该地区每座房屋的平均房间数量。
◇ LSTAT:该地区的房主中低收入阶层(有工作但收入微薄)所占百分比。
◇ PTRATIO:该地区的中小学里,学生和老师的人数之比(学生数/老师数)。
◇ MEDV:该地区业主自住房屋的价格中位数。
输出结果还有其他的字段(列),此处附图中只显示了主要的字段。然后,我们通过describe()函数来观察数据的基本统计信息,代码如下。
data.describe()
输出如图1.2所示。
图1.2 波士顿房屋数据基本统计信息
如果我们想自己写代码统计房屋价格的信息,可以这样写。
import numpy as np # 计算最低价格 minimum_price=np.min(data["MEDV"]) # 计算最高价格 maximum_price=np.max(data["MEDV"]) # 计算均值 mean_price=np.mean(data["MEDV"]) # 计算中间价格 median_price=np.median(data["MEDV"]) # 计算标准差价格 std_price=np.std(data["MEDV"]) # 打印输出所有计算的价格统计 print("波士顿房价数据的统计:") print("最低价格:${}".format(minimum_price)) print("最高价格:${}".format(maximum_price)) print("均价:${}".format(mean_price)) print("中间价格:${}".format(median_price)) print("标准差价格:${}".format(std_price))
输出如下。
波士顿房价数据的统计: 最低价格:$105000.0 最高价格:$1024800.0 均价:$454342.9447852761 中间价格:$438900.0 标准差价格:$165171.13154429474
然后,我们来分割一下训练集的训练数据X和y,也就是房屋特征数据features和房屋价格prices。变量data是一个DataFrame对象,它可以通过调用drop()函数来丢弃某个列。所以我们先取出MEDV列作为训练数据y,而训练数据X就是将MEDV列丢弃后的数据。
# 获取房屋价格 prices=data['MEDV'] # 获取房屋特征 features=data.drop('MEDV',axis=1)
1.1.3 数据可视化分析
我们接下来分别分析RM列、LSTAT列和PTRATIO列与MEDV列的相关性,会使用到seaborn库。seaborn库是一个用于统计数据可视化的库,它是基于Matplotlib库编写而来的,提供了更为方便、高级的封装和调用。这里就用seaborn来绘图显示。
首先,我们来分析RM列和MEDV列的相关性。先导入Matplotlib库,再导入seaborn库,最后调用regplot()函数,它会根据数据和线性回归的模型进行拟合。
import matplotlib.pyplot as plt import seaborn as sns # regplot()函数根据数据绘制线性回归(Linear Regression)模型图 # 参数1:X轴,表示每座房屋的平均房间数量 # 参数2:y轴,表示房屋价格 # 参数3:绘图时使用的颜色,这里是红色 sns.regplot(data['RM'],prices,color='red') # 显示绘图 plt.show()
输出结果如图1.3所示。
图1.3 RM列与MEDV列的相关性模型图
通过这个线性回归模型图,我们可以观察到,房间的数量越多,房屋价格就越高,也就是空间越大越舒适;还可以看到大部分房屋的房间数量在6个左右。
然后,我们分析LSTAT列和MEDV列的相关性。
# regplot()函数根据数据绘制线性回归(Linear Regression)模型图 # 参数1:X轴,表示该地区的房主中低收入阶层所占百分比 # 参数2:y轴,表示房屋价格 # 参数3:表示绘制的图是用什么标记绘制出来的,这里是“+” # 参数4:绘图时使用的颜色,这里是绿色 sns.regplot(data['LSTAT'],prices,marker='+',color='green')# 显示绘图 plt.show()
输出如图1.4所示。
图1.4 LSTAT列和MEDV列的相关性模型图
通过这个线性回归模型图,我们可以看到LSTAT列的数值越高,房屋价格就越低。LSTAT列表示该地区的房主中低收入阶层所占百分比,低收入阶层所占百分比的值越高,就意味着,周边的消费水平越低,房屋价格自然也会越低。
最后,我们来分析一下PTRATIO列和MEDV列的相关性。
# regplot()函数根据数据绘制线性回归(Linear Regression)模型图 # 参数1:X轴,表示该地区的中小学里,学生和老师的人数之比 # 参数2:y轴,表示房屋价格 # 参数3:表示绘制的图是用什么标记绘制出来的,这里是“^” # 参数4:绘图时使用的颜色,这里是蓝色 sns.regplot(data['PTRATIO'],prices,marker='^',color='blue') # 显示绘图 plt.show()
输出如图1.5所示。
图1.5 PTRATIO列和MEDV列的相关性模型图
通过这个线性回归模型图,我们得知PTRATIO列的值的增加会降低房屋价格。这是因为拥有学生和老师的人数之比较高表明该地区缺乏教学设施或资源;相反的是,学生和老师的人数之比较低的地方,教学设施或资源较好,该地区的房屋价格也就高一些。