机器学习练习项目:波士顿房价预测

本项目使用jupyter完成,annacode包含所有需要的库,相应数据资源已上传.


第一步. 导入数据

在这个项目中,你将利用马萨诸塞州波士顿郊区的房屋信息数据训练和测试一个模型,并对模型的性能和预测能力进行测试。通过该数据训练后的好的模型可以被用来对房屋做特定预测—尤其是对房屋的价值。对于房地产经纪等人的日常工作来说,这样的预测模型被证明非常有价值。

波士顿房屋这些数据于1978年开始统计,共506个数据点,涵盖了麻省波士顿不同郊区房屋14种特征的信息。本项目对原始数据集做了以下处理:

  • 有16个'MEDV' 值为50.0的数据点被移除。 这很可能是由于这些数据点包含遗失看不到的值
  • 有1个数据点的 'RM' 值为8.78. 这是一个异常值,已经被移除。
  • 对于本项目,房屋的'RM''LSTAT''PTRATIO'以及'MEDV'特征是必要的,其余不相关特征已经被移除。
  • 'MEDV'特征的值已经过必要的数学转换,可以反映35年来市场的通货膨胀效应。

运行下面区域的代码以载入波士顿房屋数据集,以及一些此项目所需的 Python 库。如果成功返回数据集的大小,表示数据集已载入成功。

# Import libraries necessary for this project 1.导入必要的包
import numpy as np
import pandas as pd
from sklearn.model_selection import ShuffleSplit

# Import supplementary visualizations code visuals.py导入数据可视化包
import visuals as vs

# Pretty display for notebooks
%matplotlib inline

# Load the Boston housing dataset 2.加载波士顿房屋数据
data = pd.read_csv('housing.csv')#读取的数据叫data,见下图。
prices = data['MEDV']#获取列名为'MEDV'列的数据叫价格 3.分割数据
features = data.drop('MEDV', axis = 1)# 从axis=1轴(列)中删去列名为'MEDV'的列,剩下的三列是特征
    
# 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.
机器学习练习项目:波士顿房价预测_第1张图片

  • 'RM' 是该地区中每个房屋的平均房间数量;
  • 'LSTAT' 是指该地区有多少百分比的业主属于是低收入阶层(有工作但收入微薄);
  • 'PTRATIO' 是该地区的中学和小学里,学生和老师的数目比(学生/老师)。
  • 'MEDV'是该地区房子的平均售价。

第二步. 分析数据

在项目的第一个部分,你会对波士顿房地产数据进行初步的观察并给出你的分析。通过对数据的探索来熟悉数据可以让你更好地理解和解释你的结果。

由于这个项目的最终目标是建立一个预测房屋价值的模型,我们需要将数据集分为特征(features)目标变量(target variable)

  • 特征 'RM''LSTAT',和 'PTRATIO',给我们提供了每个数据点的数量相关的信息。
  • 目标变量'MEDV',是我们希望预测的变量。

他们分别被存在 featuresprices 两个变量名中。

编程练习 1:基础统计运算

你的第一个编程练习是计算有关波士顿房价的描述统计数据。我们已为你导入了 NumPy,你需要使用这个库来执行必要的计算。这些统计数据对于分析模型的预测结果非常重要的。
在下面的代码中,你要做的是:

  • 计算 prices 中的 'MEDV' 的最小值、最大值、均值、中值和标准差;
  • 将运算结果储存在相应的变量中。
# TODO: Minimum price of the data
minimum_price = prices.min() #np.min(prices)各地区价格最小值

# TODO: Maximum price of the data
maximum_price = prices.max()#np.max(prices)各地区价格的最大值

# TODO: Mean price of the data
mean_price = prices.mean()#np.average(prices)所有价格的平均值

# TODO: Median price of the data
median_price = prices.median()#np.median(prices)所有价格的中位数

# TODO: Standard deviation of prices of the data
std_price = prices.std()#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: $105000.00
Maximum price: $1024800.00
Mean price: $454342.94
Median price $438900.00
Standard deviation of prices: $165340.28

问题 1 - 特征观察

如前文所述,本项目中我们关注的是其中三个值:'RM''LSTAT''PTRATIO',对每一个数据点:

  • 'RM' 是该地区中每个房屋的平均房间数量;
  • 'LSTAT' 是指该地区有多少百分比的业主属于是低收入阶层(有工作但收入微薄);
  • 'PTRATIO' 是该地区的中学和小学里,学生和老师的数目比(学生/老师)。

