UdaCity-机器学习工程师-项目1:预测波士顿房价

机器学习工程师纳米学位

模型评价与验证

项目 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 numpy as np
import pandas as pd
import visuals as vs # Supplementary code

# 检查你的Python版本
from sys import version_info
if version_info.major != 2 and version_info.minor != 7:
    raise Exception('请使用Python 2.7来完成此项目')
    
# 让结果在notebook中显示
%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)

Boston housing dataset has 489 data points with 4 variables each.


第二步. 分析数据

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

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

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

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

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

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

在下面的代码中,你要做的是:

  • 计算prices中的'MEDV'的最小值、最大值、均值、中值和标准差;
  • 将运算结果储存在相应的变量中。
#TODO 1

#目标:计算价值的最小值
minimum_price = np.min(prices)


#目标:计算价值的最大值
maximum_price = np.max(prices)

#目标:计算价值的平均值
mean_price = np.mean(prices)

#目标:计算价值的中值
median_price = np.median(prices)

#目标:计算价值的标准差
std_price = np.std(prices)


#目标:输出计算的结果
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的房屋相比,价值更高还是更低呢?

问题 1 - 回答:

  • RM 增大,MEDV 增大。原因:房间越多面积一般越大,价值一般越高。
  • LASTAT 增大,MEDV 减小原因:区域低收入群体占比越高,区域消费能力就越偏低。为适应此区域消费水平,在此区域内的房屋价值也不会太高。
  • PRTATOP 增大,MEDV 减小原因: PRTATOP高表示此区域孩子偏多,家庭用于购置房屋的资金可能越少。购买力减弱可能会导致MEDV降低。 但PRTATOP与MEDV的关系好像没有非常直接的关系,此特征对MEDV的影响存疑。编程练习 2: 数据分割与重排接下来,你需要把波士顿房屋数据集分成训练和测试两个子集。通常在这个过程中,数据也会被重排列,以消除数据集中由于顺序而产生的偏差。 在下面的代码中,你需要

使用 sklearn.model_selection 中的 train_test_split, 将featuresprices的数据都分成用于训练的数据子集和用于测试的数据子集。

  • 分割比例为:80%的数据用于训练,20%用于测试;
  • 选定一个数值以设定 train_test_split 中的 random_state ,这会确保结果的一致性;
# TODO 2

# 提示: 导入train_test_split
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 = 42 )

问题 2 - 训练及测试

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

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

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

问题 2 - 回答:

  • 1)测试数据用于检测模型效果,按一定比例分开为了尽可能充分的利用数据集中的数据用于训练和测试,以求数据集效果最大化
  • 2)模型使用测试集数据进行训练,容易造成过拟合。在有真实数据导入模型进行预测时可能不能得到很到的结果,因为模型泛化能力较差
  • 3)如果没有测试数据则无法评估模型的效果

第三步. 模型衡量标准

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

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

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

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

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

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

  • (可选) 不使用任何外部库,参考决定系数的定义进行计算,这也可以帮助你更好的理解决定系数在什么情况下等于0或等于1。
# TODO 3

# 提示: 导入r2_score
from sklearn.metrics import r2_score

def performance_metric(y_true, y_predict):
    """计算并返回预测值相比于预测值的分数"""
    
    score = r2_score( y_true, y_predict )

    return score
# TODO 3 可选

# 不允许导入任何计算决定系数的库

def performance_metric2(y_true, y_predict):
    """计算并返回预测值相比于预测值的分数"""
    
    y_bar = float( sum( y_true ) ) / len( y_true )
    
    ss_res = 0.0
    ss_tot = 0.0
    
    for x in range( len( y_true ) ):
        ss_res += np.square( y_true[x] - y_predict[x] )
        ss_tot += np.square( y_true[x] - y_bar )
    
    score = 1 - ( ss_res / ss_tot )

    return score

问题 3 - 拟合程度

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

真实数值

预测数值

3.0

2.5

-0.5

0.0

2.0

2.1

7.0

7.8

4.2

5.3

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

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

# 计算这个模型的预测结果的决定系数
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.

问题 3 - 回答:

成功,因为r2数值为0.923 非常接近最佳值1


第四步. 分析模型的表现

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

学习曲线

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

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

问题 4 - 学习曲线

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

提示:学习曲线的评分是否最终会收敛到特定的值?

问题 4 - 回答:

max_depth = 1

训练集和测试集的得分均较低。模型处于欠拟合状态。

随数据增加,训练集和验证集的得分都趋于稳定,已经达到稳定值。

如果再增加训练数据不能提升模型表现

如果要提升模型表现需增加一些特征来提高模型性能

max_depth = 3

训练集和测试集的得分均较高。二者间隔较小。模型拥有不错的性能

随数据增加,训练集和验证集的得分都趋于稳定,已经达到稳定值。

如果再增加训练数据不能提升模型表现

max_depth = 6,10

训练集和测试集得分间隔较大,模型处于过拟合状态。

随数据增加,训练集和验证集的得分都趋于稳定,已经达到稳定值。

如果再增加训练数据不能提升模型表现

吐过要提升模型表现,需减少一些特征项

复杂度曲线

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

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

# 根据不同的最大深度参数,生成复杂度曲线
vs.ModelComplexity(X_train, y_train)
image.png

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

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

提示: 你如何得知模型是否出现了偏差很大或者方差很大的问题?

问题 5 - 回答:

最大深度为1时,bias较大。因为模型得分较低 最大深度为10时,variance较大。因为训练集与测试集曲线间距较大问题 6- 最优模型的猜测

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

问题 6 - 回答:

最大深度为3时模型性能较好。训练集和测试集得分较高,且间距小

第五步. 选择最优参数

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

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

问题 7 - 回答:

网格搜索对指定参数的值穷举搜索 通过将模型进行交叉验证可以获得模型指定参数的最优解

问题 8 - 交叉验证

  • 什么是K折交叉验证法(k-fold cross-validation)?
  • GridSearchCV是如何结合交叉验证来完成对最佳参数组合的选择的?
  • GridSearchCV中的'cv_results_'属性能告诉我们什么?
  • 网格搜索时如果不使用交叉验证会有什么问题?交叉验证又是如何解决这个问题的?

提示: 在下面 fitmodel函数最后加入 `print pd.DataFrame(grid.cv_results)` 可以帮你查看更多信息。

问题 8 - 回答:

将训练集分为k组,进行K次实验。每次一次实验都将其中1组作为验证集其他作为训练集。最终结果为K次实验的平均结果。

  • 针对指定参数给出的可选数据范围进行穷举,每一次实验都进行一次交叉验证。得到的所有参数可选值的模型评分后,选择模型评分最高(或损失最小)的那一个,就是最优参数。
  • 通过 cv_resilts_ 所有参数的所有可选值的模型得分情况
  • 如果不使用交叉验证模型训练结果依赖单次划分的训练集和验证集,得到的模型很有可能性能不准确。进行交叉验证后会进行多次训练集和验证集划分和训练,最大限制度减少训练集划分对模型准确性的影响,使得训练结果更准确

*参考:https://www.zhihu.com/collection/187463584

编程练习 4:训练最优模型

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

在下方 fit_model 函数中,你需要做的是:

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

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

# TODO 4

#提示: 导入 'KFold' 'DecisionTreeRegressor' 'make_scorer' 'GridSearchCV' 
from sklearn.model_selection import KFold
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import make_scorer
from sklearn.model_selection import GridSearchCV

def fit_model(X, y):
    """ 基于输入数据 [X,y],利于网格搜索找到最优的决策树模型"""
    
    cross_validator = KFold()
    
    regressor = DecisionTreeRegressor(random_state = 42)

    params = {
        'max_depth': [ x for x in range(1,11) ]
    }

    scoring_fnc = make_scorer(performance_metric)

    grid = GridSearchCV( regressor, params, scoring_fnc, cv = cross_validator )

    # 基于输入数据 [X,y],进行网格搜索
    grid = grid.fit(X, y)

    # 返回网格搜索后的最优模型
    return grid.best_estimator_

编程练习 4:训练最优模型 (可选)

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

