Kaggle官方教程之机器学习入门

Kaggle官方教程之机器学习入门

文章目录

    • Kaggle官方教程之机器学习入门
    • @[toc]
      • 1.模型如何工作?——机器学习入门介绍
        • 1.1 简介
        • 1.2 改进决策树
      • 2.基础数据探索——载入理解数据
        • 2.1 使用Pandas了解你的数据
        • 2.2 练习:探索你的数据
          • 步骤1: 载入数据
          • 步骤2:查看数据
      • 3.第一个机器学习模型——从决策树开始
        • 3.1 选择建立模型所需的数据
        • 3.2 建立模型
        • 3.3 练习
          • 步骤1:指定预测目标
          • 步骤2:创建特征向量X
          • 步骤3:指定并拟合模型
          • 步骤4:做出预测
      • 4.模型验证——如何评价模型的性能?
        • 4.1 什么是模型验证
        • 4.2 “样本内”得分
        • 4.4 练习
          • 步骤1:拆分数据
          • 步骤2:指定并拟合模型
          • 步骤3:使用验证数据进行预测
          • 步骤4:计算验证数据中的平均绝对误差
      • 5.欠拟合和过拟合——微调模型以获得更好的性能
        • 5.1 实验不同的模型
        • 5.2 举例
        • 5.3 结论
        • 5.4 练习
          • 步骤1:比较不同的树大小
          • 步骤2:使用所有数据拟合模型
      • 6.随机森林——使用更复杂的机器学习算法
        • 6.1 简介
        • 6.2 举例
        • 6.3 结论
        • 6.4 练习
          • 使用随机森林模型
      • 7 机器学习比赛——进入机器学习竞赛的世界
        • 7.1 简介
        • 7.2 为比赛创建模型
        • 7.3 作出预测
        • 7.3 测试您的工作
        • 7.4 Keep Going!

1.模型如何工作?——机器学习入门介绍

1.1 简介

首先,我们将简述机器学习模型如何工作以及如何使用模型。 如果您之前已经进行过统计建模或机器学习,您可能会觉得很基础。 不用担心,我们在后面的课程建立更加强大的模型。学习此微课程,您可以在以下场景构建模型:

你的堂兄搞房地产赚了数百万美元。 由于你对数据科感兴趣兴趣,他想和你成为业务合作伙伴。 他将提供资金,并且您将提供预测各种房屋价值的模型。你问你的堂兄,他过去是如何预测房地产价值。 他说这只是直觉。 然而你认为,他从过去的房屋中识别出了价格的模式(pattern),然后他利用这些模式对他正在考虑的新房屋做出预测。

机器学习的工作方式相同。 我们将从称为决策树的模型开始。 有更高级的模型可以提供更准确的预测。 但是决策树很容易理解,它们是数据科学中一些最佳模型的基本构建块。为简单起见,我们将从最简单的决策树开始。
Kaggle官方教程之机器学习入门_第1张图片

它仅将房屋分为两类。 房屋的预测价格为同一类别房屋的历史平均价格。我们使用数据来决定如何将房屋分为两组,然后再次确定每组中的预测价格。 从数据获取模式的这一步骤称为拟合训练模型。 用于拟合模型的数据称为训练数据

有关模型拟合方式的详细信息(例如,如何拆分数据)非常复杂,我们将在以后考虑。 模型在训练之后,可以将其应用于新数据来预测其他房屋的价格。

1.2 改进决策树

通过拟合房地产训练数据,以下两个决策树中的哪个更有可能产生?
Kaggle官方教程之机器学习入门_第2张图片

左侧的决策树可能更有意义,因为它反映了一个现实,即卧室多的房屋比卧室少的房屋的价格更高。 该模型的最大缺点是,它没有涵盖更多影响房价的因素,例如浴室数量,地段大小,位置等。

您可以使用具有更多“分支”的树来获取更多因素。 这些被称为“更深”的树。 还要考虑每栋房屋总面积的决策树可能如下所示:
Kaggle官方教程之机器学习入门_第3张图片

