← 返回蜂巢洞察

什么是机器学习模型以及如何构建这样的模型

机器学习听起来可能比实际情况要复杂得多。你会听到诸如“模型”“训练”“特征”“数据集”“预测”和“算法”这样的术语,这可能会让你觉得,在编写第一个机器学习程序之前,自己必须拥有数学博士学位才行。 但实际上,机器学习的本质就是让计算机从示例中学习规律,然后利用这些规律来对新的案例进行预测。如果你曾经通过观察大量的猫来学会识别它们,那么你就已经理解了这一概念的基本含义。 在这个教程中,我们将使用Python构建一个真正的机器学习模型。我们会从一个小型数据集开始,训练出一个模型,让这个模型能够根据学生学习的时长来预测他们是否能够通过考试,然后利用这个训练好的模型来对新的学生进行预测。 先决条件 学习

机器学习听起来可能比实际情况要复杂得多。你会听到诸如“模型”“训练”“特征”“数据集”“预测”和“算法”这样的术语,这可能会让你觉得,在编写第一个机器学习程序之前,自己必须拥有数学博士学位才行。

但实际上,机器学习的本质就是让计算机从示例中学习规律,然后利用这些规律来对新的案例进行预测。如果你曾经通过观察大量的猫来学会识别它们,那么你就已经理解了这一概念的基本含义。

在这个教程中,我们将使用Python构建一个真正的机器学习模型。我们会从一个小型数据集开始,训练出一个模型,让这个模型能够根据学生学习的时长来预测他们是否能够通过考试,然后利用这个训练好的模型来对新的学生进行预测。

先决条件

学习这个教程并不需要任何预先的机器学习经验。我们会边讲解边介绍每一个机器学习的概念。

不过,如果你对Python有基本的了解,那么学习这个教程会变得更加容易。你应该能够熟练掌握以下内容:

  • 创建和使用变量

  • 操作Python列表

  • 编写基本的if/else语句

  • 调用函数

  • 阅读和运行Python程序

  • 使用终端或命令提示符来执行命令

你还应该确保自己的电脑上安装了Python,并且准备好了文本编辑器或代码编辑工具,比如VS Code,同时还需要一个终端或命令提示符,并且能够连接互联网以便下载所需的Python库。

完全不需要事先掌握机器学习、scikit-learn、统计学或高等数学的知识。我会一步步地解释所有的概念和代码。

你将学到的内容

我们的目标不仅仅是让代码能够正常运行。我们还要弄清楚每一行代码的作用、为什么需要它们,以及幕后实际发生了什么。

通过这个过程,你会对机器学习的本质有更清晰的理解,并且会知道如何自己开始构建模型。

什么是机器学习模型?

机器学习模型是一种从数据中学习到了某种规律的程序。

这个定义被刻意设计得非常简单。

假设你向一个孩子展示了几种动物,并告诉他们哪些是猫。在看了足够的例子之后,孩子可能会发现猫通常具有某些特征:胡须、四条腿、毛发、特定的脸型等等。当他们看到新的动物时,就可以利用所学的知识来判断它是否属于猫。

机器学习模型的工作原理与之类似,只不过它处理的是数字和数据,而不是动物。

例如,如果我们向一个模型提供关于学生的信息:

学习时间 考试结果
1 失败
2 失败
3 失败
4 通过
5 通过
6 通过

这个模型可以通过这些例子来发现学习时间与考试结果之间的关系。它可能会得出这样的结论:学习时间越长的学生,通过考试的概率往往越高。

我们并没有明确地将这一规则写进程序中,而是让模型从这些例子中自己学会这种关系。

这就是机器学习的核心理念所在。

机器学习与传统编程

当你将机器学习与传统编程进行对比时,这个区别就会变得更加明显了。

在传统编程中,你需要向计算机提供规则和数据,然后它才会产生相应的结果。

例如:

数据 + 规则 → 结果

你可以这样编写代码:

hours = 5

if hours >= 4:
    print("很可能通过")
else:
    print("很可能失败")

在这里,你是明确地规定了这个规则。

计算机并没有自己学习什么,你只是告诉它该做什么。

而机器学习的思路恰恰相反。你不需要手动编写规则,而是向计算机提供一些例子:

例子 + 正确答案 → 机器学习模型

模型会从这些例子中总结出有用的规律。

