8.4. 加载其他数据集#

8.4.1. 样本图像#

Scikit-learn还嵌入了作者根据知识共享许可发布的几张JPEG示例图像。这些图像对于测试2D数据上的算法和管道很有用。

load_sample_images ()

加载示例图像以进行图像处理。

load_sample_image(image_name)

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

../_images/loading_other_datasets-1.png

警告

图像的默认编码基于 uint8 dtype到备用内存。通常,如果首先将输入转换为浮点表示,机器学习算法的效果最好。此外,如果您计划使用 matplotlib.pyplot.imshow ,不要忘记按照下面的例子缩放到范围0 - 1。

8.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])
...

相关链接

8.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 documentationdata_id 小鼠蛋白质数据集的40966,您可以使用此(或名称)在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'}

8.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'

引用

8.4.3.2. ARFF解析器#

从1.2版本开始,scikit-learn提供了一个新的关键字参数 parser that provides several options to parse the ARFF files provided by OpenML. The legacy parser (i.e. parser="liac-arff") is based on the project LIAC-ARFF .然而,该解析器速度很慢,并且消耗的内存比所需的要多。基于pandas的新解析器(即 parser="pandas" )速度更快,内存效率更高。然而,此解析器不支持稀疏数据。因此,我们建议使用 parser="auto" 它将使用可用于请求的数据集的最佳解析器。

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

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

  • "liac-arff" 解析器使用float 64对元数据中标记为“REAL”和“NUMERIAL”的数字特征进行编码。的 "pandas" 解析器会推断这些数字特征是否对应于integer,并使用pandas的RST扩展dype。

  • 特别是,具有整类类别的分类数据集通常会这样加载 (0, 1, ...)"pandas" 解析器, "liac-arff" 将强制使用字符串编码的类标签,例如 "0" , "1"

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

另外当 as_frame=False 使用时 "liac-arff" 解析器返回有序编码的数据,其中类别在属性中提供 categoriesBunch instance.相反, "pandas" 返回NumPy数组是类别。然后由用户设计具有实例的功能工程管道 OneHotEncoderOrdinalEncoder 通常包裹在 ColumnTransformer 显式预处理分类列。例如,见: 混合类型的列Transformer .

8.4.4. 从外部数据集加载#

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

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

  • pandas.io 提供了从常见格式(包括CSV、Excel、JSON和SQL)读取数据的工具。数据帧也可以从元组或字典的列表中构造。Pandas可以流畅地处理异构数据,并提供了操作和转换成适合scikit-learn的数字数组的工具。

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

  • numpy/routines.io 用于将列数据标准加载到麻木的阵列中

  • scikit-learn的 load_svmlight_file 对于svmlight或libSVM稀疏格式,

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

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

以字符串形式存储的分类(或名义)要素(在pandas DataFrames中很常见)需要使用 OneHotEncoderOrdinalEncoder 或类似的。看到 预处理数据 .

注意:如果您管理自己的数字数据,建议使用经过优化的文件格式(例如HDF5)来减少数据加载时间。H5 Py、PyTables和pandas等各种库提供了Python接口,用于以该格式读写数据。