您可以通过跟踪决策树来预测任何房屋的价格,并始终选择与房屋特征相对应的路径。 房屋的预计价格在树的底部。 我们进行预测的底部点称为叶子节点。

叶子上的分支和值将由数据确定,因此是时候检查要使用的数据了。


2.基础数据探索——载入理解数据

2.1 使用Pandas了解你的数据

任何机器学习项目的第一步都是熟悉数据。 你将使用Pandas库。 Pandas是用来探索和处理数据的主要工具。 大多数人在其代码中将pandas缩写为pd。 我们使用命令执行此操作

import pandas as pd

Pandas库中最重要的部分是DataFrame。DataFrame包含可以看作是表的数据类型。 这类似于Excel中的工作表或SQL数据库中的表。Pandas具有强大的方法,可用于处理此类数据。例如,我们将查看澳大利亚墨尔本的房价数据。 在动手练习中,您将对新数据集采用相同的过程,该数据集是爱荷华州的房价。

示例(墨尔本)数据位于文件路径../input/melbourne-housing-snapshot/melb_data.csv

我们使用以下命令加载和浏览数据:

#为了便于获取,将文件路径保存到变量中
melbourne_file_path='../input/melbourne-housing-snapshot/melb_data.csv'
#读取数据,将数据存储到DataFrame中
melbourne_data=pd.read_csv(melbourne_file_path)
#打印melbourne_data的数据情况
melbourne_data.describe()
Rooms Price Distance Postcode Bedroom2 Bathroom Car Landsize BuildingArea YearBuilt Lattitude Longtitude Propertycount
count 13580.000000 1.358000e+04 13580.000000 13580.000000 13580.000000 13580.000000 13518.000000 13580.000000 7130.000000 8205.000000 13580.000000 13580.000000 13580.000000
mean 2.937997 1.075684e+06 10.137776 3105.301915 2.914728 1.534242 1.610075 558.416127 151.967650 1964.684217 -37.809203 144.995216 7454.417378
std 0.955748 6.393107e+05 5.868725 90.676964 0.965921 0.691712 0.962634 3990.669241 541.014538 37.273762 0.079260 0.103916 4378.581772
min 1.000000 8.500000e+04 0.000000 3000.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1196.000000 -38.182550 144.431810 249.000000
25% 2.000000 6.500000e+05 6.100000 3044.000000 2.000000 1.000000 1.000000 177.000000 93.000000 1940.000000 -37.856822 144.929600 4380.000000
50% 3.000000 9.030000e+05 9.200000 3084.000000 3.000000 1.000000 2.000000 440.000000 126.000000 1970.000000 -37.802355 145.000100 6555.000000
75% 3.000000 1.330000e+06 13.000000 3148.000000 3.000000 2.000000 2.000000 651.000000 174.000000 1999.000000 -37.756400 145.058305 10331.000000
max 10.000000 9.000000e+06 48.100000 3977.000000 20.000000 8.000000 10.000000 433014.000000 44515.000000 2018.000000 -37.408530 145.526350 21650.000000

结果显示了8个数字对应原始数据集中的每列。

第一个数字(count)显示有多少行具有非缺失值。数据缺失的原因很多。 例如,一居室的房子不会收集第二间卧室的大小。 我们将会在后面讨论缺失数据的问题。

第二个值是mean,即平均值。下面的std是标准偏差,它测量数值的分散程度。

min,25%,50%,75%和max,请想象把原始数据的每列进行从小到大排序。 第一个(最小)值是min。 如果您遍历列表的四分之一,则会发现一个数字,它比25%的数据大,比75%的数据小,这就是25%的值。 第50个百分位数和第75个百分位数是类似定义的。

2.2 练习:探索你的数据

本练习将锻炼读取数据文件和了解有关数据的统计信息的能力。在以后的练习中,您将使用其他技术来过滤数据,建立机器学习模型并迭代地改进模型。上述教程中使用了墨尔本的数据作为实例。 为了确保您掌握了这些技巧,您需要将它们应用到新的数据集(爱荷华州的房价)中。