之后,你可以将新的数据输入到这个训练好的模型中:

新数据 + 训练好的模型 → 预测结果

这种区别是理解机器学习时必须掌握的最重要的概念之一。

“训练”指的是什么?

训练其实就是利用示例来教导机器学习模型的一种过程。

想象一下,你在教某人如何判断一个学生是否能够通过考试。

你会给他们一些例子:

学习1小时 → 不及格
学习2小时 → 不及格
学习3小时 → 不及格
学习5小时 → 及格
学习6小时 → 及格

在看了足够多的例子之后,他们就会开始发现其中的规律。

机器学习的训练过程也是如此。

我们向算法提供数据,而算法会调整模型结构,使其预测结果能更准确地匹配所提供的示例。

“训练”这个词听起来可能很高级,但实际上它的本质就是为模型提供示例,让它从中学习到有用的规律。

什么是数据集?

数据集其实就是一系列数据的集合。

对于我们的项目来说,我们可以用Python列表来表示这些数据集。

假设我们有:

hours = [1, 2, 3, 4, 5, 6, 7, 8]

以及:

results = [0, 0, 0, 1, 1, 1, 1, 1]

在这里,我们用数字来表示考试结果。

具体来说:

0 = 不及格
1 = 及格

因此,我们的数据意味着:

学习1小时 → 不及格
学习2小时 → 不及格
学习3小时 → 不及格
学习4小时 → 及格
学习5小时 → 及格
学习6小时 → 及格
学习7小时 → 及格
学习8小时 → 及格

第一个列表包含了输入信息,而第二个列表则包含了我们希望模型通过这些信息得出的结果。

什么是特征和标签?

在机器学习中,有一些术语听起来可能比较复杂,但实际上并不如此。

“特征”是指我们用来进行预测的信息。

“标签”则是我们希望模型预测出来的结果。

以我们的例子来说:

学习时间 → 特征
及格/不及格 → 标签

如果我们对每个学生有更多的了解,就可以设置更多的特征,比如:

学习时间
之前的考试成绩
作业完成情况
出勤情况

这样模型就可以利用所有这些特征来进行预测了:

及格还是不及格

你可以这样理解:特征就像是线索,而标签就是答案。

我们使用的是哪种类型的机器学习?

我们的例子中使用的是监督学习。所谓监督学习,就是利用那些我们已经知道正确答案的示例来训练模型。

例如:

学习时间:2小时
正确答案:不及格

以及:

学习时间:6小时
正确答案:及格

在训练过程中,模型会同时看到输入数据以及正确的输出结果。

这与无监督学习不同——在无监督学习中,模型接收数据时并不会得到正确答案,而是需要自行寻找数据中的规律或模式。

机器学习还包括其他类型,比如强化学习,但监督学习是一个很好的入门选择,因为它的基本工作流程很容易理解。

我们最终要构建什么?

我们将创建一个Python程序,该程序会完成以下操作:

  1. 生成一个小型数据集。

  2. 将输入数据与正确答案分开。

  3. 把数据分为训练数据和测试数据。

  4. 创建一个机器学习模型。

  5. 对模型进行训练。

  6. 测试模型的性能。

  7. 为模型提供新的输入信息。

  8. 使用该模型进行预测。

我们最终使用的程序会采用scikit-learn库中的决策树分类器

决策树是一种机器学习算法,它通过针对数据提出一系列问题来做出决策。

以我们的简单示例来说,模型可能会学会这样的判断规则:

这个学生学习了足够多的时间吗?
        ↓
      是 → 通过
      否 → 不及格

实际上,真正的决策树结构会复杂得多,但这个例子可以让你了解其基本原理。

现在,让我们开始动手构建吧!

步骤1:安装Python

要跟随本教程进行学习,你的电脑上必须已经安装了Python。

你可以通过运行以下命令来检查是否已经安装了Python:

python --version

你应该会看到类似这样的输出:

Python 3.12.0

具体的版本号不必与这个例子完全一致。

步骤2:创建项目文件夹

创建一个名为“machine-learning-model”的文件夹。

在这个文件夹中,再创建一个名为“model.py”的文件。

最终,我们的项目结构会如下所示:

machine-learning-model/
└── model.py

步骤3:安装scikit-learn

我们将使用一个名为scikit-learn的Python库。