凭直觉,上述三个特征中对每一个来说,你认为增大该特征的数值,'MEDV'的值会是增大还是减小呢?每一个答案都需要你给出理由。

**提示:**你预期一个'RM' 值是6的房屋跟'RM' 值是7的房屋相比,价值更高还是更低呢?

问题 1 - 回答:

增大RM的值会,MEDV会增大,因为其他量不变的情况下,增加房间数量,一般是增大了房屋面积,则房子价格会更高。增大LSTAT,低收入阶层比例增加,则房屋的价格会更低。增大PTRATIO,学生和老师的数目比增加,则意味着这边学校少,所以房子价格会更低。


第三步. 建立模型

在项目的第三步中,你需要了解必要的工具和技巧来让你的模型进行预测。用这些工具和技巧对每一个模型的表现做精确的衡量可以极大地增强你预测的信心。

编程练习2:定义衡量标准

如果不能对模型的训练和测试的表现进行量化地评估,我们就很难衡量模型的好坏。通常我们会定义一些衡量标准,这些标准可以通过对某些误差或者拟合程度的计算来得到。在这个项目中,你将通过运算决定系数 R 2 R^2 R2 来量化模型的表现。模型的决定系数是回归分析中十分常用的统计信息,经常被当作衡量模型预测能力好坏的标准。

R 2 R^2 R2 的数值范围从0至1,表示目标变量的预测值和实际值之间的相关程度平方的百分比。一个模型的 R 2 R^2 R2 值为0还不如直接用平均值来预测效果好;而一个 R 2 R^2 R2 值为1的模型则可以对目标变量进行完美的预测。从0至1之间的数值,则表示该模型中目标变量中有百分之多少能够用特征来解释。模型也可能出现负值的 R 2 R^2 R2,这种情况下模型所做预测有时会比直接计算目标变量的平均值差很多。
综上, R 2 R^2 R2 值越接近1越好。

在下方代码的 performance_metric 函数中,你要实现:

  • 使用 sklearn.metrics 中的 r2_score来计算 y_truey_predict R 2 R^2 R2 值,作为对其表现的评判。
  • 将他们的表现评分储存到 score 变量中。
# TODO: Import 'r2_score'
from sklearn.metrics import r2_score

def performance_metric(y_true, y_predict):
    """ Calculates and returns the performance score between 
        true and predicted values based on the metric chosen. """
    
    # TODO: Calculate the performance score between 'y_true' and 'y_predict'
    score = r2_score(y_true,y_predict)
    
    # Return the score
    return score

后面如果需要用到判断预测值好坏的指标,我们就调用performance_metric 函数即可。

问题 2 - 拟合程度

假设一个数据集有五个数据且一个模型做出下列目标变量的预测:

真实数值 预测数值
3.0 2.5
-0.5 0.0
2.0 2.1
7.0 7.8
4.2 5.3

你觉得这个模型已成功地描述了目标变量的变化吗?如果成功,请解释为什么,如果没有,也请给出原因。

提示1:运行下方的代码,使用 performance_metric 函数来计算 y_truey_predict 的决定系数。

提示2 R 2 R^2 R2 分数是指可以从自变量中预测的因变量的方差比例。 换一种说法:

  • R 2 R^2 R2 为0意味着因变量不能从自变量预测。
  • R 2 R^2 R2 为1意味着可以从自变量预测因变量。
  • R 2 R^2 R2 在0到1之间表示因变量可预测的程度。
  • R 2 R^2 R2 为0.40意味着 Y 中40%的方差可以从 X 预测。
# Calculate the performance of this model
score = performance_metric([3, -0.5, 2, 7, 4.2], [2.5, 0.0, 2.1, 7.8, 5.3])#第一个列表是真实值,第二个列表是预测值,调用前面写的函数。
print("Model has a coefficient of determination, R^2, of {:.3f}.".format(score))

Model has a coefficient of determination, R^2, of 0.923.

问题 2 - 回答:

我觉得这个模型已成功述了目标变量的变化,因为从上面的 R 2 R^2 R2 为0.923,很接近1,R^2越接近1对目标变量预测越完美。