步骤1: 载入数据

将爱荷华州数据文件导入到DataFrame中,叫做home_data

import pandas as pd
iowa_file_path='../input/home-data-for-ml-course/train.csv'
home_data=pd.read_csv(iowa_file_path)
步骤2:查看数据

使用您学到的命令来查看数据的摘要统计信息。 然后填写变量以回答以下问题

home_data.describe()

3.第一个机器学习模型——从决策树开始

3.1 选择建立模型所需的数据

数据集包含太多变量,以至于无法很好地打印出来。 如何将大量的数据缩减为您可以理解的数据?作为开始,我们将从使用直觉选择一些变量。 以后的课程将向您展示自动确定变量优先级的统计技术。要选择变量/列,我们需要查看数据集中所有列的列表。 这是通过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.columns
#墨尔本数据缺少一些值(一些房屋未记录一些变量。)
#我们将在以后的教程中学习处理缺失值。
#您的爱荷华州数据在使用的列中没有缺少值。
#因此,我们现在将采用最简单的选项,并从数据中删除房屋。
#现在的代码是:

#dropna删除缺少的值(认为na为“不可用”)
melbourne_data = melbourne_data.dropna(axis = 0)

有很多方法可以选择数据集的子集。 pandas微课程将更深入地介绍这些内容,目前我们将重点放在两种方法。

  • 点表示法,用于选择**“预测目标”**

您可以使用点符号提取变量。 此单列存储在Series中,这在很大程度上类似于仅包含一列数据的DataFrame。我们将使用点表示法选择要预测的列,称为预测目标。 按照惯例,预测目标称为y。 因此,我们需要在墨尔本数据中保存房价的代码是

y = melbourne_data.Price
  • 选择列的列表,我们用它来选择**“特征”**

输入到我们的模型中的列(以后用于预测)称为“features”。 在我们的案例中,这些t特征是用于确定房屋价格的列。 有时,您会将除目标以外的所有列用作features。 有时,更少的features会更好。现在,我们将构建仅具有一些功能的模型。 稍后,您将看到如何迭代和比较使用不同功能构建的模型。我们通过在方括号内提供列名称列表来选择多个功能。 该列表中的每个项目都应该是一个字符串(带引号)。

melbourne_features = ['Rooms', 'Bathroom', 'Landsize', 'Lattitude', 'Longtitude']

为了方便起见,把数据叫做 x x x

X = melbourne_data[melbourne_features]

让我们使用describe方法和head方法快速查看将用于预测房价的数据,该方法显示数据的前几行。

X.describe()
X.head()

使用这些命令直观地检查数据是数据科学家工作的重要组成部分。 您会经常在数据集中发现需要进一步检查的意外情况.

3.2 建立模型

您将使用scikit-learn库创建模型。 如示例代码所示,该库以sklearn编写。 Scikit-learn是最受欢迎的库,它用于对通常存储在DataFrames中的数据类型进行建模。

建立和使用模型的步骤是:

定义:哪种类型的模型? 决策树? 其他类型的模型?

训练:从提供的数据中获取模式。 这是建模的核心。

预测:对新的数据进行预测

评估:确定模型预测的准确性。

如下所示是一个使用scikit-learn的决策树模型,训练模型让并特征和目标变量相匹配。

from sklearn.tree import DecisionTreeRegressor
melbourne_model=DecisionTreeRegressor(random_state=1)
melbourne_model.fit(X,y)

许多机器学习模型在模型训练中允许一些随机性。 为random_state指定一个数字可确保您在每次运行中获得相同的结果。 这是一个好习惯。 您可以使用任何数字,并且模型的质量在很大程度上不会取决于您选择的值。

现在,我们有了一个拟合模型,可以用来进行预测。