在下方 fit_model 函数中,你需要做的是:

  • 遍历参数‘max_depth’的可选值 1~10,构造对应模型
  • 计算当前模型的交叉验证分数
  • 返回最优交叉验证分数对应的模型
# TODO 4 可选

'''
不允许使用 DecisionTreeRegressor 以外的任何 sklearn 库

提示: 你可能需要实现下面的 cross_val_score 函数

def cross_val_score(estimator, X, y, scoring = performance_metric, cv=3):
    """ 返回每组交叉验证的模型分数的数组 """
    scores = [0,0,0]
    return scores
'''
from sklearn.tree import DecisionTreeRegressor
import copy

def cross_val_score(estimator, X, y, scoring = performance_metric, cv=3):
    
    """ 返回每组交叉验证的模型分数的数组 """
    def chunks(arr, m):
        import math
        n = int(math.ceil(len(arr) / float(m)))
        return [arr[i:i + n] for i in range(0, len(arr), n)]

    X_list = chunks(X, cv)
    y_list = chunks(y, cv)
    
    scoreList = []
    estimatorList = []

    for max_depth in range(1,11):

        #设置模型参数
        estimatorReal = copy.deepcopy(estimator).set_params(max_depth = max_depth)

        #初始化此深度下的总分
        score = 0.0
        
        for train_pos in range(cv):
            #训练集
            X_test_list = []
            y_test_list = []
            
            X_train = X_list[train_pos]
            y_train = y_list[train_pos]        
            
            for test_pos in range(cv):
                if test_pos != train_pos:
                    X_test_list.append(X_list[test_pos])
                    y_test_list.append(y_list[test_pos])
            
            #测试集
            X_test = pd.concat(X_test_list)
            y_test = pd.concat(y_test_list)
            
            
            estimatorReal.fit(X_train, y_train)
            
            pred = estimatorReal.predict(X_test)
            
            score += scoring(y_test, pred)
        
        #求平均分
        score = score / cv
        
        scoreList.append(score)
        estimatorList.append(estimatorReal)
        
    bestEstimator = None
    bestScore = 0.0
    for x in  range(len(estimatorList)):
        if (bestScore < scoreList[x]):
            bestScore = scoreList[x]
            bestEstimator = estimatorList[x]
        
    return bestEstimator

def fit_mode2(X, y):
    """ 基于输入数据 [X,y],利于网格搜索找到最优的决策树模型"""
    
    #最优交叉验证分数对应的最优模型
    best_estimator = cross_val_score( DecisionTreeRegressor( random_state = 42 ), X, y)
    
    return best_estimator

optimal_reg = fit_mode2(X_train, y_train)
print "Parameter 'max_depth' is {} for the optimal model.".format(optimal_reg.get_params()['max_depth'])

Parameter 'max_depth' is 3 for the optimal model.

问题 9 - 最优模型

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

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

# 基于训练数据,获得最优模型
optimal_reg = fit_model(X_train, y_train)

# 输出最优模型的 'max_depth' 参数
print "Parameter 'max_depth' is {} for the optimal model.".format(optimal_reg.get_params()['max_depth'])

Parameter 'max_depth' is 5 for the optimal model.

问题 9 - 回答:

有时相同,有时不同。不知道问题出在哪里。请老师指正

得出的最优解在3、4、5之间变化,每次运行的结果都不一致

第六步. 做出预测

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

问题 10 - 预测销售价格

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

特征

客戶 1

客戶 2

客戶 3

房屋内房间总数

5 间房间

4 间房间

8 间房间

社区贫困指数(%被认为是贫困阶层)

17%

32%

3%

邻近学校的学生-老师比例

15:1

22:1

12:1

你会建议每位客户的房屋销售的价格为多少?从房屋特征的数值判断,这样的价格合理吗?为什么?

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

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

# 生成三个客户的数据
client_data = [[5, 17, 15], # 客户 1
               [4, 32, 22], # 客户 2
               [8, 3, 12]]  # 客户 3

# 进行预测
predicted_price = optimal_reg.predict(client_data)
for i, price in enumerate(predicted_price):
    print "Predicted selling price for Client {}'s home: ${:,.2f}".format(i+1, price)

