7.4. 載入其他資料集#
7.4.1. 範例圖片#
Scikit-learn 也內嵌了一些由其作者以創用 CC 授權發布的範例 JPEG 圖片。這些圖片可用於在 2D 資料上測試演算法和管線。
載入用於影像處理的範例圖片。 |
|
|
載入單個範例圖片的 numpy 陣列。 |

警告
影像的預設編碼是基於 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_train
和 X_test
具有相同數量的特徵。實現相同結果的另一種方法是固定特徵數量
>>> X_test, y_test = load_svmlight_file(
... "/path/to/test_dataset.txt", n_features=X_train.shape[1])
...
相關連結
svmlight / libsvm 格式的公開資料集
: https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets更快的相容 API 實作
: mblondel/svmlight-loader
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)
您可以透過查看 DESCR
和 details
屬性來取得有關資料集的更多資訊
>>> 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 陣列,其中包含類別。 然後,由使用者設計一個特徵工程管道,通常使用 OneHotEncoder
或 OrdinalEncoder
的實例包裝在 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
用於文字檔案目錄,其中每個目錄的名稱是每個類別的名稱,而每個目錄內的每個檔案都對應到該類別的一個樣本。
對於某些雜項資料,例如圖像、影片和音訊,您可能需要參考:
skimage.io 或 Imageio 用於將圖像和影片載入到 numpy 陣列中。
scipy.io.wavfile.read 用於將 WAV 檔案讀取到 numpy 陣列中。
以字串形式儲存的類別(或名義)特徵(在 pandas DataFrames 中很常見)需要使用 OneHotEncoder
或 OrdinalEncoder
或類似方法轉換為數值特徵。 請參閱 資料預處理。
注意:如果您管理自己的數值資料,建議使用最佳化的檔案格式(例如 HDF5)以減少資料載入時間。 各種程式庫,例如 H5Py、PyTables 和 pandas,都提供了以該格式讀取和寫入資料的 Python 介面。