实际上,您将要对市场上即将出现的新房子而不是我们已经有价格的房子做出预测。 但是,我们将对训练数据的前几行进行预测,以了解预测函数的工作方式。

print("Making predictions for the following 5 houses:")
print(X.head())
print("预测值:")
print(melbourne_model.predict(X.head()))

3.3 练习

# Code you have previously used to load data
import pandas as pd

# Path of the file to read
iowa_file_path = '../input/home-data-for-ml-course/train.csv'

home_data = pd.read_csv(iowa_file_path)

# Set up code checking
from learntools.core import binder
binder.bind(globals())
from learntools.machine_learning.ex3 import *

print("Setup Complete")
步骤1:指定预测目标

选择与销售价格相对应的目标变量。 将其保存到名为“ y”的新变量中。 您需要打印列的列表以查找所需列的名称。

home_data.columns
y=home_data['SalePrice']
步骤2:创建特征向量X

现在,您将创建一个名为“ X”的数据框,其中包含预测特征。由于只需要原始数据中的某些列,因此首先要创建一个列表,其中包含要在X中使用的列的名称。

您将只使用列表中的以下列(您可以复制并粘贴整个列表以保存一些输入内容,尽管您仍然需要添加引号):

LotArea

YearBuilt

1stFlrSF

2ndFlrSF

FullBath

BedroomAbvGr

TotRmsAbvGrd

创建该特征列表之后,使用它来创建用于拟合模型的DataFrame。

# Create the list of features below
feature_names = ["LotArea","YearBuilt","1stFlrSF","2ndFlrSF","FullBath","BedroomAbvGr","TotRmsAbvGrd"]

# Select data corresponding to features in feature_names
X = home_data[feature_names]

# Check your answer
step_2.check()

查看数据

在建立模型之前,快速浏览一下X以验证它是否合理

# Review data
# print description or statistics from X
print(X.describe())

# print the top few lines
print(X.head())
步骤3:指定并拟合模型

创建一个DecisionTreeRegressor并将其保存为iowa_model。 确保已完成从sklearn的相关导入以运行此命令。

然后使用上面保存的Xy中的数据拟合刚刚创建的模型。

from sklearn.tree import DecisionTreeRegressor
#specify the model. 
#For model reproducibility, set a numeric value for random_state when specifying the model
iowa_model = DecisionTreeRegressor(random_state=1)

# Fit the model
iowa_model.fit(X,y)

# Check your answer
step_3.check()
步骤4:做出预测

使用X数据,使用模型的predict命令进行预测。 将结果保存到名为“预测”的变量中。

predictions = iowa_model.predict(X)
print(predictions)

# Check your answer
step_4.check()

4.模型验证——如何评价模型的性能?

您已经建立了一个模型,如何评价模型的性能高低?

在本课程中,您将学习使用模型验证来度量模型的质量。 测量模型质量是迭代改进模型的关键。

4.1 什么是模型验证

要评估几乎所有构建的模型模型。 在大多数(尽管不是全部)应用中,模型质量的评价标准是预测的准确性。换句话说,模型的预测接近实际发生的情况的可能性。

总结模型质量有很多指标,我们将从一个称为平均绝对误差(Mean Absolute Error,MAE)的指标开始。 让我们从最后一个词“Error”开始分解这个指标。

每个房屋的预测误差为:

error=actual-predicted

因此,如果一所房屋的价格为$ 150,000,而您预测这将花费$ 100,000,则错误为$ 50,000。

使用MAE度量,我们可以获取每个误差的绝对值。 这会将每个错误转换为正数。 然后,我们取这些绝对误差的平均值。 这是我们对模型质量的衡量。要计算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(axis=0)
# 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)

一旦有了模型,就可以计算平均绝对误差:

from sklearn.metrics import mean_absolute_error
predicted_home_prices=melbourne_model.predicted(X)
mean_absolute_error(y,predicted_home_prices)

4.2 “样本内”得分

我们刚刚计算出的度量可以称为“样本内”得分。我们使用单个房屋“样本”来构建模型和评估模型。

