对机器学习系统进行分类的另一种方法是通过它们是如何一般化[generalize]的。大多数机器学习任务都是关于预测的。这意味着给定大量的训练样本,系统需要能将其泛化到之前没见到过的样本上。对训练数据集有很好的性能还不够,真正的目标是对新实例的性能。

有两种主要泛化方法:基于实例学习和基于模型学习。

Instance-based learning:基于实例学习

也许最简单的学习方式就是凭记忆学习。如果你用这种方式创建一个垃圾邮件过滤器,它只会标记所有与用户已经标记过的邮件相同的邮件——不是最糟糕的解决方案,但肯定不是最好的。

你的垃圾邮件过滤器不仅能标记和已知的垃圾邮件相同的邮件,也要能标记类似垃圾邮件的邮件。这需要两封邮件之间的相似性度量。两个电子邮件之间的一个(非常基本的)相似性度量可以是计算它们共有的单词的数量。如果电子邮件与已知的垃圾邮件有很多相似之处,系统就会将电子邮件标记为垃圾邮件。

这称为基于实例的学习:系统通过记忆学习示例,然后使用相似性度量泛化到新的例子(图1-15)。

图1-15 基于实例的学习

Model-based learning:基于模型学习

另一种从样本集进泛化的方法是建立这些样本的模型,然后使用这个模型进行预测。这称作基于模型学习(图1-16)

图1-16 基于模型的学习

例如,你想知道钱是否能让人快乐,你从OECD网站(http://stats.oecd.org/index.aspx?DataSetCode=BLI)下载了Better Life Index指数数据,还从IMF(/goo.gl/j1MSKe)下载了人均GDP数据。表1-1展示了摘要。

表1-1 金钱能让人更快乐吗?

让我们为一些随机的国家绘制数据(图1-17)。

图1-17 你看到这里的趋势了吗?

这里似乎有一种趋势!虽然数据是有噪声的(例如在一定程度上,随着中国人均GDP的增长,生活满意度似乎或多或少呈线性增长。所以你决定将生活满意度作为人均GDP的线性函数。这一步被称为模型选择:你选择了一个线性模型的生活满意度只有一个属性,人均GDP(方程式1-1)。

方程1 - 1 一个简单的线性模型

life_satisfaction = θ 0 + θ 1 × GDP_per_capita

这个模型有两个模型参数,θ0和θ1。通过调整这些参数,你可以使您的模型表示任何线性函数,如图1-18所示。

图1-18 一些可能的线性模型

在使用模型之前,您需要定义参数值θ0和θ1。您如何知道哪些值将使您的模型表现最佳?要回答这个问题,您需要指定一个性能度量。你可以定义一个效用函数[utility function](或适应度函数[fitness function])来衡量你的模型有多好,或者你可以定义一个代价函数[cost function]来衡量它有多糟糕。对于线性回归问题,人们一般是用代价函数测量线性模型的预测值和训练样本的距离差,目标是使距离差最小。

接下来就是线性回归算法,你用训练样本训练算法,算法找到使线性模型最拟合数据的参数。这称作模型训练。在我们的例子中,算法得到的参数值是 θ 0 = 4.85 and θ 1 = 4.91 × 10 –5

现在模型已经最紧密地拟合到训练数据了,见图1-19。

图1-19。最适合训练数据的线性模型。

最后,可以准备运行模型进行预测了。例如,你想知道塞浦路斯人有多快乐,而OECD的数据没有答案。幸运的是,您可以使用您的模型做出很好的预测:塞浦路斯的人均国内生产总值为22587美元,然后应用模型得到生活满意度大约是4.85 + 22,587 × 4.91 × 10 -5 = 5.96.

为了满足您的胃口,示例1-1显示了加载数据、准备、创建散点图的Python代码,然后训练线性模型并进行预测。

例1 - 1 使用scikitt训练和运行一个线性模型。

import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import sklearn
# Load the data
oecd_bli = pd.read_csv("oecd_bli_2015.csv", thousands=',')
gdp_per_capita = pd.read_csv("gdp_per_capita.csv",thousands=',',delimiter='\t',
encoding='latin1', na_values="n/a")
# Prepare the data
country_stats = prepare_country_stats(oecd_bli, gdp_per_capita)
X = np.c_[country_stats["GDP per capita"]]
y = np.c_[country_stats["Life satisfaction"]]
# Visualize the data
country_stats.plot(kind='scatter', x="GDP per capita", y='Life satisfaction')
plt.show()
# Select a linear model
lin_reg_model = sklearn.linear_model.LinearRegression()
# Train the model
lin_reg_model.fit(X, y)
# Make a prediction for Cyprus
X_new = [[22587]] # Cyprus' GDP per capita
print(lin_reg_model.predict(X_new)) # outputs [[ 5.96242338]]

如果你之前接触过基于实例学习算法,你会发现斯洛文尼亚的人均GDP(20732美元)和塞浦路斯差距很小,OECD数据上斯洛文尼亚的生活满意度是5.7,就可以预测塞浦路斯的生活满意度也是5.7。如果放大一下范围,看一下接下来两个临近的国家,你会发现葡萄牙和西班牙的生活满意度分别是5.1和6.5。对这三个值进行平均得到5.77,就和基于模型的预测值很接近。这个简单的算法叫做k近邻回归(这个例子中,k=3)。

在前面的代码中替换线性回归模型为k近邻模型,只需更换下面一行:

clf = sklearn.linear_model.LinearRegression()

替换为:

clf = sklearn.neighbors.KNeighborsRegressor(n_neighbors=3)

如果一切顺利,你的模型将会做出很好的预测。如果没有,您可能需要使用更多的属性(就业率、健康、空气污染等),获得更多或更好质量的训练数据,或者选择一个更强大的模型(例如,一个多项式回归模型)。

概括起来:

  • 研究数据
  • 选择模型
  • 用训练数据进行训练(即,学习算法搜寻模型参数值,使代价函数最小)
  • 最后,使用模型对新案例进行预测(这称作推断[inference]),希望这个模型的泛化效果不会太差

这就是一个典型的机器学习项目。在第2章中,你会亲手接触一个完整的项目。

到目前为止,我们已经讨论了很多问题:您现在知道机器学习的真正意义,为什么它有用,什么是最常见的ML系统类型,以及典型的项目工作流是什么样子的。现在让我们来看看学习中哪些地方会出错,并阻止你做出准确的预测。

results matching ""

    No results matching ""