7.4. 加载其他数据集#

7.4.1. 示例图像#

Scikit-learn 还嵌入了一些由作者在 Creative Commons 许可下发布的示例 JPEG 图像。这些图像可用于在 2D 数据上测试算法和管道。

load_sample_images()

加载用于图像操作的示例图像。

load_sample_image(image_name)

加载单个示例图像的 numpy 数组。

../_images/sphx_glr_plot_color_quantization_001.png

警告

图像的默认编码基于 uint8 数据类型以节省内存。通常,如果输入首先转换为浮点表示,机器学习算法的效果最佳。此外,如果您计划使用 matplotlib.pyplpt.imshow,请不要忘记按以下示例中的方式将其缩放到 0 到 1 的范围内。

示例

7.4.2. svmlight / libsvm 格式的数据集#

scikit-learn 包含用于加载 svmlight / libsvm 格式数据集的实用程序函数。在此格式中,每行采用 <label> <feature-id>:<feature-value> <feature-id>:<feature-value> ... 的形式。此格式特别适合稀疏数据集。在此模块中,scipy 稀疏 CSR 矩阵用于 X,而 numpy 数组用于 y

您可以像下面这样加载数据集

>>> from sklearn.datasets import load_svmlight_file
>>> X_train, y_train = load_svmlight_file("/path/to/train_dataset.txt")
...                                                         

您也可以同时加载两个(或更多)数据集

>>> X_train, y_train, X_test, y_test = load_svmlight_files(
...     ("/path/to/train_dataset.txt", "/path/to/test_dataset.txt"))
...                                                         

在这种情况下,X_trainX_test 保证具有相同数量的特征。另一种实现相同结果的方法是固定特征数量

>>> X_test, y_test = load_svmlight_file(
...     "/path/to/test_dataset.txt", n_features=X_train.shape[1])
...                                                         

相关链接

7.4.3. 从 openml.org 存储库下载数据集#

openml.org 是一个用于机器学习数据和实验的公共存储库,允许每个人上传开放数据集。

sklearn.datasets 包可以使用函数 sklearn.datasets.fetch_openml 从存储库下载数据集。

例如,要下载小鼠大脑中基因表达的数据集

>>> from sklearn.datasets import fetch_openml
>>> mice = fetch_openml(name='miceprotein', version=4)

要完全指定数据集,您需要提供名称和版本,尽管版本是可选的,请参见下面的 数据集版本。数据集包含总共 1080 个示例,属于 8 个不同的类别

>>> mice.data.shape
(1080, 77)
>>> mice.target.shape
(1080,)
>>> np.unique(mice.target)
array(['c-CS-m', 'c-CS-s', 'c-SC-m', 'c-SC-s', 't-CS-m', 't-CS-s', 't-SC-m', 't-SC-s'], dtype=object)

您可以通过查看 DESCRdetails 属性来获取有关数据集的更多信息

>>> print(mice.DESCR) 
**Author**: Clara Higuera, Katheleen J. Gardiner, Krzysztof J. Cios
**Source**: [UCI](https://archive.ics.uci.edu/ml/datasets/Mice+Protein+Expression) - 2015
**Please cite**: Higuera C, Gardiner KJ, Cios KJ (2015) Self-Organizing
Feature Maps Identify Proteins Critical to Learning in a Mouse Model of Down
Syndrome. PLoS ONE 10(6): e0129126...

>>> mice.details 
{'id': '40966', 'name': 'MiceProtein', 'version': '4', 'format': 'ARFF',
'upload_date': '2017-11-08T16:00:15', 'licence': 'Public',
'url': 'https://www.openml.org/data/v1/download/17928620/MiceProtein.arff',
'file_id': '17928620', 'default_target_attribute': 'class',
'row_id_attribute': 'MouseID',
'ignore_attribute': ['Genotype', 'Treatment', 'Behavior'],
'tag': ['OpenML-CC18', 'study_135', 'study_98', 'study_99'],
'visibility': 'public', 'status': 'active',
'md5_checksum': '3c479a6885bfa0438971388283a1ce32'}

DESCR 包含对数据的自由文本描述,而 details 包含由 openml 存储的元数据的字典,例如数据集 ID。有关更多详细信息,请参阅 OpenML 文档data_id 为 40966 的 mice protein 数据集,您可以使用它(或名称)在 openml 网站上获取有关数据集的更多信息。

>>> mice.url
'https://www.openml.org/d/40966'

data_id 还可以唯一地标识 OpenML 中的数据集。

>>> mice = fetch_openml(data_id=40966)
>>> mice.details 
{'id': '4550', 'name': 'MiceProtein', 'version': '1', 'format': 'ARFF',
'creator': ...,
'upload_date': '2016-02-17T14:32:49', 'licence': 'Public', 'url':
'https://www.openml.org/data/v1/download/1804243/MiceProtein.ARFF', 'file_id':
'1804243', 'default_target_attribute': 'class', 'citation': 'Higuera C,
Gardiner KJ, Cios KJ (2015) Self-Organizing Feature Maps Identify Proteins
Critical to Learning in a Mouse Model of Down Syndrome. PLoS ONE 10(6):
e0129126. [Web Link] journal.pone.0129126', 'tag': ['OpenML100', 'study_14',
'study_34'], 'visibility': 'public', 'status': 'active', 'md5_checksum':
'3c479a6885bfa0438971388283a1ce32'}