为什么“样本内”得分不好呢?想象一下,在大型房地产市场中,门的颜色与房价无关。但是,在用于构建模型的数据样本中,所有带有绿色门的房屋都非常昂贵。该模型的工作是找到可以预测房价的模式,因此它将看到此模式,并且始终可以预测带有绿色门的房屋的高价格。由于此模式是从训练数据中得出的,因此模型在训练数据中将显得准确。但是,如果在模型看到新数据时这种模式不成立,那么在实践中使用该模型将非常不准确。

由于模型的实际价值来自对新数据的预测,因此我们可以评估未用于构建模型的数据的性能。最简单的方法是从模型构建过程中排除一些数据,然后使用这些数据对以前从未见过的数据测试模型的准确性。该数据称为验证数据。

代码实现
scikit-learn库具有函数train_test_split,可将数据分为两部分。 我们将使用其中一些数据作为适合模型的训练数据,并使用其他数据作为验证数据来计算mean_absolute_error。

from sklearn.model_selection import train_test_split
#将数据分为训练集和验证集
#拆分基于随机数生成器。 提供一个数值给random_state参数保证每次我们得到相同的分割
train_X,val_X,train_Y,val_Y=train_test_split(X,y,random_state=0)
#定义模型
melbourne_model = DecisionTreeRegressor()
#训练模型
melbourne_model.fit(train_X,train_Y)
#根据验证数据获得预测房价
val_predictions=melbourne_model.predict(val_X)
print(mean_absolute_error(val_Y,val_predictions))

4.4 练习

步骤1:拆分数据

使用train_test_split函数来分割数据。 给它加上参数random_state = 1,以便check函数知道验证代码时的期望。 回想一下,您的功能已加载到DataFrame X中,而目标已加载到y

# Import the train_test_split function and uncomment
from sklearn.model_selection import train_test_split

# fill in and uncomment
train_X, val_X, train_y, val_y = train_test_split(X,y,random_state=1)

# Check your answer
step_1.check()
步骤2:指定并拟合模型

创建一个“ DecisionTreeRegressor”模型并将其拟合到相关数据。 建立模型时,再次random_state设为1

# Specify the model
iowa_model = DecisionTreeRegressor(random_state=1)

# Fit iowa_model with the training data.
iowa_model.fit(train_X,train_y)

# Check your answer
step_2.check()
步骤3:使用验证数据进行预测
# Predict with all validation observations
val_predictions = iowa_model.predict(val_X)

# Check your answer
step_3.check()

检查来自验证数据的预测和实际值。

# print the top few validation predictions
print(val_predictions[:5])
# print the top few actual prices from validation data
print(val_y[:5])
步骤4:计算验证数据中的平均绝对误差
from sklearn.metrics import mean_absolute_error
val_mae = mean_absolute_error(val_predictions,val_y)

# uncomment following line to see the validation_mae
print(val_mae)

# Check your answer
step_4.check()

那MAE好吗?对于适用于整个应用程序的值没有一个通用规则。但是,您将在下一步中了解如何使用(和改进)此数字。


5.欠拟合和过拟合——微调模型以获得更好的性能

在此步骤的最后,您将了解过拟合和过拟合的概念,并应用这些概念来使模型更加准确。

5.1 实验不同的模型

现在,您已经有了一种可靠的方法来衡量模型的准确性,您可以尝试使用替代模型,看看哪种模型可以提供最佳的预测。有哪些模型可供选择呢?

您可以在scikit-learn的文档中看到,决策树模型具有许多选项(其数量远远超过您在未来一段时间里需要用的选项数量)。其中,最重要的选项是确定树的深度。回想一下这个微课程的第一课,一棵树的深度是对树木进行预测之前进行多少次分裂的度量。

sklearn.tree.DecisionTreeRegressor参数介绍

这是一棵深度为2的树:

Kaggle官方教程之机器学习入门_第4张图片

