机器学习工程师纳米学位
模型评价与验证
项目 1: 预测波士顿房价
欢迎来到机器学习工程师纳米学位的第一个项目!在此文件中,有些示例代码已经提供给你,但你还需要实现更多的功能来让项目成功运行。除非有明确要求,你无须修改任何已给出的代码。以‘练习’开始的标题表示接下来的内容中有需要你必须实现的功能。每一部分都会有详细的指导,需要实现的部分也会在注释中以‘TODO’标出。请仔细阅读所有的提示!
除了实现代码外,你还必须回答一些与项目和实现有关的问题。每一个需要你回答的问题都会以‘问题 X’为标题。请仔细阅读每个问题,并且在问题后的‘回答’文字框中写出完整的答案。你的项目将会根据你对问题的回答和撰写代码所实现的功能来进行评分。
提示:**Code 和 Markdown 区域可通过 **Shift + Enter 快捷键运行。此外,Markdown可以通过双击进入编辑模式。
开始
在这个项目中,你将利用马萨诸塞州波士顿郊区的房屋信息数据训练和测试一个模型,并对模型的性能和预测能力进行测试。通过该数据训练后的好的模型可以被用来对房屋做特定预测—尤其是对房屋的价值。对于房地产经纪等人的日常工作来说,这样的预测模型被证明非常有价值。
此项目的数据集来自UCI机器学习知识库。波士顿房屋这些数据于1978年开始统计,共506个数据点,涵盖了麻省波士顿不同郊区房屋14种特征的信息。本项目对原始数据集做了以下处理:
- 有16个'MEDV'
值为50.0的数据点被移除。 这很可能是由于这些数据点包含遗失或看不到的值。
- 有1个数据点的 'RM'
值为8.78. 这是一个异常值,已经被移除。
- 对于本项目,房屋的'RM'
, 'LSTAT'
,'PTRATIO'
以及'MEDV'
特征是必要的,其余不相关特征已经被移除。
- 'MEDV'
特征的值已经过必要的数学转换,可以反映35年来市场的通货膨胀效应。
运行下面区域的代码以载入波士顿房屋数据集,以及一些此项目所需的Python库。如果成功返回数据集的大小,表示数据集已载入成功。
# Import libraries necessary for this project
# 载入此项目所需要的库
import numpy as np
import pandas as pd
import visuals as vs # Supplementary code
from sklearn.model_selection import ShuffleSplit
# Pretty display for notebooks
# 让结果在notebook中显示
%matplotlib inline
# Load the Boston housing dataset
# 载入波士顿房屋的数据集
data = pd.read_csv('housing.csv')
prices = data['MEDV']
features = data.drop('MEDV', axis = 1)
# Success
# 完成
print "Boston housing dataset has {} data points with {} variables each.".format(*data.shape)
Boston housing dataset has 489 data points with 4 variables each.
分析数据
在项目的第一个部分,你会对波士顿房地产数据进行初步的观察并给出你的分析。通过对数据的探索来熟悉数据可以让你更好地理解和解释你的结果。
由于这个项目的最终目标是建立一个预测房屋价值的模型,我们需要将数据集分为特征(features)和目标变量(target variable)。特征 'RM'
, 'LSTAT'
,和 'PTRATIO'
,给我们提供了每个数据点的数量相关的信息。目标变量:'MEDV'
,是我们希望预测的变量。他们分别被存在features
和prices
两个变量名中。
练习:基础统计运算
你的第一个编程练习是计算有关波士顿房价的描述统计数据。我们已为你导入了numpy
,你需要使用这个库来执行必要的计算。这些统计数据对于分析模型的预测结果非常重要的。
在下面的代码中,你要做的是:
- 计算prices
中的'MEDV'
的最小值、最大值、均值、中值和标准差;
- 将运算结果储存在相应的变量中。
# TODO: Minimum price of the data
#目标:计算价值的最小值
minimum_price = min(prices)
# TODO: Maximum price of the data
#目标:计算价值的最大值
maximum_price = max(prices)
# TODO: Mean price of the data
#目标:计算价值的平均值
mean_price = np.mean(prices)
# TODO: Median price of the data
#目标:计算价值的中值
median_price = np.median(prices)
# TODO: Standard deviation of prices of the data
#目标:计算价值的标准差
std_price = np.std(prices)
# Show the calculated statistics
#目标:输出计算的结果
print "Statistics for Boston housing dataset:\n"
print "Minimum price: ${:,.2f}".format(minimum_price)
print "Maximum price: ${:,.2f}".format(maximum_price)
print "Mean price: ${:,.2f}".format(mean_price)
print "Median price ${:,.2f}".format(median_price)
print "Standard deviation of prices: ${:,.2f}".format(std_price)
Statistics for Boston housing dataset:
Minimum price: $105,000.00
Maximum price: $1,024,800.00
Mean price: $454,342.94
Median price $438,900.00
Standard deviation of prices: $165,171.13
问题1 - 特征观察
如前文所述,本项目中我们关注的是其中三个值:'RM'
、'LSTAT'
和'PTRATIO'
,对每一个数据点:
- 'RM'
是该地区中每个房屋的平均房间数量;
- 'LSTAT'
是指该地区有多少百分比的房东属于是低收入阶层(有工作但收入微薄);
- 'PTRATIO'
是该地区的中学和小学里,学生和老师的数目比(学生/老师
)。
凭直觉,上述三个特征中对每一个来说,你认为增大该特征的数值,'MEDV'
的值会是增大还是减小呢?每一个答案都需要你给出理由。
提示:你预期一个'RM'
值是6的房屋跟'RM'
值是7的房屋相比,价值更高还是更低呢?
import matplotlib
a = data['RM']
b = data['MEDV']
matplotlib.pyplot.scatter(a,b)
matplotlib.pyplot.show()
c = data['LSTAT']
matplotlib.pyplot.scatter(c,b)
matplotlib.pyplot.show()
d = data['PTRATIO']
matplotlib.pyplot.scatter(d,b)
matplotlib.pyplot.show()
回答: 结合散点图可以直观的看到:
当’RM’升高时’MEDV’会增大,原因是平均房间数量增加则必然带来房屋成本的上升,进而会使房价在整体上上涨。所以当我预期一个‘RM’值是6的房屋时,我会认为它的价值和‘RM’值为7的房屋相比更低。