scikit-learn提供了许多机器学习算法和工具,因此我们不必自己从头开始实现所有的数学公式。

使用以下命令来安装它:

pip install scikit-learn

从技术上讲,我们也可以自己编写简单的机器学习算法,这样做对于后续学习相关数学知识确实有帮助。但对于我们的第一个实际项目来说,使用现成的机器学习库能让我们更专注于理解整个开发流程。

步骤4:导入模型

打开文件`model.py`,然后添加以下代码:

from sklearn.tree import DecisionTreeClassifier

这一行代码从scikit-learn库中导入了`DecisionTreeClassifier`类。

这样的结构:

from sklearn.tree

意味着我们是从scikit-learn的树模块中获取该类的。

接着,再添加以下代码:

import DecisionTreeClassifier

这表示我们要使用决策树分类器。

导入该类后,我们可以用以下代码创建一个机器学习模型:

model = DecisionTreeClassifier()

变量`model`将用来代表我们的机器学习模型。

目前,这个模型还没有学习到任何东西。它基本上还是一个空模型,正在等待训练数据的输入。

步骤5:创建数据集

现在,让我们创建一些样本数据,让模型能够从中学习。

hours = [1, 2, 3, 4, 5, 6, 7, 8]

这个列表记录了每个学生学习的小时数。

results = [0, 0, 0, 1, 1, 1, 1, 1]

这个列表表示每个学生的考试结果,其中`1`代表通过,`0`代表未通过。

请记住:

0 = 未通过 1 = 通过

例如,第一个学生学习了1个小时,所以结果是未通过;第四个学生学习了4个小时,所以结果是通过;第八个学生学习了8个小时,所以也是通过。

现在我们已经准备好了模型可以学习的数据样本了。

步骤6:理解数据结构的重要性

这里有一个很重要的细节。机器学习库通常要求输入数据必须按照特定的结构来进行组织。

我们的`hours`列表就是这样的格式:

[1, 2, 3, 4, 5, 6, 7, 8]

但scikit-learn要求特征数据必须以二维结构的形式呈现。

为什么呢?

因为一个机器学习数据集可能包含多个特征。

举个例子,假设我们有这样一个数据集:

学习小时数 | 出勤率 | 上次考试成绩 2 | 80% | 65 5 | 95% | 82 7 | 98% | 91

每一行代表一个样本数据,每一列代表一个特征。

因此,即使我们的模型目前只有一个特征,我们也仍然需要将其表示为二维数据结构。

我们可以使用嵌套列表来实现这一点:

X = [ [1], [2], [3], [4], [5], [6], [7], [8] ]

每个内层列表代表一个学生。

第一个学生的数据为:
[1]

这意味着他们学习了1个小时。

第二个例子是:

[2]

依此类推。

大写的〈code>X

现在我们来创建标签:

y = [0, 0, 0, 1, 1, 1, 1, 1]

小写的〈code>y

因此,我们现在有:

X = [
    [1],
    [2],
    [3],
    [4],
    [5],
    [6],
    [7],
    [8]
]

y = [0, 0, 0, 1, 1, 1, 1, 1]

你可以把〈code>X看作是:

这些就是线索。

而〈code>y则可以看作是:

这些就是正确答案。

步骤7:划分数据

我们不希望使用完全相同的样本来训练和测试模型。

这样做就好比给学生提供考试中会出现的所有题目,然后对他说:

“哇,你得了100分。干得真棒。”

但实际上我们并没有真正验证他们是否真的掌握了这些知识。

因此,我们需要将数据集分为以下两部分:

  • 训练数据

  • 测试数据

训练数据用于训练模型,而测试数据则用来检验模型是否能够对那些未被用于训练的样本进行正确的预测。

导入划分数据的函数:

from sklearn.model_selection import train_test_split

现在我们可以编写如下代码:

X_train, X_test, y_train, y_test = train_test_split(
    X,
    y,
    test_size=0.25,
    random_state=42
)

这一行代码中发生了很多操作,让我们来详细解释一下。

train_test_split()

这个函数会随机地将我们的数据分为训练数据和测试数据两部分。

我们传递给它的参数是:

X

其中包含了所有的特征数据。

另一个参数是:

y

它包含了标签信息。

参数〈code>test_size=0.25

参数〈code>random_state=42

