测试数据集是一个微型的手工数据集,你可以用它来测试机器学习算法或者工具。
测试数据集的数据具有定义良好的属性,例如其中的线性或者非线性数据,你可用它们探索特定的算法行为。Python的机器学习库scikit-learn提供了一组函数,你可以从可配置的测试问题集中生成样本,便于处理回归和分类问题。
在本教程中,你将会意识到有关测试的问题以及如何Python机器学习库scikit解决问题。
完成本教程后,你将会学到以下内容:
- 如何生成多类别分类预测的测试问题
- 如何生成二元分类预测的测试问题
- 如何生成线性回归预测的测试问题
教程概述
本教程共三部分,内容如下:
- 测试数据集
- 分类测试问题
- 回归测试问题
测试数据集
开发和实现机器学习算法面临的第一个问题是,如何能够保证已经正确地实现了机器学习算法。有时候,算法就是有bug也能够发挥作用。
测试数据集是一个很小的设计模块,你可以用它来测试和调试你的算法,也可以用来测试工具是否良好。它还有助于理解算法中相应超参数变化(超参数:根据经验确定的变量)的行为。
下面是测试数据集的一些理想属性:
- 它们可以快速且容易的生成。
- 它们包含“已知”或者“理解”的结果与预测结果相比较
- 它们是随机的,每次生成的时候都允许对同一个问题的变量进行随机初始化
- 它们规模很小,很容易在二维结构中显示出来。
- 它们可以很容易地被放大
我建议你在刚开始使用新的机器学习算法或者开发新的测试工具的时候用测试数据集来调试。
Scikit-learn是一个用于机器学习的Python库,它提供了一系列用于处理测试问题的方法。
在本教程中,我们将介绍一些为分类问题和回归算法生成测试问题的案例。
分类测试问题
分类就是为观察对象贴标签的问题。
在本节中,我们讨论三种分类问题:斑点、月形分布和圆形分布。
斑点分布分类问题
makeblog()方法用于生成符合高斯分布规律的斑点。
你可以控制生成斑点的数量,生成样本数量,以及其他属性。
考虑到气泡的线性可分性,该问题适用于线性分类问题。
作为一个多类别分类问题,在下面的例子中,代码生成了一个包含三个斑点的二维结构的数据集。每一个观察样本都有两个输入和0个、1个或2个分类值。
代码语言:js复制# 生成2d分类数据集
X, y = make_blobs(n_samples=100, centers=3, n_features=2)
完整代码如下所示:
代码语言:js复制from sklearn.datasets.samples_generator import make_blobs
from matplotlib import pyplot
from pandas import DataFrame
# 生成2d分类数据集
X, y = make_blobs(n_samples=100, centers=3, n_features=2)
# 散点图,按分类值着色
df = DataFrame(dict(x=X[:,0], y=X[:,1], label=y))
colors = {0:'red', 1:'blue', 2:'green'}
fig, ax = pyplot.subplots()
grouped = df.groupby('label')
for key, group in grouped:
group.plot(ax=ax, kind='scatter', x='x', y='y', label=key, color=colors[key])
pyplot.show()
运行这个示例会生成问题的输入和输入,然后创建一个简易的2D图,用不同的颜色表示不同的类。
注意:由于问题是随机特性,你的指定数据集和结果图将会有所不同。这是特性而不是bug。
我们将会在下面的案例中使用与上面示例相同的结构
月形分布分类问题
make_moons() 方法用于二元分类,它将产生一个漩涡模式,或者是两个月形分布的样本。
你可以控制月亮的分布形状和产生的样本数目。
这个测试问题适用于能够学习非线性分类边界的算法。
下面的样例代码产生了一个带有中等噪声的月形分布数据集。
代码语言:js复制# 生成2d分类数据集
X, y = make_moons(n_samples=100, noise=0.1)
完整代码如下:
代码语言:js复制from sklearn.datasets import make_moons
from matplotlib import pyplot
from pandas import DataFrame
# 生成2d分类数据集
X, y = make_moons(n_samples=100, noise=0.1)
# 散点图,按分类值着色
df = DataFrame(dict(x=X[:,0], y=X[:,1], label=y))
colors = {0:'red', 1:'blue'}
fig, ax = pyplot.subplots()
grouped = df.groupby('label')
for key, group in grouped:
group.plot(ax=ax, kind='scatter', x='x', y='y', label=key, color=colors[key])
pyplot.show()
运行该样例代码将会生成并绘制用于检查的数据集,并再次为指定的类着色。
圆形分布分类问题
make_circles()方法会产生一个二元分类问题,该问题的测试样本会呈现同心圆分布。
同样,像月形分布测试问题一样,你可以控制圆形分布中噪音的大小
该测试问题适用于能够学习复杂非线性曲线的算法。
下面的样例代码产生了一个带有一些噪声的圆形分布数据集。
代码语言:js复制# 生成2d分类数据集
X, y = make_circles(n_samples=100, noise=0.05)
完整代码如下所示:
代码语言:js复制from sklearn.datasets import make_circles
from matplotlib import pyplot
from pandas import DataFrame
# 生成2d分类数据集
X, y = make_circles(n_samples=100, noise=0.05)
# 散点图,按分类值着色
df = DataFrame(dict(x=X[:,0], y=X[:,1], label=y))
colors = {0:'red', 1:'blue'}
fig, ax = pyplot.subplots()
grouped = df.groupby('label')
for key, group in grouped:
group.plot(ax=ax, kind='scatter', x='x', y='y', label=key, color=colors[key])
pyplot.show()
运行该示例代码将生成并绘制用于检查的数据集。
回归预测问题
回归是预测一个具体量值的问题。
make_regression()方法将创建一个输入和输出之间具有线性关系的数据集。
你可以配置实例代码中的样例数量、输入特性的数量、噪声级别等等。
这个数据集适用于能够学习线性回归函数的算法。
下面的示例将会生成100个样例,其中包含一个噪声极低的输入特性和输出特性。
代码语言:js复制# 生成线性回归数据集
X, y = make_regression(n_samples=100, n_features=1, noise=0.1)
完整代码如下所示
代码语言:js复制from sklearn.datasets import make_regression
from matplotlib import pyplot
# generate regression dataset
X, y = make_regression(n_samples=100, n_features=1, noise=0.1)
# plot regression dataset
pyplot.scatter(X,y)
pyplot.show()
运行该示例代码生成数据,并且绘制出x和y的坐标图,由于这个关系是线性的,所以很无趣。
扩展
本节列出了一些创意扩展,可能有助于你深入探索本教程。
比较算法
选择一个测试问题,并对该问题的一整套算法进行比较,并报告其性能。
扩大问题
选定一个测试问题,并探索扩大其规模,采用改进的方法展示可视化结果,或者探索一个给定的算法模型技巧和问题规模。
附加问题
这个库为项目提供了一系列额外的测试问题,为每一个人编写了代码示例来演示它们是如何工作的。
如果你对这些扩展中的任意一个感兴趣,我很乐意知道你的想法。
扩展阅读
如果你希望深入研究,本节将提供更多关于本文主题的参考资料
Scikit-learn 用户引导:数据集加载使用程序
Scikit-learn API: sklearn.datasets:数据集
总结
在本教程中,您意识到了测试的问题,以及如何在Python中解决这个问题。
具体来说,完成本教程后,你学到了以下内容:
- 如何生成多类别分类预测的测试问题
- 如何生成二元分类预测的测试问题
- 如何生成线性回归预测的测试问题