以上代码仅用来熟悉如何评判预测数据和真实数据的差别。

编程练习 3: 数据分割与重排

接下来,你需要把波士顿房屋数据集分成训练和测试两个子集。通常在这个过程中,数据也会被重排列,以消除数据集中由于顺序而产生的偏差。
在下面的代码中,你需要

  • 使用 sklearn.model_selection 中的 train_test_split, 将 featuresprices 的数据都分成用于训练的数据子集和用于测试的数据子集。
    • 分割比例为:80%的数据用于训练,20%用于测试;
    • 选定一个数值以设定 train_test_split 中的 random_state ,这会确保结果的一致性;
  • 将分割后的训练集与测试集分配给 X_train, X_test, y_trainy_test
# TODO: Import 'train_test_split'
from sklearn.model_selection import train_test_split

# TODO: Shuffle and split the data into training and testing subsets
X_train, X_test, y_train, y_test = train_test_split(features, prices,test_size=0.2,random_state=10)
#房屋房间数、收入水平、教资水平都是features(X),价格是prices(y),把他们都按照80%训练集20%测试集划分
#4.采样训练样本和测试样本,X是输入特征,y是输入标签,random_state:随机种子, test_size:测试样本数占比。

# Success
print("Training and testing split was successful.")

Training and testing split was successful.

至此我们已经把表里的数据都分成了两份,一份训练,一份测试。测试集只有最后最后才能用,也就是编程练习5,接下来的编程用的是验证集。

问题 3 - 训练及测试

将数据集按一定比例分为训练用的数据集和测试用的数据集对学习算法有什么好处?

如果用模型已经见过的数据,例如部分训练集数据进行测试,又有什么坏处?

提示: 如果没有数据来对模型进行测试,会出现什么问题?

问题 3 - 回答:

  • 将数据集分成训练集和测试集的好处:既可以用于训练又可以用于测试,而且不会相互干扰,而且可以对训练模型进行有效的验证。
  • 用部分训练集进行测试的坏处:模型就是根据训练集得出的,使用训练集进行测试肯定会得出较好的结果,这不能判断训练模型的优劣。
    可参考以下博文。
    训练集和测试集

第四步. 分析模型的表现

在项目的第四步,我们来看一下不同参数下,模型在训练集和验证集上的表现。这里,我们专注于一个特定的算法(带剪枝的决策树,但这并不是这个项目的重点),和这个算法的一个参数 'max_depth'。用全部训练集训练,选择不同'max_depth' 参数,观察这一参数的变化如何影响模型的表现。画出模型的表现来对于分析过程十分有益。
这步的目的是观察超参数对于模型好坏的影响程度,力求找出最好参数下的最好模型。

学习曲线

下方区域内的代码会输出四幅图像,它们是一个决策树模型在不同最大深度下的表现。每一条曲线都直观得显示了随着训练数据量的增加,模型学习曲线的在训练集评分和验证集评分的变化,评分使用决定系数 R 2 R^2 R2。曲线的阴影区域代表的是该曲线的不确定性(用标准差衡量)。
可参考模型选择第5点,学习曲线
该曲线的可变参数是数据量。

运行下方区域中的代码,并利用输出的图形回答下面的问题。

# Produce learning curves for varying training set sizes and maximum depths
vs.ModelLearning(features, prices)

机器学习练习项目:波士顿房价预测_第2张图片
这里我们要清楚,红线是训练集的得分,绿线是验证集的得分。横坐标向右代表随着数据量增加,纵坐标向上代表得分越高。

问题 4 - 学习曲线

  • 选择上述图像中的其中一个,并给出其最大深度。
  • 随着训练数据量的增加,训练集曲线的评分有怎样的变化?验证集曲线呢?
  • 如果有更多的训练数据,是否能有效提升模型的表现呢?

**提示:**学习曲线的评分是否最终会收敛到特定的值?一般来说,你拥有的数据越多,模型表现力越好。但是,如果你的训练和测试曲线以高于基准阈值的分数收敛,这是否有必要?基于训练和测试曲线已经收敛的前提下,思考添加更多训练点的优缺点。

问题 4 - 回答:

选择第二幅图,也就是max_depth最大深度为3的图像。
随着训练数量的增加,训练集曲线的评分趋于平稳在0.8左右,验证集曲线也逐渐平稳接近0.8左右。
模型已经趋于稳定,如果有更多的训练数据,也不能有效提升模型的表现了。

复杂度曲线

下列代码内的区域会输出一幅图像,它展示了一个已经经过训练和验证的决策树模型在不同最大深度条件下的表现。这个图形将包含两条曲线,一个是训练集的变化,一个是验证集的变化。跟学习曲线相似,阴影区域代表该曲线的不确定性,模型训练和测试部分的评分都用的 performance_metric 函数。
该曲线的可变量是深度参数。

运行下方区域中的代码,并利用输出的图形并回答下面的问题5与问题6。

vs.ModelComplexity(X_train, y_train)

机器学习练习项目:波士顿房价预测_第3张图片

问题 5 - 偏差(bias)与方差(variance)之间的权衡取舍

  • 当模型以最大深度 1训练时,模型的预测是出现很大的偏差还是出现了很大的方差?
  • 当模型以最大深度10训练时,情形又如何呢?
  • 图形中的哪些特征能够支持你的结论?

提示: 高偏差表示欠拟合(模型过于简单),而高方差表示过拟合(模型过于复杂,以至于无法泛化)。考虑哪种模型(深度1或10)对应着上述的情况,并权衡偏差与方差。
可参考模型选择第1点,欠拟合和过拟合

问题 5 - 回答:

当模型以最大深度 1训练时,训练得分和验证得分都比较低,模型预测出现很大的偏差,是欠拟合。
当模型以最大深度10训练时,训练得分很高,但是验证得分很低,模型预测出现很高的方差,是过拟合。

问题 6- 最优模型的猜测

  • 结合问题 5 中的图,你认为最大深度是多少的模型能够最好地对未见过的数据进行预测?
  • 你得出这个答案的依据是什么?

提示:查看问题5上方的图表,并查看模型在不同 depth下的验证分数。随着深度的增加模型的表现力会变得更好吗?我们在什么情况下获得最佳验证分数而不会使我们的模型过度复杂?请记住,奥卡姆剃刀:“在竞争性假设中,应该选择假设最少的那一个。”

问题 6 - 回答:

我认为最大深度是4时,模型能够最好地对未见过的数据进行预测。
模型在深度为4时的测试集得分和验证集得分基本达到最高值,且两者差距不大,获得最佳验证分数的同时而不会使我们的模型过度复杂。


第五步. 评估模型的表现

在项目的最后一节中,你将构建一个模型,并使用 fit_model 中的优化模型去预测客户特征集。

问题 7- 网格搜索(Grid Search)

  • 什么是网格搜索法?
  • 如何用它来优化模型?

提示:在解释网格搜索算法时,首先要理解我们为什么使用网格搜索算法,以及我们使用它的最终目的是什么。为了使你的回答更具有说服力,你还可以给出一个模型中可以使用此方法进行优化参数的示例。
可参考模型选择第6点,网格搜索

问题 7 - 回答:

网格搜索:对于存在多个超参数的模型,我们制作一个表格列出所有可能的组合,然后选择最佳组合。
根据给定的模型自动进行交叉验证,通过调节每一个参数来跟踪评分结果.
参数是通过for循环的方式进行组合的,从而实现跟踪每一组参数进行评分结果。

问题 8 - 交叉验证

  • 什么是K折交叉验证法(k-fold cross-validation)?
  • GridSearchCV 是如何结合交叉验证来完成对最佳参数组合的选择的?
  • GridSearchCV 中的'cv_results_'属性能告诉我们什么?
  • 网格搜索为什么要使用K折交叉验证?K折交叉验证能够避免什么问题?

提示:在解释k-fold交叉验证时,一定要理解’k’是什么,和数据集是如何分成不同的部分来进行训练和测试的,以及基于’k’值运行的次数。
在考虑k-fold交叉验证如何帮助网格搜索时,你可以使用特定的数据子集来进行训练与测试有什么缺点,以及K折交叉验证是如何帮助缓解这个问题。

问题 8 - 回答:

1.可参考模型选择第4点,K-FOLD交叉验证
数据被分为训练集和测试集,那么总是会有些对训练模型有用的数据被浪费了,为了充分利用数据,使用K-FOLD交叉验证。
把所有数据分成K份,
每次留出一份作为测试集,其余数据作为训练集,
这样循环K次,求结果的平均值,最终得到模型。
2.GridSearchCV根据你给定的模型自动进行交叉验证,通过调节每一个参数来跟踪评分结果,实际上,该过程代替了进行参数搜索时的for循环过程.在尝试所有组合后,对每组数据进行跟踪评分,从而选择一组最佳参数组合作为最优解。而其通过调节其cv参数来实现与较差验证来实现最佳参数的选择,bestparams属性查看最优解。
cv: int类型参数,交叉验证生成器,具有可迭代性,可选性
确定交叉验证拆分策略。cv取值的可能输入是:
None,要使用默认的5倍交叉验证,
整数,用于指定的折叠次数(Stratified)KFold,
cv分配器,
可迭代的yield(训练,测试)拆分为索引数组。
3.交叉验证的结果。
cv_results_ :返回结果是 numpy dict字典
该字典将列标题作为字典的键,列值作为字典的值,可以将其导入pandas DataFrame。
4.网格搜索不使用交叉验证,可以使训练速度更快,但是难以找到到最优的模型参数;使用交叉验证对每一个参数组合得出的评分更为准确和鲁棒,提高评估的稳定性。

编程练习 4:拟合模型

在这个练习中,你将需要将所学到的内容整合,使用决策树算法训练一个模型。为了得出的是一个最优模型,你需要使用网格搜索法训练模型,以找到最佳的 'max_depth' 参数。你可以把'max_depth' 参数理解为决策树算法在做出预测前,允许其对数据提出问题的数量。决策树是监督学习算法中的一种。

另外,你会发现在实现的过程中是使用ShuffleSplit()作为交叉验证的另一种形式(参见’cv_sets’变量)。虽然它不是你在问题8中描述的K-fold交叉验证方法,但它同样非常有用!下面的ShuffleSplit()实现将创建10个(‘n_splits’)混洗集合,并且对于每个混洗集,数据的20%(‘test_size’)将被用作验证集合。当您在实现代码的时候,请思考一下它与 K-fold cross-validation 的不同与相似之处。

请注意,ShuffleSplitScikit-Learn 版本0.17和0.18中有不同的参数。对于下面代码单元格中的 fit_model 函数,您需要实现以下内容:

  1. 定义 'regressor' 变量: 使用 sklearn.tree 中的 DecisionTreeRegressor 创建一个决策树的回归函数;
  2. 定义 'params' 变量: 为 'max_depth' 参数创造一个字典,它的值是从1至10的数组;
  3. 定义 'scoring_fnc' 变量: 使用 sklearn.metrics 中的 make_scorer 创建一个评分函数。将 ‘performance_metric’ 作为参数传至这个函数中;
  4. 定义 'grid' 变量: 使用 sklearn.model_selection 中的 GridSearchCV 创建一个网格搜索对象;将变量'regressor', 'params', 'scoring_fnc''cv_sets' 作为参数传至这个对象构造函数中;

如果你对 Python 函数的默认参数定义和传递不熟悉,可以参考这个MIT课程的视频。

#TODO: Import 'make_scorer', 'DecisionTreeRegressor', and 'GridSearchCV'
from sklearn.metrics import make_scorer
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import GridSearchCV

def fit_model(X, y):
    """ Performs grid search over the 'max_depth' parameter for a 
        decision tree regressor trained on the input data [X, y].
        基于输入数据 [X,y],利于网格搜索找到最优的决策树模型 """
    # cross_validator = KFold(n_splits=10)#k折交叉验证的用法
    # Create cross-validation sets from the training data
    # sklearn version 0.18: ShuffleSplit(n_splits=10, test_size=0.1, train_size=None, random_state=None)
    # sklearn versiin 0.17: ShuffleSplit(n, n_iter=10, test_size=0.1, train_size=None, random_state=None)
    cv_sets = ShuffleSplit(n_splits=10, test_size=0.20, random_state=0)#创建10个混选集合用来交叉验证
    
    # TODO: Create a decision tree regressor object
    regressor = DecisionTreeRegressor(random_state = 10)#创建出一个决策树对象

    # TODO: Create a dictionary for the parameter 'max_depth' with a range from 1 to 10
    params = {"max_depth":range(1,11)}#深度为1-10的字典

    # TODO: Transform 'performance_metric' into a scoring function using 'make_scorer' 
    scoring_fnc = make_scorer(performance_metric)#得分

    # TODO: Create the grid search cv object --> GridSearchCV()
    # Make sure to include the right parameters in the object:
    # (estimator, param_grid, scoring, cv) which have values 'regressor', 'params', 'scoring_fnc', and 'cv_sets' respectively.
    grid = GridSearchCV(regressor,params,scoring_fnc,cv=cv_sets)#创建出一个网格搜索对象,参数是前面定义的各个变量

    # Fit the grid search object to the data to compute the optimal model
    grid = grid.fit(X, y)#把数据 [X,y]带入模型,进行网格搜索

    # Return the optimal model after fitting the data
    return grid.best_estimator_#返回网格搜索后的最优模型