选择数字〈code>42只是一个常见的示例而已,其实也可以使用其他整数。

例如,将〈code>random_state设置为〈code>10也是可以的。

我们之所以选择〈code>42,只是因为这是一个常用的数值罢了。

四个变量

该函数会返回四组数据:

X_train
X_test
y_train
y_test

X_train包含用于训练模型的特征数据。

y_train包含这些训练样本的正确答案。

X_test包含用于测试模型的特征数据。

y_test包含正确答案,以便我们将其与模型的预测结果进行比较。

步骤8:创建模型

现在我们来创建决策树模型:

model = DecisionTreeClassifier()

这样我们就创建了一个模型对象。

需要注意的是,目前模型还没有被训练过。可以把这个过程想象成购买一本空白的笔记本:笔记本本身是存在的,但里面还没有任何内容。

步骤9:训练模型

接下来我们要执行真正用于训练模型的代码:

model.fit(X_train, y_train)

这是机器学习中非常重要的代码行之一。

.fit()方法会使用我们提供的数据来训练模型。

X_train包含了所有的训练样本数据,

y_train则包含了这些样本的正确答案。

模型会试图找出这些特征与标签之间的关联规律。

在我们的例子中,模型正在尝试探索“学习时间”与“考试结果”之间的关系。 具体的训练过程取决于所使用的算法。决策树会学习一些规则,将这些训练数据分成不同的组,从而使这些分组在预测目标结果时变得更加有效。

目前需要重点理解的是:

model.fit(X_train, y_train) 这句话的意思是:

让模型根据这些训练样本及其正确答案来学习相应的规律。

步骤10:进行预测

训练完成后,我们可以向模型提供新的数据来进行预测。

假设有一名学生学习了5个小时, 我们可以这样编写代码:
prediction = model.predict([[5]])
注意这里使用了这样的数据格式: [[5]] 而不是: [5] 外层的列表表示所有样本,内层的列表则表示每个样本的特征值。 由于我们的模型只有一个特征,因此这个样本只包含一个数值:5。 所以: [[5]] 这句话的意思是:

预测某个特征值为5小时的学生考试结果。

该模型会返回一个预测结果。 我们可以将其打印出来:
print(prediction)
你可能会看到这样的结果:
[1]
请记住: 1 = 通过 0 = 不通过
所以,该模型预测这名学生将会通过测试。

步骤11:将预测结果转换为人类容易理解的文本

当预测结果是:
1
这样的结果其实并不便于人们理解。 我们可以这样写代码:
if prediction[0] == 1:
    print("模型预测:通过")
else:
    print("模型预测:不通过")
让我们来看一下: prediction[0] 该模型返回的是一个包含预测结果的列表: [1] [0]表示列表中的第一个元素。 Python中列表的位置是从0开始的。 因此: prediction[0] 的意思就是:

获取列表中的第一个预测结果。

接下来,我们判断: if prediction[0] == 1: 看模型是否预测出了数字“1”。 如果预测结果是“1”,我们就输出: 模型预测:通过 否则,我们就输出: 模型预测:不通过

步骤12:测试模型

我们不能只做一次预测就认为这个模型很好。 我们需要对它进行评估。 首先,对测试数据集进行预测: predictions = model.predict(X_test) 现在, predictions 中包含了模型对于那些在训练过程中未曾见过的样本的预测结果。 我们可以将这些预测结果与: y_test 中的实际答案进行比较。 scikit-learn提供了准确率计算函数: from sklearn.metrics import accuracy_score 然后,我们就可以计算准确率: accuracy = accuracy_score(y_test, predictions) 这个函数会将实际答案与模型的预测结果进行对比。 如果模型正确预测了: 10个中的8个 ,那么准确率就是: 0.8 我们可以将其转换为百分比: print(f"模型准确率:{accuracy * 100:.2f}%") * 100这个操作会将 0.8 转换成 80% 而: :.2f则是为了保证输出结果的格式整齐。

这意味着我们希望保留两位小数。

因此,输出结果可能会如下所示:

模型准确率:80.00%

关于准确率的一个非常重要的警告

准确率确实很有用,但它并不能完全反映一个模型的性能。

想象一下,你正在尝试检测一种罕见的疾病。

假设:

99个人是健康的,
1个人患病。

一个质量很差的模型可能会简单地预测出:

所有人都是健康的。