7.4.3.1. 数据集版本#

数据集由其 data_id 唯一指定,但不一定由其名称唯一指定。具有相同名称的多个不同“版本”的数据集可以存在,它们可能包含完全不同的数据集。如果发现数据集的特定版本包含重大问题,则可能会将其停用。使用名称指定数据集将产生仍然处于活动状态的该数据集的第一个版本。这意味着 fetch_openml(name="miceprotein") 在不同时间可能会产生不同的结果,如果早期版本变得不活跃。您可以看到,我们上面获取的 data_id 为 40966 的数据集是“miceprotein”数据集的第一个版本。

>>> mice.details['version']  
'1'

事实上,该数据集只有一个版本。另一方面,iris 数据集有多个版本。

>>> iris = fetch_openml(name="iris")
>>> iris.details['version']  
'1'
>>> iris.details['id']  
'61'

>>> iris_61 = fetch_openml(data_id=61)
>>> iris_61.details['version']
'1'
>>> iris_61.details['id']
'61'

>>> iris_969 = fetch_openml(data_id=969)
>>> iris_969.details['version']
'3'
>>> iris_969.details['id']
'969'

通过名称“iris”指定数据集将产生最低版本,版本 1,其 data_id 为 61。为了确保您始终获得此确切的数据集,最安全的方法是通过数据集 data_id 指定它。另一个数据集,其 data_id 为 969,是版本 3(版本 2 已停用),并且包含数据的二进制版本。

>>> np.unique(iris_969.target)
array(['N', 'P'], dtype=object)

您还可以同时指定名称和版本,这也将唯一地标识数据集。

>>> iris_version_3 = fetch_openml(name="iris", version=3)
>>> iris_version_3.details['version']
'3'
>>> iris_version_3.details['id']
'969'

参考文献

7.4.3.2. ARFF 解析器#

从 1.2 版本开始,scikit-learn 提供了一个新的关键字参数 parser,它提供了多种选项来解析 OpenML 提供的 ARFF 文件。传统解析器(即 parser="liac-arff")基于项目 LIAC-ARFF。但是,此解析器速度很慢,并且消耗的内存比所需的多。一个基于 pandas 的新解析器(即 parser="pandas")既更快又更节省内存。但是,此解析器不支持稀疏数据。因此,我们建议使用 parser="auto",它将使用可用于请求数据集的最佳解析器。

"pandas""liac-arff" 解析器可能会导致输出中的数据类型不同。显着差异如下:

  • "liac-arff" 解析器始终将分类特征编码为 str 对象。相反,"pandas" 解析器在读取时推断类型,并且只要有可能,数值类别将被转换为整数。

  • "liac-arff" 解析器使用 float64 来编码元数据中标记为“REAL”和“NUMERICAL”的数值特征。相反,"pandas" 解析器推断这些数值特征是否对应于整数,并使用 pandas 的 Integer 扩展 dtype。

  • 特别是,使用整数类别进行分类的数据集通常使用 "pandas" 解析器加载为 (0, 1, ...),而 "liac-arff" 将强制使用字符串编码的类标签,例如 "0""1" 等等。

  • "pandas" 解析器不会从字符串列中删除单引号 - 即 '。例如,字符串 'my string' 将保持原样,而 "liac-arff" 解析器将删除单引号。对于分类列,将从值中删除单引号。

此外,当使用 as_frame=False 时,"liac-arff" 解析器返回按序编码的数据,其中类别在 Bunch 实例的属性 categories 中提供。相反,"pandas" 返回一个 NumPy 数组,其中包含类别。然后,用户需要设计一个特征工程管道,其中包含 OneHotEncoderOrdinalEncoder 的实例,通常包装在 ColumnTransformer 中,以显式地预处理分类列。例如,请参阅:具有混合类型的列转换器

7.4.4. 从外部数据集加载#

scikit-learn 处理存储为 numpy 数组或 scipy 稀疏矩阵的任何数值数据。其他可以转换为数值数组的类型,例如 pandas DataFrame,也是可以接受的。

以下是一些将标准列数据加载到 scikit-learn 可用格式中的推荐方法:

  • pandas.io 提供工具来从常见格式(包括 CSV、Excel、JSON 和 SQL)读取数据。DataFrame 也可以从元组列表或字典列表构建。Pandas 能够平滑地处理异构数据,并提供工具来进行操作和转换为适合 scikit-learn 的数值数组。

  • scipy.io 专注于科学计算环境中常用的二进制格式,例如 .mat 和 .arff。

  • numpy/routines.io 用于将标准列数据加载到 numpy 数组中。

  • scikit-learn 的 load_svmlight_file 用于 svmlight 或 libSVM 稀疏格式。

  • scikit-learn 的 load_files 用于文本文件目录,其中每个目录的名称是每个类别的名称,每个目录内的每个文件对应于该类别的一个样本。

对于一些杂项数据,例如图像、视频和音频,您可能希望参考:

存储为字符串的分类(或名义)特征(在 pandas DataFrame 中很常见)需要使用 OneHotEncoderOrdinalEncoder 或类似方法转换为数值特征。请参阅 预处理数据

注意:如果您管理自己的数值数据,建议使用优化的文件格式,例如 HDF5,以减少数据加载时间。各种库,例如 H5Py、PyTables 和 pandas,提供了用于读取和写入该格式数据的 Python 接口。