Predicted selling price for Client 1's home: $387,927.27

Predicted selling price for Client 2's home: $230,316.28

Predicted selling price for Client 3's home: $878,220.00

print "max price", np.max(predicted_price)
print "min price", np.min(predicted_price)
print "mean of prices", np.mean(predicted_price)
print "mid of prices", np.median(predicted_price)
print "std of prices", np.std(predicted_price)

max price 878220.0

min price 230316.27906976745

mean of prices 498821.18393234676

mid of prices 387927.2727272727

std of prices 275883.91587233363

问题 10 - 回答:

  • Predicted selling price for Client 1's home: \$387,927.27
  • Predicted selling price for Client 2's home: \$230,316.28
  • Predicted selling price for Client 3's home: \$878,220.00
  • 合理第三个客户房间多,贫困系数低,房价高于平均值是合理的。第三个客户房间少且所在地区贫困系数高说明消费能力差,所以放假最低是合理的。第二个客户介于两者之间房价合理编程练习 5你刚刚预测了三个客户的房子的售价。在这个练习中,你将用你的最优模型在整个测试数据上进行预测, 并计算相对于目标变量的决定系数 R<sup>2</sup>的值**。
#TODO 5

# 提示:你可能需要用到 X_test, y_test, optimal_reg, performance_metric
# 提示:你可能需要参考问题10的代码进行预测
# 提示:你可能需要参考问题3的代码来计算R^2的值

from sklearn.metrics import r2_score
y_pred = optimal_reg.predict(X_test)
r2 = r2_score(y_test, y_pred)

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

Optimal model has R^2 score 0.82 on test data

问题11 - 分析决定系数

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

问题11 - 回答

R2 = 0.82 较高,通过此模型预测的结果比较可靠

模型健壮性

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

问题 12 - 模型健壮性

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

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

# 请先注释掉 fit_model 函数里的所有 print 语句
vs.PredictTrials(features, prices, fit_model, client_data)

Trial 1: $409,500.00

Trial 2: $411,417.39

Trial 3: $415,800.00

Trial 4: $428,316.00

Trial 5: $413,334.78

Trial 6: $411,931.58

Trial 7: $399,663.16

Trial 8: $407,232.00

Trial 9: $402,531.82

Trial 10: $413,700.00

Range in prices: $28,652.84

问题 12 - 回答:

健壮性较好,同一特定客户预测出来的房价范围相差37000,占最高值8%左右

问题 13 - 实用性探讨

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

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

  • 1978年所采集的数据,在已考虑通货膨胀的前提下,在今天是否仍然适用?
  • 数据中呈现的特征是否足够描述一个房屋?
  • 在波士顿这样的大都市采集的数据,能否应用在其它乡镇地区?
  • 你觉得仅仅凭房屋所在社区的环境来判断房屋价值合理吗?问题 13 - 回答:
  • 适用
  • 不足,衡量一个房屋还有户型、楼层、开发商等其他维度
  • 不能,不是同一统计源不能用一个统计来源的数据衡量另一个统计来源
  • 不合理,原因同本题第二问可选问题 - 预测北京房价

(本题结果不影响项目是否通过)通过上面的实践,相信你对机器学习的一些常用概念有了很好的领悟和掌握。但利用70年代的波士顿房价数据进行建模的确对我们来说意义不是太大。现在你可以把你上面所学应用到北京房价数据集中 bj_housing.csv

免责声明:考虑到北京房价受到宏观经济、政策调整等众多因素的直接影响,预测结果仅供参考。

这个数据集的特征有:

  • Area:房屋面积,平方米
  • Room:房间数,间
  • Living: 厅数,间
  • School: 是否为学区房,0或1
  • Year: 房屋建造时间,年
  • Floor: 房屋所处楼层,层

目标变量:

  • Value: 房屋人民币售价,万

你可以参考上面学到的内容,拿这个数据集来练习数据分割与重排、定义衡量标准、训练模型、评价模型表现、使用网格搜索配合交叉验证对参数进行调优并选出最佳参数,比较两者的差别,最终得出最佳模型对验证集的预测分数。