实际上,一棵树在顶层(所有房屋)和叶子之间有10个拆分并不少见。随着树变深,数据集被切成叶子,房屋更少。如果一棵树只有1个拆分,它将把数据分成2组。如果每组再次拆分,我们将获得4组房屋。再次拆分每个将创建8个组。如果我们通过在每个级别添加更多的拆分来使组的数量增加一倍,那么到第10级时,我们将拥有 2 10 2^{10} 210个房屋组。那是1024片叶子。

当我们在许多叶子之间划分房屋时,每个叶子中的房屋也更少。拥有很少房屋的叶子进行的预测将非常接近那些房屋的实际值,但是它们对新数据的预测可能非常不可靠(因为每个预测仅基于少数房屋)。这是一种称为过度拟合的现象,其中模型几乎完美地匹配了训练数据,但在验证和其他新数据方面却表现不佳。另一方面,如果我们使树非常浅,则不会将房屋分成非常不同的组。

在极端情况下,如果一棵树将房屋仅分为2或4,则每组仍然拥有各种各样的房屋。即使对于训练数据,大多数房屋的预测结果也可能相去甚远(由于相同的原因,其验证也很糟糕)。当模型无法捕获数据中的重要区别和模式时,即使在训练数据中它也表现不佳,这被称为欠拟合。

由于我们关心的是根据验证数据估算出的新数据的准确性,因此我们希望找到欠拟合与过度拟合之间的最佳结合点。在视觉上,我们希望得到(红色)验证曲线的最低点

Kaggle官方教程之机器学习入门_第5张图片

5.2 举例

有几种方法可以控制树的深度,许多方法允许通过树的某些路线的深度比其他路线的深度大。max_leaf_nodes参数提供了一种的方法来控制过拟合与欠拟合。模型的叶子越多,模型越远离欠拟合区域、越靠近过拟合区域。

我们可以使用一个效用函数来帮助比较max_leaf_nodes的不同值的MAE分数:

from sklearn.metrics import mean_absolut_error
from sklearn.tree import DesicionTreeRegreesor

def get_mea(max_leaf_nodes,train_X,val_X,train_y,val_y):
    model=DesicionTreeRegressor(max_leaf_nodes=max_leaf_nodes,random_state=0)
    model.fit(train_X,train_7)
    pred_val=model.predict(val_X)
    mae=mean_absolute_error(val_y,pred_val)
    return mae

使用上述代码将数据加载到train_X,val_X,train_,val_y中。

我们可以使用for循环比较使用max_leaf_nodes的不同值构建的模型的准确性。

for max_leaf_nodes in[5,50,500,5000]:
    my_mae=get_mae(max_leaf_nodes,train_X,val_X,train_y,val_y)
    print("最大叶子节点:%d \t \t MAE:%d" %d(max_leaf_nodes,my_mae))

5.3 结论

以下两种情况都会导致模型预测不准确

过拟合:捕获了将来不会再次出现的虚假模式,从而导致较不准确的预测。
欠拟合:未能捕获相关模式,导致预测不准确。
我们使用模型训练中未使用的验证数据来衡量候选模型的准确性。这使我们可以尝试许多候选模型并选择最优的模型。

5.4 练习

您可以自己编写函数get_mae,也可以使用如下单元格中我们提供的函数。这与您在上一课中了解的功能相同。只需运行下面的单元格。

def get_mae(max_leaf_nodes, train_X, val_X, train_y, val_y):
    model = DecisionTreeRegressor(max_leaf_nodes=max_leaf_nodes, random_state=0)
    model.fit(train_X, train_y)
    preds_val = model.predict(val_X)
    mae = mean_absolute_error(val_y, preds_val)
    return(mae)
步骤1:比较不同的树大小

编写一个循环,尝试从一组可能的值中为max_leaf_nodes尝试以下值[5, 25, 50, 100, 250, 500]。

在max_leaf_nodes的每个值上调用get_mae函数。以某种方式存储输出,该方式允许您选择max_leaf_nodes的值,该值可为您的数据提供最准确的模型