这样的模型的准确率会是99%,但它完全忽略了我们真正关心的目标:识别出那个患病的人。

正因如此,机器学习开发者会根据具体的问题选择其他的评估指标,比如精确度、召回率、F1分数、均方误差等等。

对于我们的初级示例来说,准确率已经足够让我们了解整个开发流程了。

步骤13:将所有内容整合起来

我们这个完整的初级机器学习程序如下所示:

from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score


# 数据集
X = [
    [1],
    [2],
    [3],
    [4],
    [5],
    [6],
    [7],
    [8]
]

y = [
    0,
    0,
    0,
    1,
    1,
    1,
    1,
    1
]


# 将数据分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
    X,
    y,
    test_size=0.25,
    random_state=42
)


# 创建机器学习模型
model = DecisionTreeClassifier()


# 训练模型
model.fit(X_train, y_train)


# 对测试数据进行处理并生成预测结果
predictions = model.predict(X_test)


# 计算准确率
accuracy = accuracy_score(y_test, predictions)


print(f"模型准确率:{accuracy * 100:.2f}%")


# 对一个新案例进行预测
hours_studied = [[5]]

prediction = model.predict(hours_studied)


# 显示预测结果
if prediction[0] == 1:
    print("模型预测结果:通过")
else:
    print("模型预测结果:未通过")

从上到下阅读完整代码

前三行代码:

from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

这些代码用于导入我们需要的工具。

接下来:

X = [
    [1],
    [2],
    [3],
    [4],
    [5],
    [6],
    [7],
    [8]
]

这段代码创建了特征数据。

然后:

y = [
    0,
    0,
    0,
    1,
    1,
    1,
    1,
    1
]

这段代码生成了标签数据。

接下来:

X_train, X_test, y_train, y_test = train_test_split(...)

这段代码将数据集分成了训练集和测试集。

将数据集分为训练数据和测试数据。

接下来:

model = DecisionTreeClassifier()

创建模型。

然后:

model.fit(X_train, y_train)

对模型进行训练。

接着:

predictions = model.predict(X_test)

让训练好的模型对测试样本进行预测。

下一步:

accuracy = accuracy_score(y_test, predictions)

计算这些预测中有多少是正确的。

最后:

prediction = model.predict([[5]])

让模型预测一名学习了5小时的新学生的成绩。

这就是整个机器学习的工作流程。

模型内部实际上发生了什么?

这才是机器学习真正有趣的地方。

当我们运行:

model.fit(X_train, y_train)

决策树并不会简单地记住这样的规则:“学习4小时 = 通过”,

而是会分析训练数据,寻找有用的分类方法。

例如,它可能会发现这样的规则:

学习时间 <= 3.5小时吗?

如果满足这个条件:

预测结果为“未通过”

如果不满足这个条件:

预测结果为“通过”

具体的决策树结构会取决于训练数据和算法设置。

如果我们添加更多的特征,决策树就可以利用更多信息来做出判断。

例如:

学习时间 <= 3.5小时吗?

       是
        ↓
    预测结果为“未通过”

       否
        ↓
    出勤率 <= 80%吗?

       是
        ↓
    预测结果为“未通过”

       否
        ↓
    预测结果为“通过”

需要再次强调的是,我们的代码并不会手动创建这些规则。

算法会从训练数据中学习到这些规则。

“学习”到底意味着什么?

这是机器学习中最容易被误解的概念之一。

计算机的学习方式与人类完全不同。机器学习算法会利用数学方法根据数据来调整模型。

不同的算法有不同的学习方式:决策树会寻找有用的分类规则,线性回归模型会学习描述数据关系的数值参数,神经网络则会通过优化算法调整众多参数,聚类算法则会将相似的数据归为一类。

因此,“学习”实际上是指:

利用算法来调整模型,使其能够捕捉数据中的有用规律。

什么是参数?

参数是机器学习模型中从数据中学习得到的数值。

例如,在一个简单的线性模型中:

y = mx + b

该模型可能会学习到以下数值:

m

b

这些数值决定了输入与输出之间的关系。

神经网络可能拥有数百万甚至数十亿个通过训练学习得到的参数。

关键在于,模型的行为是由在训练过程中学习或调整得到的数值所决定的。

参数与超参数

这两个概念很容易被混淆。