# TODO 6

# 你的代码
# Area:房屋面积,平方米
# Room:房间数,间
# Living: 厅数,间
# School: 是否为学区房,0或1
# Year: 房屋建造时间,年
# Floor: 房屋所处楼层,层

import numpy as np
import pandas as pd
import visuals as vs # Supplementary code
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV, KFold
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import r2_score, make_scorer
from sklearn.svm import SVC

%matplotlib inline
data = pd.read_csv('bj_housing.csv')

prices = data['Value']
features = data.drop('Value', axis = 1)

X_train, X_test, y_train, y_test = train_test_split( features, prices, test_size = 0.2, random_state = 42 )

cv = KFold()

dt_parameters = {
    'max_depth':[x for x in range(1,11)]
}
clf = GridSearchCV( estimator = DecisionTreeRegressor(),scoring = make_scorer(r2_score), param_grid = dt_parameters, cv = cv )

clf.fit( X_train, y_train )

pred = clf.best_estimator_.predict(X_test)
print r2_score(y_test,pred)

问题14 - 北京房价预测

你成功的用新的数据集构建了模型了吗?他能对测试数据进行验证吗?它的表现是否符合你的预期?交叉验证是否有助于提升你模型的表现?

提示:如果你是从零开始构建机器学习的代码会让你一时觉得无从下手。这时不要着急,你要做的只是查看之前写的代码,把每一行都看明白,然后逐步构建你的模型。当中遇到什么问题也可以在我们论坛寻找答案。也许你会发现你所构建的模型的表现并没有达到你的预期,这说明机器学习并非是一项简单的任务,构建一个表现良好的模型需要长时间的研究和测试。这也是我们接下来的课程中会逐渐学到的。

问题14 - 回答

成功构建了模型,但r2得分仅有0.6,模型预测结果不确定性太高

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器之心

资源 | Chinese Word Vectors:目前最全的中文预训练词向量集合

4053
来自专栏人工智能

词向量fasttext,CNN is All,强化学习,自回归生成模型,可视化神经网络损失函数

【导读】专知内容组整理出最近arXiv放出的五篇论文,包括《Tomas Mikolov新作词向量表示,CNN Is All You Need,强化学习库, 自回...

2685
来自专栏CDA数据分析师

机器学习算法一览(附python和R代码)

“谷歌的无人车和机器人得到了很多关注,但我们真正的未来却在于能够使电脑变得更聪明,更人性化的技术,机器学习。 ” —— 埃里克 施密特(谷歌首席执行官) 当计算...

3707
来自专栏机器学习算法工程师

深入浅出——基于密度的聚类方法

作者 祝烨 编辑 (没脸) “The observation of and the search forsimilarities an...

3458
来自专栏专知

【2017年末AI最新论文精选】词向量fasttext,CNN is All,强化学习,自回归生成模型, 可视化神经网络损失函数

【导读】专知内容组整理出最近arXiv放出的五篇论文,包括《Tomas Mikolov新作词向量表示,CNN Is All You Need,强化学习库, 自回...

3606
来自专栏大数据文摘

机器学习算法一览(附python和R代码)

23714
来自专栏AI科技评论

开发 | 小白学CNN以及Keras的速成

AI 科技评论按:本文作者Sherlock,原文载于其知乎专栏深度炼丹,AI 科技评论已获得其授权发布。 一、为何要用Keras 如今在深度学习大火的时候,第三...

3486
来自专栏用户2442861的专栏

深度卷积网络CNN与图像语义分割

转载请注明出处: http://xiahouzuoxin.github.io/notes/

1391
来自专栏AI研习社

小白学CNN以及Keras的速成

为何要用Keras 如今在深度学习大火的时候,第三方工具也层出不穷,比较出名的有Tensorflow,Caffe,Theano,MXNet,在如此多的第三方...

3004
来自专栏杨熹的专栏

机器学习-多元线性回归

A. 用途: 可以用来预测,由多种因素影响的结果。 B. 建立公式: ? C. 求解方法: 方法1. Gradient Descent: ? ...

3515

扫码关注云+社区