第六步. 做出预测

当我们用数据训练出一个模型,它现在就可用于对新的数据进行预测。在决策树回归函数中,模型已经学会对新输入的数据提问,并返回对目标变量的预测值。你可以用这个预测来获取数据未知目标变量的信息,这些数据必须是不包含在训练数据之内的。

问题 9 - 最优模型

最优模型的最大深度(maximum depth)是多少?此答案与你在问题 6所做的猜测是否相同?

运行下方区域内的代码,将决策树回归函数代入训练数据的集合,以得到最优化的模型。

 Fit the training data to the model using grid search
reg = fit_model(X_train, y_train)#这是模型的名字,下面会用到

# Produce the value for 'max_depth'
print("Parameter 'max_depth' is {} for the optimal model.".format(reg.get_params()['max_depth']))

Parameter ‘max_depth’ is 4 for the optimal model.

问题 9 - 回答:

最优模型的最大深度(maximum depth)是4?此答案与我在问题 6所做的猜测相同。

问题 10 - 预测销售价格

想像你是一个在波士顿地区的房屋经纪人,并期待使用此模型以帮助你的客户评估他们想出售的房屋。你已经从你的三个客户收集到以下的资讯:

特征 客戶 1 客戶 2 客戶 3
房屋内房间总数 5 间房间 4 间房间 8 间房间
社区贫困指数(%被认为是贫困阶层) 17% 32% 3%
邻近学校的学生-老师比例 15:1 22:1 12:1
  • 你会建议每位客户的房屋销售的价格为多少?
  • 从房屋特征的数值判断,这样的价格合理吗?为什么?

提示:用你在分析数据部分计算出来的统计信息来帮助你证明你的答案。

运行下列的代码区域,使用你优化的模型来为每位客户的房屋价值做出预测。

# Produce a matrix for client data
client_data = [[5, 17, 15], # Client 1
               [4, 32, 22], # Client 2
               [8, 3, 12]]  # Client 3

# Show predictions
for i, price in enumerate(reg.predict(client_data)):
    print("Predicted selling price for Client {}'s home: ${:,.2f}".format(i+1, price))

Predicted selling price for Client 1’s home: $406,933.33
Predicted selling price for Client 2’s home: $232,200.00
Predicted selling price for Client 3’s home: $938,053.85

问题 10 - 回答:

Client 1’s home: $406,933.33
Client 2’s home: $232,200.00
Client 3’s home: $938,053.85
合理,
Minimum price: $105000.00
Maximum price: $1024800.00
Mean price: $454342.94
Median price $438900.00
Standard deviation of prices: $165340.28
预测的数据都在最大最小值内,且去均值也与数据集较相近。

编程练习 5

你刚刚预测了三个客户的房子的售价。在这个练习中,你将用你的最优模型在整个测试数据上进行预测, 并计算相对于目标变量的决定系数 R 2 R^2 R2 的值。

提示:

  • 你可能需要用到 X_test, y_test, reg, performance_metric
  • 参考问题10的代码进行预测。
  • 参考问题2的代码来计算 R 2 R^2 R2 的值。
# TODO Calculate the r2 score between 'y_true' and 'y_predict'
y_predict = reg.predict(X_test)#预测测试集的数据

r2 = performance_metric(y_test,y_predict)#计算测试集的真实值与预测值的R2得分

print("Optimal model has R^2 score {:,.2f} on test data".format(r2))