candidate_max_leaf_nodes = [5, 25, 50, 100, 250, 500]
# Write loop to find the ideal tree size from candidate_max_leaf_nodes
mapp=[]
for max_leaf_nodes in candidate_max_leaf_nodes:
    mae=get_mae(max_leaf_nodes,train_X, val_X, train_y, val_y)
    mapp.append([max_leaf_nodes,mae])
def second(elem):
    return elem[1]
mapp.sort(key=second)
# Store the best value of max_leaf_nodes (it will be either 5, 25, 50, 100, 250 or 500)
best_tree_size = mapp[0][0]

# Check your answer
step_1.check()

这个答案是本菜写的,太垃圾了不够美丽,下面放出官方答案:

scores = {leaf_size: get_mae(leaf_size, train_X, val_X, train_y, val_y) for leaf_size in candidate_max_leaf_nodes}
best_tree_size = min(scores, key=scores.get)
步骤2:使用所有数据拟合模型

您知道了最佳的树大小。如果您打算在实践中部署此模型,您应该使用所有的数据,让预测模型更加精确。也就是说,既然已做出所有建模决策,则无需保留验证数据。

# Fill in argument to make optimal size and uncomment
final_model = DecisionTreeRegressor(max_leaf_nodes=best_tree_size,random_state=1)

# fit the final model and uncomment the next two lines
final_model.fit(X, y)

# Check your answer
step_2.check()

您已经调整了该模型并改善了结果。但是我们仍在使用决策树模型,这在现代机器学习标准中并不复杂。在下一步中,您将学习使用随机森林进一步改善模型。

6.随机森林——使用更复杂的机器学习算法

6.1 简介

决策树留下了一个难以抉择的问题, 一棵叶子结点很多的的深树会导致过拟合,因为预测都是来自每个叶子结点上很少的历史数据。 然鹅,只有很少叶子节点的浅树性能也会很差,因为它无法捕获原始数据中许多的差异。

即使是当今最复杂的建模技术,也面临着欠拟合和过拟合之间的这种张力。 但是,许多模型都有巧妙的想法,可以带来更好的性能。 我们将以随机森林为例。

随机森林采用了结合很多决策树的方法,并且通过平均每个组成树的预测来进行预测。 与单个决策树相比,它通常具有更好的预测准确性,并且使用默认参数就可以获得较好的效果。 有许多性能更好的的模型,但其中许多模型对于获取正确的参数很敏感。

6.2 举例

您已经看到了几次加载数据的代码。 在数据加载结束时,我们具有以下变量:

train_X val_X train_y val_y

我们构建随机森林模型(与scikit-learn中构建决策树的方式类似),使用 R a n d o m F o r e s t R e g r e s s o r RandomForestRegressor RandomForestRegressor类而不是 D e c i s i o n T r e e R e g r e s s o r DecisionTreeRegressor DecisionTreeRegressor

from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolut_error

forest_model=RandomForestRegressor(random_state=1)
forest_model.fit(train_X,train_y)
melb_preds=forest_model.predict(val_X)
print(mean_absolut_error(val_y,melb_preds))

6.3 结论

随机森林模型可能还有进一步改进的余地,但这是对最佳决策树error 250,000的重大改进。 有一些参数可以让您改变随机森林的性能,就像我们改变了单个决策树的最大深度一样。 但是,Random Forest模型的最佳功能之一是,即使不进行此调整,它们通常也可以正常工作。

您很快就会学到XGBoost模型,当使用正确的参数进行很好的调整时,它可以提供更好的性能(但是需要一些技巧才能获得正确的模型参数)。

6.4 练习

数据科学并不总是那么容易。 但是用随机森林替换决策树将是一个轻松的胜利。

使用随机森林模型
from sklearn.ensemble import RandomForestRegressor

# Define the model. Set random_state to 1
rf_model = RandomForestRegressor(random_state=1)

