sklearn快速入门教程 ——4.模型评估

sklearn快速入门教程


目录

sklearn快速入门教程

什么是模型验证

“样本”分数的问题

代码

轮到你了

扼要重述

练习

第一步:拆分你的数据

第二步:指定并拟合模型

第三步:用验证数据进行预测

第四步:计算验证数据中的平均绝对误差

继续

练习答案


测量模型的性能,以便测试和比较备选方案。

你现在已建立一个模型。便不知道它有多好?

在本课中,您将学习使用模型验证来衡量模型的质量。衡量模型质量是提升改进模型的关键。

什么是模型验证

你会想要评估几乎所有你建立的模型。在大多数(尽管不是所有)应用中,模型质量的相关度量是预测精度。换句话说,模型的预测是否接近实际情况。

许多人在衡量预测准确性时犯了一个巨大的错误。他们用训练数据进行预测,并将这些预测与训练数据中的目标值进行比较。你马上就会看到这种方法的问题,以及如何解决它,但让我们先想想我们该如何做。

您首先需要以一种可以理解的方式总结模型的质量。如果你比较10000套房子的预测值和实际值,你可能会发现好的预测值和坏的预测值混合在一起。浏览一个包含10000个预测值和实际值的列表是毫无意义的。我们需要将其总结为一个指标。

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

每个房屋的预测误差为:
误差=实际值−预测

那么,如果一栋房子的价格是15万美元并预测出10万,这个错误应是5万美元。

使用MAE度量,我们取每个误差的绝对值。这会将每个错误转换为正数。然后取这些绝对误差的平均值。这是我们对模型质量的衡量。用通俗易懂的英语,它可以说是
平均而言,我们的预测相对于X的偏差。

为了计算MAE,我们首先需要一个模型。这是建立在一个隐藏的单元格下面,你可以通过点击代码按钮查看。

# 加载库
import pandas as pd

# 加载数据
melbourne_file_path = '../input/melbourne-housing-snapshot/melb_data.csv'
melbourne_data = pd.read_csv(melbourne_file_path) 
# 过滤每行的缺失值 
filtered_melbourne_data = melbourne_data.dropna(axis=0)
# 选出目标和特征
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
# 定义模型
melbourne_model = DecisionTreeRegressor()
# 拟合模型
melbourne_model.fit(X, y)

一旦我们有了一个模型,下面是我们如何计算平均绝对误差:

from sklearn.metrics import mean_absolute_error

predicted_home_prices = melbourne_model.predict(X)
mean_absolute_error(y, predicted_home_prices)
# 434.71594577146544

“样本”分数的问题

我们刚刚计算的指标可以称为“样本”分数。我们使用了一个房屋“样本”来构建模型和评估模型。这就是为什么这很糟糕。

想象一下,在大型房地产市场中,门的颜色与房价无关。
然而,在你用来构建模型的数据样本中,所有带绿色门的房子都非常昂贵。该模型的工作是找到预测房价的模式,因此它将看到这种模式,并且它将始终预测有绿色门的房屋的高价格。
由于该模式源自训练数据,因此该模型在训练数据中会显得准确。

但是,如果在模型看到新数据时这种模式不成立,那么在实际应用中,该模型将非常不准确。

由于模型的实用价值来自于对新数据的预测,因此我们对未用于构建模型的数据进行性能测量。最直接的方法是从模型构建过程中排除一些数据,然后使用这些数据来测试模型在以前从未见过的数据上的准确性。这些数据称为验证数据。

代码

scikit-learn 库有一个函数 train_test_split,用于将数据分成两部分。我们将使用其中一些数据作为训练数据来拟合模型,我们将使用其他数据作为验证数据来计算平均绝对误差。

以下是代码:

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))

258930.03550677857

样本数据的平均绝对误差约为500美元。样品中的价格超过25万美元。

这就是几乎完全正确的模型和在大多数实际用途中无法使用的模型之间的区别。作为参考,验证数据中的平均房屋价值为110万美元。因此,新数据中的误差约为平均房屋价值的四分之一。

有很多方法可以改进此模型,例如尝试寻找更好的特征或不同的模型类型。

轮到你了

以下为练习部分


扼要重述

你已经建立了一个模型。在本练习中,你将测试你的模型有多好。
运行下面的单元格,在上一个练习结束的地方设置编码环境。

# Code you have previously used to load data
import pandas as pd
from sklearn.tree import DecisionTreeRegressor

# 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)
y = home_data.SalePrice
feature_columns = ['LotArea', 'YearBuilt', '1stFlrSF', '2ndFlrSF', 'FullBath', 'BedroomAbvGr', 'TotRmsAbvGrd']
X = home_data[feature_columns]

# Specify Model
iowa_model = DecisionTreeRegressor()
# Fit Model
iowa_model.fit(X, y)

print("First in-sample predictions:", iowa_model.predict(X.head()))
print("Actual target values for those homes:", y.head().tolist())

# Set up code checking
from learntools.core import binder
binder.bind(globals())
from learntools.machine_learning.ex4 import *
print("Setup Complete")
First in-sample predictions: [208500. 181500. 223500. 140000. 250000.]
Actual target values for those homes: [208500, 181500, 223500, 140000, 250000]
Setup Complete

练习
第一步:拆分你的数据

使用train_test_split函数拆分数据。
设置一个参数 random_state=1,这样检查 函数在验证代码时会发生什么。

回想一下,您的特征加载在DataFrame 的 X中,而您的目标加载在DataFrame 的 y中。

# 导入 train_test_split 函数功能包
# from _ import _

# fill in and uncomment
# train_X, val_X, train_y, val_y = ____

# 检查答案
step_1.check()

第二步:指定并拟合模型

创建 DecisionTreeRegressor 模型,并将其与相关数据相匹配。创建模型时,再次将random_state设置为1。

#您在上次练习中导入了 DecisionTreeRegressor
#该代码已复制到上面的设置代码中。所以,没必要再次导入

# 指定模型
iowa_model = ____

# 用训练数据进行拟合 模型( iowa_model )
____

# Check your answer
step_2.check()
第三步:用验证数据进行预测
# 使用验证数据进行预测
val_predictions = ____

# Check your answer
step_3.check()

根据验证数据检查您的预测和实际值。

# 打印前面一部分的预测结果
print(____)
# 打印前面一部分的实际价格
print(____)

你注意到了什么与你在样本预测中看到的不同(这些预测打印在本页顶部的代码单元之后)。
你还记得为什么验证预测与样本(或训练)预测不同吗?这是上一课的一个重要观点。

你还记得为什么验证预测与样本(或训练)预测不同吗?这是上一课的一个重要观点。

第四步:计算验证数据中的平均绝对误差
from sklearn.metrics import mean_absolute_error
val_mae = ____

# 打印平均绝对误差
#print(val_mae)

# Check your answer
step_4.check()

MAE 好吗?对于适用于不同项目来讲,没有通用规则。但在下一步中,您将看到如何使用(并改进)这个数字。

继续

准备好了吗? 进入 欠拟合和过拟合 部分


练习答案
# step 1:
from sklearn.model_selection import train_test_split
train_X, val_X, train_y, val_y = train_test_split(X, y, random_state=1)


# step 2: 
iowa_model = DecisionTreeRegressor(random_state=1)
iowa_model.fit(train_X, train_y)

# setp 3 :
val_predictions = iowa_model.predict(val_X)
print(val_predictions.head())
print(val_y)

# step 4 :
val_mae = mean_absolute_error(val_y, val_predictions)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值