测试数据集是小型的人工数据集,可用于测试机器学习算法或测试套件。
测试数据集中的数据具有明确定义的属性,例如线性和非线性,这使您可以探索特定的算法行为。scikit-learn Python 库提供了一系列函数,用于为回归和分类生成可配置测试问题的样本。
在本教程中,您将发现测试问题以及如何在 Python 中使用 scikit-learn 来解决它们。
完成本教程后,您将了解:
- 如何生成多类别分类预测测试问题。
- 如何生成二分类预测测试问题。
- 如何生成线性回归预测测试问题。
通过我的新书《Python 机器学习精通》来启动您的项目,其中包含分步教程和所有示例的Python 源代码文件。
让我们开始吧。
- 2020年1月更新:已针对 scikit-learn v0.22 API 的更改进行更新。
教程概述
本教程分为3个部分;它们是
- 测试数据集
- 分类测试问题
- 回归测试问题
测试数据集
开发和实现机器学习算法时的一个问题是:您如何知道是否正确实现了它们。它们似乎可以正常工作,即使存在错误。
测试数据集是小型的人工问题,可用于测试和调试您的算法和测试套件。它们也有助于更好地理解算法在响应超参数更改时的行为。
以下是测试数据集的一些理想属性:
- 它们可以快速轻松地生成。
- 它们包含“已知”或“已理解”的结果,以便与预测进行比较。
- 它们是随机的,允许每次生成相同的随机变化。
- 它们很小,并且易于在二维中可视化。
- 它们可以轻松地进行扩展。
我建议在开始使用新的机器学习算法或开发新的测试套件时使用测试数据集。
scikit-learn 是一个用于机器学习的 Python 库,它提供了生成一系列测试问题的函数。
在本教程中,我们将介绍一些为分类和回归算法生成测试问题的示例。
分类测试问题
分类是将标签分配给观测值的问题。
在本节中,我们将介绍三个分类问题:blobs(斑点)、moons(月亮)和 circles(圆)。
Blobs 分类问题
可以使用 make_blobs() 函数生成具有高斯分布的点簇。
您可以控制要生成的簇的数量和样本数量,以及其他许多属性。
鉴于簇的线性可分性,该问题适用于线性分类问题。
下面的示例生成一个 2D 数据集,其中包含三个簇作为多类别分类预测问题。每个观测值有两个输入和 0、1 或 2 个类值。
1 2 |
# 生成二维分类数据集 X, y = make_blobs(n_samples=100, centers=3, n_features=2) |
完整的示例如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
from sklearn.datasets import make_blobs from matplotlib import pyplot from pandas import DataFrame # 生成二维分类数据集 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。

Blobs 测试分类问题的散点图
我们将对以下示例使用相同的示例结构。
Moons 分类问题
make_moons() 函数用于二分类,并将生成一个漩涡状图案,或两个月亮。
您可以控制月亮形状的噪点程度以及要生成的样本数量。
此测试问题适用于能够学习非线性类边界的算法。
下面的示例生成了一个具有中等噪点的月亮数据集。
1 2 |
# 生成二维分类数据集 X, y = make_moons(n_samples=100, noise=0.1) |
完整的示例如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
from sklearn.datasets import make_moons from matplotlib import pyplot from pandas import DataFrame # 生成二维分类数据集 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() |
运行示例会生成并绘制数据集以供审阅,同样根据分配的类别为样本着色。

Moons 测试分类问题的散点图
Circles 分类问题
make_circles() 函数生成一个二分类问题,其数据集呈同心圆。
同样,与 moons 测试问题一样,您可以控制形状的噪点量。
此测试问题适用于能够学习复杂非线性流形的算法。
下面的示例生成了一个带有少量噪点的圆数据集。
1 2 |
# 生成二维分类数据集 X, y = make_circles(n_samples=100, noise=0.05) |
完整的示例如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
from sklearn.datasets import make_circles from matplotlib import pyplot from pandas import DataFrame # 生成二维分类数据集 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() |
运行示例会生成并绘制数据集以供审阅。

Circles 测试分类问题的散点图
回归测试问题
回归是根据观测值预测数量的问题。
make_regression() 函数将创建一个在输入和输出之间具有线性关系的函数。
您可以配置样本数量、输入特征数量、噪点级别以及更多内容。
此数据集适用于能够学习线性回归函数的算法。
下面的示例将生成 100 个示例,其中包含一个输入特征和一个输出特征,并带有适度的噪点。
1 2 |
# 生成回归数据集 X, y = make_regression(n_samples=100, n_features=1, noise=0.1) |
完整的示例如下所示。
1 2 3 4 5 6 7 |
from sklearn.datasets import make_regression from matplotlib import pyplot # 生成回归数据集 X, y = make_regression(n_samples=100, n_features=1, noise=0.1) # plot regression dataset pyplot.scatter(X,y) pyplot.show() |
运行示例将生成数据并绘制 X 和 y 的关系,鉴于它是线性的,所以相当无聊。

