
目录IntroductionImproving the Decision TreeBasic Data ExplorationUsing Pandas to Get Familiar With Your DataInterpreting Data DescriptionYour First Machine Learning ModelSelecting Data for ModelingSelecting The Prediction TargetChoosing FeaturesBuilding Your ModelModel ValidationWhat is Model ValidationThe Problem with In-Sample ScoresCoding ItIntroduction我们先从机器学习模型的工作原理以及它们的应用概述开始。如果你之前有做过统计建模或机器学习这可能感觉很基础。别担心我们很快就会开始构建强大的模型。在本课程中你会在以下情境中边学边建模型你的表哥通过房地产投机赚了上百万美元。因为你对数据科学感兴趣他提出和你成为商业伙伴。他提供资金你提供预测各种房屋价值的模型。你问你的表哥他过去是怎么预测房地产价值的他说那只是直觉。但经过进一步询问你发现他是从以前看过的房子中找出价格模式然后用这些模式来预测他正在考虑的新房子机器学习也是同样的道理。我们先从一个叫做决策树的模型开始。还有更复杂的模型能给出更准确的预测。但决策树容易理解而且是一些数据科学中最好的模型的基础构件。为了简单起见我们先从最简单的决策树开始。它把房子只分为两类。对任何正在考虑的房子预测的价格就是同一类别房子的历史平均价格。我们用数据来决定如何把房子分成两组然后再用数据来确定每组的预测价格。这一步通过数据捕捉规律的过程叫做拟合或者训练模型。用来拟合模型的数据叫做训练数据。模型是如何拟合的细节比如如何拆分数据比较复杂我们暂时先不讲。模型拟合好之后你就可以用它来预测新数据中其他房子的价格。Improving the Decision Tree下面这两棵决策树中哪一棵更有可能是由房地产训练数据拟合出来的左边的决策树决策树1可能更合理因为它反映了一个现实卧室多的房子往往比卧室少的房子卖得更贵。这个模型最大的问题是它没有考虑影响房价的大部分因素比如浴室数量、地块大小、位置等。你可以通过使用更多“分枝”的树来捕捉更多因素。这些叫做“更深”的树。一个同时考虑每栋房子地块总面积的决策树可能看起来像这样你可以通过遍历决策树来预测任何房子的价格每次都选择与该房子特征相对应的路径。房子的预测价格就在树的底部。我们在底部做出预测的点叫做叶节点。分裂点和叶节点的数值会由数据决定所以现在是你了解一下将要处理的数据的时候了。Basic Data ExplorationUsing Pandas to Get Familiar With Your Data任何机器学习项目的第一步是熟悉数据。你将使用 Pandas 库来完成这一步。Pandas 是数据科学家用来探索和处理数据的主要工具。大多数人在代码中将 pandas 缩写为 pd。我们用以下命令来实现这一点import pandas as pdPandas 库中最重要的部分是 DataFrame。DataFrame 保存的数据类型可以让你想到表格。这类似于 Excel 的工作表或者 SQL 数据库中的表格。Pandas 对于处理这种类型的数据提供了强大的方法。举个例子我们来看一下关于澳大利亚墨尔本房价的数据。在动手练习中你将把同样的处理方法应用到一个新的数据集这个数据集包含爱荷华州的房价。示例墨尔本数据的文件路径是 ../input/melbourne-housing-snapshot/melb_data.csv。我们可以用以下命令来加载并探索数据# 把文件路径保存到变量里这样更方便访问 melbourne_file_path ../input/melbourne-housing-snapshot/melb_data.csv # 读取数据并将数据存储在名为 melbourne_data 的 DataFrame 中 melbourne_data pd.read_csv(melbourne_file_path) # 打印墨尔本数据的摘要 melbourne_data.describe()表格这里装不下就不硬放了Interpreting Data Description结果显示你的原始数据集中每列有 8 个数字。第一个数字是计数表示有多少行的值不是缺失的。缺失值产生的原因有很多。例如在调查一居室房子时不会收集第二卧室的大小。稍后我们会回到缺失数据的话题。第二个值是平均值也就是 mean。下面的 std 是标准差用来衡量数值分布的离散程度。要理解 min、25%、50%、75% 和 max 这些值可以想象把每一列按从小到大的顺序排列。第一个最小的数就是 min。如果你走到列表的四分之一处会找到一个数它比 25% 的值大比 75% 的值小。这就是 25% 的值读作“第 25 百分位”。50% 和 75% 百分位的定义类似max 就是最大值。Your First Machine Learning ModelSelecting Data for Modeling你的数据集变量太多让人难以理解甚至无法很好地打印出来。你怎么才能把这份让人不知所措的数据缩减到可以理解的程度呢我们先用直觉挑几个变量。后续课程会教你统计方法自动优先选择变量。要选择变量/列我们需要看到数据集里所有列的列表。这可以通过 DataFrame 的 columns 属性来完成见下面代码的最后一行。import pandas as pd melbourne_file_path ../input/melbourne-housing-snapshot/melb_data.csv melbourne_data pd.read_csv(melbourne_file_path) melbourne_data.columnsIndex([Suburb, Address, Rooms, Type, Price, Method, SellerG, Date, Distance, Postcode, Bedroom2, Bathroom, Car, Landsize, BuildingArea, YearBuilt, CouncilArea, Lattitude, Longtitude, Regionname, Propertycount], dtypeobject)# 墨尔本的数据有一些缺失值有些房子的某些变量没有被记录。 # 我们会在后面的教程中学习如何处理缺失值。 # 你用的爱荷华数据列里没有缺失值。 # 所以我们暂时选择最简单的办法把房子从数据里去掉。 # 暂时别太担心这个不过代码是 # dropna 会删除缺失值把 na 想成“not available”这里axis 0是删除行也就是有缺失值的一条数据 melbourne_data melbourne_data.dropna(axis0)有很多方法可以选择数据的一个子集。Pandas课程会更深入地讲解这些内容但我们现在先重点关注两种方法。点标记法我们用它来选择“预测目标”使用列列表选择我们用它来选择“特征”Selecting The Prediction Target你可以用点标记法来提取一个变量。这个单独的列会被存储在一个 Series 中基本上就像只有一列数据的 DataFrame。我们会用点标记法来选择我们想预测的列这列叫做预测目标。按照惯例预测目标叫做 y。所以我们需要保存墨尔本数据中房价的代码是#也就是取下Price这一列数据作为预测目标 y melbourne_data.PriceChoosing Features输入到我们模型中之后用于做预测的列被称为“特征”。在我们的例子里这些就是用来决定房价的列。有时候你会使用除了目标列以外的所有列作为特征。其他时候使用更少的特征反而效果更好。现在我们先用几个特征来建立模型。稍后你会看到如何迭代并比较用不同特征建立的模型。我们通过在方括号内提供列名列表来选择多个特征。列表中的每一项都应该是字符串带引号。举个例子melbourne_features [Rooms, Bathroom, Landsize, Lattitude, Longtitude]按照惯例这些数据被称为X。X melbourne_data[melbourne_features]我们快速回顾一下将用来预测房价的数据使用 describe 方法和 head 方法查看前几行。X.describe()RoomsBathroomLandsizeLattitudeLongtitudecount6196.0000006196.0000006196.0000006196.000000mean2.9314071.576340471.006940-37.807904std0.9710790.711362897.4498810.075850min1.0000001.0000000.000000-38.16492025%2.0000001.000000152.000000-37.85543850%3.0000001.000000373.000000-37.80225075%4.0000002.000000628.000000-37.758200max8.0000008.00000037000.000000-37.457090X.head()RoomsBathroomLandsizeLattitudeLongtitude121.0156.0-37.8079232.0134.0-37.8093441.0120.0-37.8072632.0245.0-37.8024721.0256.0-37.8060用这些命令直观地检查你的数据是数据科学家工作的重要部分。你经常会在数据集中发现一些值得进一步检查的意外情况。Building Your Model你将使用 scikit-learn 库来创建你的模型。在编码时这个库会写作 sklearn你在示例代码中会看到。Scikit-learn 无疑是建模那些通常存储在 DataFrame 中的数据类型时最受欢迎的库。建立和使用模型的步骤是定义Define模型类型是什么决策树吗或者其他类型的模型模型类型的其他参数也需要指定。拟合Fit从提供的数据中捕捉模式。这是建模的核心。预测Predict字面意思就是进行预测。评估Evaluate确定模型预测的准确性。下面是一个使用 scikit-learn 定义决策树模型并用特征和目标变量进行拟合的示例。from sklearn.tree import DecisionTreeRegressor # 定义模型。指定一个 random_state 的数字以确保每次运行结果相同 melbourne_model DecisionTreeRegressor(random_state1) # 拟合模型 melbourne_model.fit(X, y)DecisionTreeRegressor(random_state1)许多机器学习模型在训练时会允许一定的随机性。指定一个 random_state 的数字可以确保每次运行得到相同的结果。这被认为是一个好习惯。你可以使用任意数字而且模型的质量不会在很大程度上取决于你选择的具体数值。现在我们已经有了一个拟合好的模型可以用它来进行预测。实际上你会希望对市场上即将上市的新房进行预测而不是我们已经有价格数据的房子。但我们会对训练数据的前几行进行预测以看看 predict 函数是如何工作的。print(Making predictions for the following 5 houses:) print(X.head()) print(The predictions are) print(melbourne_model.predict(X.head()))Making predictions for the following 5 houses: Rooms Bathroom Landsize Lattitude Longtitude 1 2 1.0 156.0 -37.8079 144.9934 2 3 2.0 134.0 -37.8093 144.9944 4 4 1.0 120.0 -37.8072 144.9941 6 3 2.0 245.0 -37.8024 144.9993 7 2 1.0 256.0 -37.8060 144.9954 The predictions are [1035000. 1465000. 1600000. 1876000. 1636000.]Model Validation你已经建立了一个模型。但它有多好呢在本课中你将学习如何使用模型验证来衡量模型的质量。衡量模型质量是迭代改进模型的关键。What is Model Validation你几乎会想评估你建立的每一个模型。在大多数虽然不是全部应用中模型质量的相关衡量标准是预测准确性。换句话说模型的预测结果是否接近实际发生的情况。很多人在衡量预测准确性时会犯一个大错误。他们用训练数据进行预测然后将这些预测与训练数据中的目标值进行比较。你马上就会明白这种方法的问题以及如何解决它但我们先来想想自己会怎么做。你首先需要把模型质量总结成一种易于理解的方式。如果你比较 10,000 套房子的预测值和实际房价你很可能会发现好坏参半的预测。看一长串 10,000 个预测值和实际值的列表是没有意义的。我们需要把它总结成一个单一的指标。有很多指标可以用来总结模型质量但我们先从一个叫做平均绝对误差也叫 MAE的指标开始。让我们从最后一个词“误差”开始分解这个指标。每套房子的预测误差是erroractual−predicted所以如果一栋房子要花 150,000 美元而你预测它只会花 100,000 美元那么误差就是 50,000 美元。使用 MAE 指标时我们会取每个误差的绝对值。这样每个误差都会变成正数。然后我们取这些绝对误差的平均值。这就是我们衡量模型质量的方法。用通俗的话说就是平均来看我们的预测大约会偏差 X。要计算 MAE我们首先需要一个模型。这个模型已经在下面的单元中建立你可以点击代码按钮查看。# Data Loading Code Hidden Here import pandas as pd # Load data melbourne_file_path ../input/melbourne-housing-snapshot/melb_data.csv melbourne_data pd.read_csv(melbourne_file_path) # Filter rows with missing price values filtered_melbourne_data melbourne_data.dropna(axis0) # Choose target and features y filtered_melbourne_data.Price melbourne_features [Rooms, Bathroom, Landsize, BuildingArea, YearBuilt, Lattitude, Longtitude] X filtered_melbourne_data[melbourne_features] from sklearn.tree import DecisionTreeRegressor # Define model melbourne_model DecisionTreeRegressor() # Fit model melbourne_model.fit(X, y)DecisionTreeRegressor()一旦我们有了模型计算平均绝对误差的方法如下from sklearn.metrics import mean_absolute_error predicted_home_prices melbourne_model.predict(X) mean_absolute_error(y, predicted_home_prices)434.71594577146544The Problem with In-Sample Scores我们刚刚计算出来的指标可以称为“样本内”得分。我们使用同一组房屋“样本”来建立模型和评估模型。这样不好原因如下。想象一下在整个房地产市场中门的颜色与房价没有关系。然而在你用来建立模型的数据样本中所有绿色门的房子都非常昂贵。模型的任务是找到预测房价的模式所以它会发现这个模式并且总是会对绿色门的房子预测高价。由于这个模式是从训练数据中得出的模型在训练数据中看起来会很准确。但如果这个模式在模型看到新数据时不成立那么模型在实际使用中就会非常不准确由于模型的实际价值来自于对新数据的预测我们会在没用来构建模型的数据上来衡量性能。最直接的方法就是在建模时排除一部分数据然后用这些数据测试模型在没见过的数据上的准确性。这部分数据叫做验证数据。Coding Itscikit-learn 库有一个函数 train_test_split 可以把数据分成两部分。我们会用其中一部分数据作为训练数据来拟合模型然后用另一部分数据作为验证数据来计算 mean_absolute_error。代码如下from sklearn.model_selection import train_test_split # split data into training and validation data, for both features and target # The split is based on a random number generator. Supplying a numeric value to # the random_state argument guarantees we get the same split every time we # run this script. train_X, val_X, train_y, val_y train_test_split(X, y, random_state 0) # Define model melbourne_model DecisionTreeRegressor() # Fit model melbourne_model.fit(train_X, train_y) # get predicted prices on validation data val_predictions melbourne_model.predict(val_X) print(mean_absolute_error(val_y, val_predictions))265806.91478373145你对样本内数据的平均绝对误差大约是 500 美元。样本外数据的误差则超过 250,000 美元。这就是一个几乎完全正确的模型和一个在大多数实际情况下无法使用的模型之间的差别。作为参考验证数据中的平均房屋价值是 110 万美元。所以新数据的误差大约是平均房屋价值的四分之一。有很多方法可以改进这个模型比如尝试找到更好的特征或使用不同类型的模型。