Optimal model has R^2 score 0.75 on test data
这个参数,我越调越小,唉!

问题11 - 分析决定系数

你刚刚计算了最优模型在测试集上的决定系数,你会如何评价这个结果?

问题11 - 回答

r2得分是0.75,预测的准确性较大。

模型健壮性

一个最优的模型不一定是一个健壮模型。有的时候模型会过于复杂或者过于简单,以致于难以泛化新增添的数据;有的时候模型采用的学习算法并不适用于特定的数据结构;有的时候样本本身可能有太多噪点或样本过少,使得模型无法准确地预测目标变量。这些情况下我们会说模型是欠拟合的。

问题 12 - 模型健壮性

模型是否足够健壮来保证预测的一致性?

提示: 执行下方区域中的代码,采用不同的训练和测试集执行 fit_model 函数10次。注意观察对一个特定的客户来说,预测是如何随训练数据的变化而变化的。

vs.PredictTrials(features, prices, fit_model, client_data)

Trial 1: $391,183.33
Trial 2: $424,935.00
Trial 3: $415,800.00
Trial 4: $420,622.22
Trial 5: $418,377.27
Trial 6: $411,931.58
Trial 7: $399,663.16
Trial 8: $407,232.00
Trial 9: $351,577.61
Trial 10: $413,700.00

Range in prices: $73,357.39

问题 12 - 回答:

预测数据一直在40万左右,说明模型比较健壮。

问题 13 - 实用性探讨

简单地讨论一下你建构的模型能否在现实世界中使用?

提示:回答以下几个问题,并给出相应结论的理由:

  • 1978年所采集的数据,在已考虑通货膨胀的前提下,在今天是否仍然适用?
  • 数据中呈现的特征是否足够描述一个房屋?
  • 在波士顿这样的大都市采集的数据,能否应用在其它乡镇地区?
  • 你觉得仅仅凭房屋所在社区的环境来判断房屋价值合理吗?

问题 13 - 回答:

不适用。因为:
数据采集年代距今过去很长时间了,存在通货膨胀。
数据中仅使用三个特征数据,呈现的特征不足够描述一个房屋。
在波士顿这样的大都市采集的数据,不能应用在其它乡镇地区。
仅仅凭房屋所在社区的环境来判断房屋价值不合理。


删繁去简,如果直接使用需要的代码,会是如下样子。

# 1导入数据
import numpy as np
import pandas as pd
from sklearn.model_selection import ShuffleSplit
import visuals as vs
%matplotlib inline

data = pd.read_csv('housing.csv')
prices = data['MEDV']
features = data.drop('MEDV', axis = 1)
print("Boston housing dataset has {} data points with {} variables each.".format(*data.shape))
print "Boston housing dataset has {} data points with {} variables each.".format(*data.shape)

# 2分析数据
minimum_price = prices.min()
maximum_price = prices.max()
mean_price = prices.mean()
median_price = prices.median()
std_price = prices.std()

# 3划分数据
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(features, prices,test_size=0.2,random_state=10)

# 4拟合模型
from sklearn.metrics import make_scorer
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import GridSearchCV

def fit_model(X, y):
    cv_sets = ShuffleSplit(n_splits=10, test_size=0.20, random_state=0)
    regressor = DecisionTreeRegressor(random_state = 10)
    params = {"max_depth":range(1,11)}
    scoring_fnc = make_scorer(performance_metric)
    grid = GridSearchCV(regressor,params,scoring_fnc,cv=cv_sets)
    grid = grid.fit(X, y)
    return grid.best_estimator_

# 5把训练集带入模型,得出最优模型
reg = fit_model(X_train, y_train)
print("Parameter 'max_depth' is {} for the optimal model.".format(reg.get_params()['max_depth']))     

# 6尝试预测价格
client_data = [[5, 17, 15], # Client 1
               [4, 32, 22], # Client 2
               [8, 3, 12]]  # Client 3
for i, price in enumerate(reg.predict(client_data)):
    print("Predicted selling price for Client {}'s home: ${:,.2f}".format(i+1, price))

# 7计算测试集在该模型上的得分
y_predict = reg.predict(X_test)
r2 = performance_metric(y_test,y_predict)
print("Optimal model has R^2 score {:,.2f} on test data".format(r2))

你可能感兴趣的:(机器学习)