回归测试问题的散点图
扩展
本节列出了一些您可能希望探索的扩展本教程的想法。
- 比较算法。选择一个测试问题,并在该问题上比较一系列算法,并报告性能。
- 扩展问题。选择一个测试问题,并探索其扩展,使用回归方法可视化结果,并可能探索给定算法的模型技能与问题规模的关系。
- 附加问题。该库提供了一系列附加测试问题;为每个问题编写代码示例以演示其工作原理。
如果您探索了这些扩展中的任何一个,我很想知道。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
总结
在本教程中,您了解了测试问题以及如何在 Python 中使用 scikit-learn 来解决它们。
具体来说,你学到了:
- 如何生成多类别分类预测测试问题。
- 如何生成二分类预测测试问题。
- 如何生成线性回归预测测试问题。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
这些数据集的特征数量可以大于给出的示例吗?例如,make_blobs 函数可以创建具有 3 个以上特征的数据集吗?
试试看。
R 中有类似的函数吗?
肯定有,但我不知道,抱歉。
你好,
我使用多项朴素贝叶斯算法为基于文本的数据集构建了性别预测模型。但是,我正在尝试使用我构建的模型对基于文本的新的真实性别测试数据集进行预测。我该如何实现?您能解释一下这个概念吗?谢谢。
这是我在这里回答的一个常见问题
https://machinelearning.org.cn/faq/single-faq/how-do-i-make-predictions
你好 Jason,我正在处理信用卡欺诈检测,其中数据集丢失了,我可以使用该方法生成数据集来验证我的工作吗?如果不行,我应该放弃这项工作吗?
此致
如果没有数据,您就无法开发和测试模型。
或者,如果您在数据集中有缺失的观测值,您可以选择
https://machinelearning.org.cn/faq/single-faq/how-do-i-handle-missing-data
为什么 make_blobs 会为数据点分配分类 y?这难道不是分类算法的工作吗?
是的,但我们需要数据来训练模型。
嗨,
您是否知道如何使用布朗运动(包括趋势和季节性)创建时间序列数据集?
抱歉,我没有布朗运动的示例。
我该如何生成不平衡数据集?例如,在 100 个点中,我希望一个类别中有 10 个点,另一个类别中有 90 个点。
我相信 API 可以做到,但如果不能,请生成每个类别 100 个样本,然后从一个类别中删除 90 个样本,从另一个类别中删除 10 个样本。
我能通过这个生成特定的图像检测吗?
我认为没有。
你好 Jason。感谢这篇精彩的文章。我有一个我想增加其大小的数据集。也许通过复制一些记录,但我正在寻找一种更准确的方法。您是否也知道可以根据当前数据集生成新数据点的 Python 库?
非常感谢,
Pamela
最简单的方法是复制记录并添加均值为零、标准差很小的(在每个维度上都合理的)高斯噪声。
除此之外,您可能需要研究 SMOTE 等技术使用的重采样方法。
抱歉,我不知道有这样的库。
如何绘制具有更多 n_features 的内容?例如,在 blob 生成器中,如果我设置 n_features 为 7,我会得到 7 列特征。但是,当我绘制它时,它只将前两列作为绘图数据——更重要的是,y 值的分配似乎只基于前两个特征列——其余特征是否参与了将数据分组到特定簇的过程?我希望我的问题有意义。谢谢。
您可以选择特征的数量以及对结果有贡献的特征的数量。
显然,2D 图一次只能显示两个特征,您可以创建每个变量与其他变量绘制的矩阵。
谢谢 Jason,我混淆了“centers”(中心)的含义与通常等同于 y_train/y_test 的元素(因为 n_features 元素基本上是神经网络中的特征(X_train/X_test),所以我错误地将“centers”与多变量网络中的 y_train/y_test 并行了)。这也解决了图形上的困惑。
这里,“center”(中心)指的是属于某个类的样本的**人工簇中心**。
我需要创建 data.pkl 和 label.pkl 文件,其中包含一些图像的数据和标签。
如何从图像数据集中创建 data 和 label.pkl?
也许加载数据为 numpy 数组,然后使用 numpy 的 save() 函数保存 numpy 数组,而不是使用 pickle?
谢谢 Jason,感谢这篇精彩的教程!
它帮助我找到了 sklearn 中的一个模块,名为“datasets.make_regression”。
我目前正在尝试理解 PCA 的工作原理,需要创建比特征本身维度更高的一些模拟数据。
在“datasets.make_regression”中,“n_feature”参数很容易理解,但“n_informative”让我感到困惑。
我希望我的(初始)数据包含比实际特征更多的特征列,我尝试了以下方法:
对于 n_informative > n_feature,我得到 X.shape 为 (n, n_feature),其中 n 是样本点的总数。
然后,稍后我可能想执行 PCA 来降低维度,这似乎是可以处理的(比如)。
我想问的问题是如何获得 X.shape 为 (n, n_informative)?
“n_informative”参数控制着有多少输入参数是真实的或有助于结果的。
听起来您可能想将 n_informative 设置为您数据集的维度数。
为什么使用 n_features?
它指定了我们希望在问题中拥有的变量数量,例如输入变量。
你好,
我被要求对基因表达数据使用 K-Means 算法进行聚类,并被要求提供聚类结果。请给我答案。
抱歉,目前我还没有关于聚类的教程。
你好 Jason,有什么方法可以生成只有整数值而不是浮点值的测试数据吗?我正在尝试但找不到方法。任何帮助都将不胜感激。谢谢。
您可能需要实现一个新过程来生成具有整数值的 数据集。