动手学kaggle-Intro to Machine Learning-1

目录

Introduction

[Improving the Decision Tree](#Improving the Decision Tree)

[Basic Data Exploration](#Basic Data Exploration)

[Using Pandas to Get Familiar With Your Data](#Using Pandas to Get Familiar With Your Data)

[Interpreting Data Description](#Interpreting Data Description)

[Your First Machine Learning Model](#Your First Machine Learning Model)

[Selecting Data for Modeling](#Selecting Data for Modeling)

[Selecting The Prediction Target](#Selecting The Prediction Target)

Choosing "Features"

[Building Your Model](#Building Your Model)

[Model Validation](#Model Validation)

[What is Model Validation](#What is Model Validation)

[The Problem with "In-Sample" Scores](#The Problem with "In-Sample" Scores)

[Coding It](#Coding It)


Introduction

我们先从机器学习模型的工作原理以及它们的应用概述开始。如果你之前有做过统计建模或机器学习,这可能感觉很基础。别担心,我们很快就会开始构建强大的模型。

在本课程中,你会在以下情境中边学边建模型:

你的表哥通过房地产投机赚了上百万美元。因为你对数据科学感兴趣,他提出和你成为商业伙伴。他提供资金,你提供预测各种房屋价值的模型。

你问你的表哥他过去是怎么预测房地产价值的,他说那只是直觉。但经过进一步询问,你发现他是从以前看过的房子中找出价格模式,然后用这些模式来预测他正在考虑的新房子

机器学习也是同样的道理。我们先从一个叫做决策树的模型开始。还有更复杂的模型能给出更准确的预测。但决策树容易理解,而且是一些数据科学中最好的模型的基础构件。

为了简单起见,我们先从最简单的决策树开始。

它把房子只分为两类。对任何正在考虑的房子,预测的价格就是同一类别房子的历史平均价格。

我们用数据来决定如何把房子分成两组,然后再用数据来确定每组的预测价格。这一步通过数据捕捉规律的过程叫做拟合或者训练模型。用来拟合模型的数据叫做训练数据。

模型是如何拟合的细节(比如如何拆分数据)比较复杂,我们暂时先不讲。模型拟合好之后,你就可以用它来预测新数据中其他房子的价格。

Improving the Decision Tree

下面这两棵决策树中,哪一棵更有可能是由房地产训练数据拟合出来的?

左边的决策树(决策树1)可能更合理,因为它反映了一个现实:卧室多的房子往往比卧室少的房子卖得更贵。这个模型最大的问题是,它没有考虑影响房价的大部分因素,比如浴室数量、地块大小、位置等。

你可以通过使用更多"分枝"的树来捕捉更多因素。这些叫做"更深"的树。一个同时考虑每栋房子地块总面积的决策树可能看起来像这样:

你可以通过遍历决策树来预测任何房子的价格,每次都选择与该房子特征相对应的路径。房子的预测价格就在树的底部。我们在底部做出预测的点叫做叶节点。

分裂点和叶节点的数值会由数据决定,所以现在是你了解一下将要处理的数据的时候了。

Basic Data Exploration

Using Pandas to Get Familiar With Your Data

任何机器学习项目的第一步是熟悉数据。你将使用 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'
# 读取数据并将数据存储在名为 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 Model

Selecting 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.columns
复制代码
Index(['Suburb', 'Address', 'Rooms', 'Type', 'Price', 'Method', 'SellerG',
       'Date', 'Distance', 'Postcode', 'Bedroom2', 'Bathroom', 'Car',
       'Landsize', 'BuildingArea', 'YearBuilt', 'CouncilArea', 'Lattitude',
       'Longtitude', 'Regionname', 'Propertycount'],
      dtype='object')
复制代码
# 墨尔本的数据有一些缺失值(有些房子的某些变量没有被记录)。
# 我们会在后面的教程中学习如何处理缺失值。
# 你用的爱荷华数据列里没有缺失值。
# 所以我们暂时选择最简单的办法,把房子从数据里去掉。
# 暂时别太担心这个,不过代码是:

# dropna 会删除缺失值(把 na 想成"not available"),这里axis = 0是删除行,也就是有缺失值的一条数据
melbourne_data = melbourne_data.dropna(axis=0)

有很多方法可以选择数据的一个子集。Pandas课程会更深入地讲解这些内容,但我们现在先重点关注两种方法。

  1. 点标记法,我们用它来选择"预测目标"
  2. 使用列列表选择,我们用它来选择"特征"

Selecting The Prediction Target

你可以用点标记法来提取一个变量。这个单独的列会被存储在一个 Series 中,基本上就像只有一列数据的 DataFrame。

我们会用点标记法来选择我们想预测的列,这列叫做预测目标。按照惯例,预测目标叫做 y。所以我们需要保存墨尔本数据中房价的代码是

复制代码
#也就是取下Price这一列数据作为预测目标
y = melbourne_data.Price

Choosing "Features"

输入到我们模型中(之后用于做预测)的列被称为"特征"。在我们的例子里,这些就是用来决定房价的列。有时候,你会使用除了目标列以外的所有列作为特征。其他时候,使用更少的特征反而效果更好。

现在,我们先用几个特征来建立模型。稍后你会看到如何迭代并比较用不同特征建立的模型。

我们通过在方括号内提供列名列表来选择多个特征。列表中的每一项都应该是字符串(带引号)。

举个例子:

复制代码
melbourne_features = ['Rooms', 'Bathroom', 'Landsize', 'Lattitude', 'Longtitude']

按照惯例,这些数据被称为X。

复制代码
X = melbourne_data[melbourne_features]

我们快速回顾一下将用来预测房价的数据,使用 describe 方法和 head 方法查看前几行。

复制代码
X.describe()

| Rooms | Bathroom | Landsize | Lattitude | Longtitude |
| count | 6196.000000 | 6196.000000 | 6196.000000 | 6196.000000 |
| mean | 2.931407 | 1.576340 | 471.006940 | -37.807904 |
| std | 0.971079 | 0.711362 | 897.449881 | 0.075850 |
| min | 1.000000 | 1.000000 | 0.000000 | -38.164920 |
| 25% | 2.000000 | 1.000000 | 152.000000 | -37.855438 |
| 50% | 3.000000 | 1.000000 | 373.000000 | -37.802250 |
| 75% | 4.000000 | 2.000000 | 628.000000 | -37.758200 |

max 8.000000 8.000000 37000.000000 -37.457090
复制代码
X.head()

| Rooms | Bathroom | Landsize | Lattitude | Longtitude |
| 1 | 2 | 1.0 | 156.0 | -37.8079 |
| 2 | 3 | 2.0 | 134.0 | -37.8093 |
| 4 | 4 | 1.0 | 120.0 | -37.8072 |
| 6 | 3 | 2.0 | 245.0 | -37.8024 |

7 2 1.0 256.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_state=1)

# 拟合模型
melbourne_model.fit(X, y)
复制代码
DecisionTreeRegressor(random_state=1)

许多机器学习模型在训练时会允许一定的随机性。指定一个 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)的指标开始。让我们从最后一个词"误差"开始分解这个指标。

每套房子的预测误差是:

复制代码
error=actual−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(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)
复制代码
DecisionTreeRegressor()

一旦我们有了模型,计算平均绝对误差的方法如下:

复制代码
from sklearn.metrics import mean_absolute_error

predicted_home_prices = melbourne_model.predict(X)
mean_absolute_error(y, predicted_home_prices)
复制代码
434.71594577146544

The Problem with "In-Sample" Scores

我们刚刚计算出来的指标可以称为"样本内"得分。我们使用同一组房屋"样本"来建立模型和评估模型。这样不好,原因如下。

想象一下,在整个房地产市场中,门的颜色与房价没有关系。

然而,在你用来建立模型的数据样本中,所有绿色门的房子都非常昂贵。模型的任务是找到预测房价的模式,所以它会发现这个模式,并且总是会对绿色门的房子预测高价。

由于这个模式是从训练数据中得出的,模型在训练数据中看起来会很准确。

但如果这个模式在模型看到新数据时不成立,那么模型在实际使用中就会非常不准确

由于模型的实际价值来自于对新数据的预测,我们会在没用来构建模型的数据上来衡量性能。最直接的方法就是在建模时排除一部分数据,然后用这些数据测试模型在没见过的数据上的准确性。这部分数据叫做验证数据。

Coding It

scikit-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 万美元。所以新数据的误差大约是平均房屋价值的四分之一。

有很多方法可以改进这个模型,比如尝试找到更好的特征或使用不同类型的模型。

相关推荐
东坡肘子1 小时前
当应用不再属于特定操作系统 -- 肘子的 Swift 周报 #159
人工智能·swiftui·swift
Maydaycxc2 小时前
gentic RPA 深度解析|AI Agent 与 RPA 混合架构、落地痛点、选型要点
人工智能·ai·自动化·rpa
摸鱼仙人~2 小时前
从 AI 应用开发到 GPU 计算软件:一份完整的 GPGPU、PyTorch、vLLM 与 AI Infra 学习路线
人工智能·pytorch·vllm
znnnk2 小时前
【AI技术】从 Vibe Coding 到 Harness:以 DeepSeek Harness 为例看 AI 项目的工程化维护
人工智能·ai·deepseek·ai工程化·harness·项目维护
张彦峰ZYF9 小时前
越过边界之前:Reward Seeker 实验如何改写智能体安全的时间逻辑
人工智能·ai agent·anthropic·智能体安全·reward seeker·“控制评价过程”泛化跨领域策略·envbom
拓恒技术10 小时前
无人机巡检AI算法的工程化落地:从需求到交付的5个核心环节
人工智能·算法·无人机
罗西的思考12 小时前
AI 时代的 “房谋杜断”:如何培养能力、品味与判断力
人工智能·算法·机器学习
字节跳动视频云技术团队13 小时前
720P 直升 8K,解密 2026 抖音美好奇妙夜巨幕超分黑科技
人工智能·音视频开发
打工仔折腾 AI13 小时前
在 Ubuntu ARM64 部署 Q1 V3.0 MuJoCo 模型:加载、单步推理与执行器响应解析
linux·运维·人工智能·python·深度学习·ubuntu·性能优化