参数通常是通过对训练数据进行学习而获得的,而超参数则是在训练之前或训练过程中由人工设定的数值。

以我们的决策树为例,我们可以指定如下参数:

model = DecisionTreeClassifier(
    max_depth=3
)

在这里:

max_depth=3

就是一个超参数。

我们是在告诉算法:

不要让决策树的深度超过3。

模型会从数据中学习其内部的决策规则,而超参数则是由我们人为设定的。

当你构建更复杂的模型时,这种区分就会变得越来越重要。

为什么需要训练数据和测试数据?

想象一下,你正在为数学考试做准备。

老师给了你10道练习题,你把所有答案都记住了。

考试中恰好出现了这10道题,于是你全部答对了。

但这能证明你真正理解了数学吗?并不能。你可能只是记住了这些例题而已。

机器学习也会遇到类似的问题,这就是所谓的过拟合。一个模型可能会在处理训练数据时表现得非常好,但却无法很好地应对新的数据。

因此,我们需要将一部分数据留作测试用途。在训练过程中,模型不会接触到这些测试数据。这样我们就可以检验:

这个模型能否将其所学的知识应用到之前从未见过的例子上?

能够处理新数据的能力是机器学习最重要的目标之一。

什么是过拟合?

当一个模型过于详细地学习了训练数据时,就会发生过拟合现象。

假设我们给模型提供了一个非常小的数据集。那么它可能不会去学习一般性的规律:

学习时间越长,通过考试的概率越高。

而是会记住其中具体的例子。

这种情况下,模型在训练数据上的表现可能会很好,但在处理新数据时却会表现得很差。

一个在训练数据上表现优异,但在未见过的数据上表现不佳的模型,往往就是过拟合了。

什么是欠拟合?

“欠拟合”基本上就是相反的情况。模型过于简单,无法捕捉数据中的重要模式。

想象一下,如果只用一两个成绩来预测某人的考试结果,那这个模型肯定得不到足够有用的信息,因此在训练数据和测试数据上的表现都会很差。

优秀的机器学习方法在于找到这样一个模型:它既足够复杂,能够学习到有用的模式,又不会过于复杂以至于只是机械地记住了训练样本中的内容。

为什么我们的数据集不是真正的机器学习数据集

我们使用的这八个例子故意被设计得非常简单。

一个真正的机器学习项目通常会使用大量数据。

例如,你可以收集如下信息:

10,000名学生的数据

其中包含这样的特征:

通过/未通过

这样模型就可以从成千上万的样本中学习到知识。

我们使用这种小型数据集的好处在于,我们可以清楚地了解整个分析过程的每一个环节。

步骤14:添加更多特征

让我们让这个例子变得更贴近实际情况一些吧。

除了学习时长,我们还考虑出勤情况……

我们可以用这样的方式来表示每个学生:

X = [
    [2, 70],
    [3, 75],
    [4, 80],
    [5, 85],
    [6, 90],
    [7, 95]
]

现在每一行都包含了两个特征。

[5, 85]

表示的意思是:

y = [0, 0, 1, 1, 1, 1]

现在模型拥有了更多的信息来进行分析。

我们可以用同样的方法来训练模型:

model.fit(X_train, y_train)

不同之处在于,模型现在使用了两个特征,而不仅仅是一个。

步骤15:利用多个特征进行预测

学习了5个小时,出勤率为90%

我们可以用这样的方式来表示这个学生:

new_student = [[5, 90]]

然后就可以进行预测了:

prediction = model.predict(new_student)

模型会同时利用这两个特征来进行预测。

当你拥有数百个特征时会发生什么?

完全相同的基本概念依然适用。

想象一下,使用以下这些信息来预测房价:

卧室数量
房屋面积
浴室数量
地理位置
房屋年龄
车库大小
地块面积
距离学校的距离

每一项都可以成为一种特征。然后模型会利用这些特征来预测一个目标值:

房价

基本的结构依然是:

特征 → 模型 → 预测结果

难点在于如何选择有用的数据、挑选合适的算法、清理数据、评估模型的性能,以及确保模型在训练数据集之外也能正常运行。

什么是回归分析?

到目前为止,我们的模型预测的都是一些类别:

通过 / 不通过

这就是一个分类问题。分类意味着预测某个具体的类别。

例如:

垃圾邮件 / 非垃圾邮件
猫 / 狗
欺诈行为 / 非欺诈行为
通过 / 不通过

而回归分析则不同,它预测的是一个数值。

比如:

房价 = 425,000美元

或者:

温度 = 82.4华氏度

又或者:

销售额 = 17,500美元

因此,一个有用的区分标准是:

分类 → 预测类别
回归分析 → 预测数值

一个简单的回归分析示例

scikit-learn提供了一个名为LinearRegression的模型。

首先导入它:

from sklearn.linear_model import LinearRegression

然后创建这个模型:

model = LinearRegression()

接下来对其进行训练:

model.fit(X_train, y_train)

最后进行预测:

prediction = model.predict([[5]])

整个工作流程几乎是一样的。

这就是机器学习库之所以有用的原因之一:一旦你了解了整体的工作流程,学习新的算法就会变得容易很多。

通用的机器学习工作流程

大多数初学者的机器学习项目都可以按照以下步骤来开展:

1. 收集数据

收集与你想要解决的问题相关的样本数据。

2. 清理数据

修复缺失、错误、重复或不一致的数据。

3. 选择特征

挑选出你希望模型使用的信息。

4. 选择模型

为所解决的问题选择合适的算法。

5. 分割数据

将训练数据和测试数据分开。

6. 训练模型

使用训练数据来拟合模型。

7. 评估模型

测量模型的性能表现。

8. 改进模型

调整数据、特征、模型或超参数。

9. 进行预测

使用训练好的模型来处理新数据。

10. 部署模型

如果模型有用,就将其集成到应用程序中。

这种工作流程比记住某个特定算法的名称重要得多。

机器学习如何应用于实际场景

一个训练好的模型通常并不是整个应用程序的全部。

假设你构建了一个能够判断电子邮件是否为垃圾邮件的模型,那么最终你可能会创建出如下这样的系统:

电子邮件
 ↓
后端服务
 ↓
机器学习模型
 ↓
预测结果
 ↓
用户界面

这个模型只是更大规模软件系统中的一个组成部分。

同样的道理也适用于以下这些领域:

推荐系统
欺诈检测
搜索引擎
人工智能助手
图像识别
需求预测
客户分析

对于开发者来说,这一点非常重要,因为机器学习工程并不仅仅涉及模型的训练,还需要知道如何利用这些模型来开发软件。

学完这些之后,你应该继续学习什么?

一旦你掌握了这个基础项目,还有很多有用的方向可以探索。

学习NumPy

NumPy是Python中用于数值计算的基础库之一。在机器学习领域,你会经常用到数组。

学习pandas

pandas在处理数据集时非常有用

例如:

import pandas as pd

你可以用它来加载CSV文件:

data = pd.read_csv("students.csv")

然后查看数据内容:

print(data.head())

当你开始处理真实的数据集时,这些技能会变得非常实用。

学习数据可视化技术

Matplotlib这样的库可以帮助你将数据可视化。例如,你可以用来查看学习时间是否与考试成绩有关。

数据可视化技术能帮助你在训练模型之前就发现数据中的规律。

深入了解更多算法

一旦你理解了决策树的原理,就可以进一步探索以下内容:

线性回归
逻辑回归
随机森林
K近邻算法
支持向量机
梯度提升算法
神经网络

你并不需要记住所有这些算法。

关键是要理解每种算法是为解决哪种类型的问题而设计的,以及它们各自基于哪些假设或需要做出哪些权衡。

学习相关数学知识

即使不从零开始推导每一个数学公式,你依然可以构建出实用的机器学习应用。

但如果你想深入理解机器学习的原理,数学知识就会变得愈发重要

可以先从以下内容开始学习:

代数
函数
概率论
统计学
线性代数
微积分

当你开始研究神经网络的工作原理时,导数和梯度等概念会变得尤为重要。

这里有一门微积分课程,以及一本统计学手册,可以帮助你入门。

需要牢记的思维模型

在学习机器学习的过程中,不要让复杂的术语让你觉得这一切都过于复杂。

最简单来说,可以把机器学习理解为这样一种过程:

你有一些示例,每个示例都包含被称为“特征”的信息;其中一些示例还拥有被称为“标签”的已知答案。

你将这些示例提供给学习算法,算法会从中提取出规律并生成一个模型。