# fit your model
rf_model.fit(train_X,train_y)
rf_val_predictions=rf_model.predict(val_X)

# Calculate the mean absolute error of your Random Forest model on the validation data
rf_val_mae = mean_absolute_error(val_y,rf_val_predictions)

print("Validation MAE for Random Forest Model: {}".format(rf_val_mae))

# Check your answer
step_1.check()

7 机器学习比赛——进入机器学习竞赛的世界

7.1 简介

机器学习竞赛是提高您的数据科学技能和衡量您的进步的好方法。

在本练习中,您将创建和提交Kaggle比赛的预测。 然后,您可以改进模型(例如,通过添加特征)来改进模型,并了解如何与其他人一起学习此微型课程。

本笔记本中的步骤为:

1.使用所有数据(**X y **)构建随机森林模型
2.读入“test”数据,其中不包含目标值。 使用您的随机森林模型预测测试数据中的原始值。
3.将这些预测提交给比赛并查看您的分数。
4.(可选)返回以查看是否可以通过添加功能或更改模型来改进模型。 然后,您可以重新提交以查看如何将其堆积在比赛排行榜上。

7.2 为比赛创建模型

建立随机森林模型,并在所有**X y **上进行训练。

#为了提高准确性,请创建一个新的随机森林模型,您将在所有训练数据上进行训练
rf_model_on_full_data = RandomForestRegressor()

#适用所有训练集的数据来训练rf_model_on_full_data
rf_model_on_full_data.fit(X,y)

7.3 作出预测

读取“test”数据文件。 并应用模型进行预测

# 用于预测的文件路径
test_data_path = '../input/test.csv'

# 使用pandas读取测试数据文件
test_data = pd.read_csv(test_data_path)

# 创建来自test_data的test_X,但仅包含用于预测的列。
# 用于预测的列被存储在features的列表变量中
test_X = test_data[features]

# 做出我们将提交的预测。 
test_preds = rf_model_on_full_data.predict(test_X)

# 下面的代码行显示了如何将预测保存为比赛计分格式

output = pd.DataFrame({'Id': test_data.Id,
                       'SalePrice': test_preds})
output.to_csv('submission.csv', index=False)

7.3 测试您的工作

要测试您的结果,您需要参加比赛(如果尚未参加)。因此,通过单击[此链接](https://www.kaggle.com/c/home-data-for-ml-course),打开一个新窗口。然后点击“参加比赛”按钮。

接下来,请按照以下说明进行操作:
1.单击此窗口右上角的蓝色**COMMIT **按钮开始。这将生成一个弹出窗口。
2.代码运行完毕后,单击弹出窗口右上方的蓝色“打开版本”按钮。这使您进入同一页面的查看模式。您将需要向下滚动以返回这些说明。
3.单击屏幕左侧的“输出”选项卡。然后,点击“提交竞赛”按钮,将您的结果提交到排行榜。

您现在已成功提交比赛!

4.如果要继续努力以提高性能,请选择屏幕右上方的蓝色“编辑”按钮。然后,您可以更改模型并重复该过程。有很多空间可以改善您的模型,并且您将在工作中攀登排行榜。

7.4 Keep Going!

有很多方法可以改善您的模型,改善模型的最佳方法是添加特征。查看features列表,并考虑可能会影响房价的因素。由于缺少值或非数字数据类型等问题,某些功能会导致错误。

**[中级机器学习](https://www.kaggle.com/learn/intermediate-machine-learning)微型课程将教您如何处理这些类型的功能。您还将学习使用 xgboost **,该技术比随机森林具有更高的准确性。

#其他微课程
**[Pandas](https://kaggle.com/Learn/Pandas)**微课程将为您提供数据处理技能,使您可以从概念概念快速实施到数据科学项目中。

您还可以参加**[Deep Learning](https://kaggle.com/Learn/Deep-Learning)**微课程,在那里您将在计算机视觉任务上构建性能优于人类水平的模型。

你可能感兴趣的:(Kaggle微课程)