7.4. 載入其他資料集#

7.4.1. 範例圖片#

Scikit-learn 也內嵌了一些由其作者以創用 CC 授權發布的範例 JPEG 圖片。這些圖片可用於在 2D 資料上測試演算法和管線。

load_sample_images()

載入用於影像處理的範例圖片。

load_sample_image(image_name)

載入單個範例圖片的 numpy 陣列。

../_images/loading_other_datasets-1.png

警告

影像的預設編碼是基於 uint8 dtype 以節省記憶體。通常,如果先將輸入轉換為浮點數表示,機器學習演算法效果最佳。此外,如果您計劃使用 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)

要完全指定資料集,您需要提供名稱和版本,儘管版本是可選的,請參閱下方的 資料集版本。該資料集總共包含屬於 8 個不同類別的 1080 個範例

>>> 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,您可以使用此 ID(或名稱)在 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 DataFrames 中很常見)需要使用 OneHotEncoderOrdinalEncoder 或類似方法轉換為數值特徵。 請參閱 資料預處理

注意:如果您管理自己的數值資料,建議使用最佳化的檔案格式(例如 HDF5)以減少資料載入時間。 各種程式庫,例如 H5Py、PyTables 和 pandas,都提供了以該格式讀取和寫入資料的 Python 介面。