之后,当你向这个训练好的模型提供新的数据时,模型会利用它所学到的规律来进行预测。

用代码来表示的话,基本的工作流程如下:

model = SomeMachineLearningModel()

model.fit(X_train, y_train)

predictions = model.predict(X_test)

这种由三个步骤组成的结构值得你记住。

model = ...

用于创建模型。

model.fit...

用于训练模型。

model.predict...

用于使用训练好的模型进行预测。

你所学到的关于机器学习的所有知识,都是建立在这个基础之上的。

最后的思考

机器学习模型并不是存在于你的计算机中的某种“神奇大脑”;它实际上是一个由算法根据数据生成的数学模型。

最重要的思维转变在于:你并不总是需要亲自为每一条规则编写代码。在传统的编程方式中,你可能需要明确地写出这样的代码:

if hours >= 4:
    result = "Pass"
而在机器学习的框架下,你只需要提供一些示例数据:
1小时 → 失败
2小时 → 失败
3小时 → 失败
4小时 → 通过
5小时 → 通过
然后让学习算法自己去发现其中存在的规律。 我们的项目规模虽然很小,但这些基本原理在规模更大的系统中也同样适用。无论是推荐系统、欺诈检测器、图像分类器,还是许多其他机器学习应用,它们都需要处理数据、提取特征、进行训练、进行评估以及生成预测结果。 一旦你理解了这些基础知识,像“训练”“特征”“标签”“分类”“回归”“过拟合”和“模型”这样的术语,就不会再显得像是毫无关联的AI专业词汇,而会形成一个连贯的整体概念。 你不必一开始就尝试构建庞大的AI系统。可以先从一个小型数据集开始,训练一个模型,检查它的预测结果,稍作调整,然后观察变化。正是这种实践过程,让机器学习变得更容易理解。 祝编程愉快!

相关文章

技术实践

人工智能论文评述:通过估算数据分布的梯度来实现生成建模

如今,扩散模型已成为最具影响力的生成式人工智能系统之一。它们被应用于从图像合成与编辑到视频生成、科学发现以及多模态内容创作等诸多领域。 尽管这些模型具备令人印象深刻的功能,但其背后的基本原理却出奇地简单:它们从纯粹的噪声开始,逐步将其转化为真实的数据。 然而,这个简单的描述立刻引出了一个更深层次的问题:如果模型仅仅以随机噪声为起点,那么它如何知道在每一步该朝哪个方向发展?是什么让模型判断出某个微小的改变是会让图像变得更真实,还是会让它偏离真实数据的分布范围呢? 2019年,杨 Song和Stefano Ermon提出了一种新的视角,以一种简洁且符合数学原理的方式解答了这个问题。他们的框架并非试

阅读全文
技术实践

创造了现代人工智能的那篇论文:Transformer背后的故事

每次你与现代人工智能模型进行交互时,其实都在使用一种源于2017年那篇名为《注意力才是关键》的研究论文所提出的架构。 我们在freeCodeCamp.org的YouTube频道上发布的最新视频,详细讲述了八位谷歌研究人员是如何着手改进Google Translate的,最终又如何彻底改变了整个科技领域的格局的。 在这一突破性成果出现之前,人工智能领域主要依赖循环神经网络。这类模型会按顺序逐词处理文本,但这带来了两个巨大的障碍: “上下文丢失”:当处理长句或长段落时,模型会忘记开头那些重要的信息。 “训练速度缓慢”:由于需要顺序处理数据,各个步骤无法并行执行,因此即使使用庞大的GPU集群,模型的

阅读全文
技术实践

如何从大型语言模型中获取可靠的结构化数据

大多数关于如何调用语言模型的教程都会在 JSON.parse(response.content) 这行代码处结束。这段代码在处理前十个测试用例时确实可以有效运行。但当你开始实际应用时,会在第400次左右的一次请求中遇到问题:模型可能会返回一个它自己编造出来的日期,或者当你的数据结构应该包含5个元素时却返回8个数组项,又或者返回一个格式完全正确但实际上缺少某个字段的JSON对象。 我在开发Temploracraft这个简历工具时遇到了这样的问题。这个工具会接收用户上传的文档,并将其转换成应用程序可以编辑的结构化数据。 输入的数据确实具有很大的不可预测性:有些是两列结构的PDF文件,有些表格其实并

阅读全文