7.2. 真實世界資料集#
scikit-learn 提供了載入較大型資料集的工具,必要時會下載它們。
可以使用以下函數載入它們
|
從 AT&T 載入 Olivetti 人臉資料集(分類)。 |
|
從 20 個新聞群組資料集載入檔案名稱和資料(分類)。 |
|
載入並向量化 20 個新聞群組資料集(分類)。 |
|
載入「野外標記人臉」(LFW)人臉資料集(分類)。 |
|
載入「野外標記人臉」(LFW)配對資料集(分類)。 |
|
載入 covertype 資料集(分類)。 |
|
載入 RCV1 多標籤資料集(分類)。 |
|
載入 kddcup99 資料集(分類)。 |
|
載入加州房價資料集(迴歸)。 |
|
從 Phillips 等人載入物種分布資料集的載入器。 |
7.2.1. Olivetti 人臉資料集#
此資料集包含一組在 1992 年 4 月至 1994 年 4 月之間於 AT&T 劍橋實驗室拍攝的人臉影像。「sklearn.datasets.fetch_olivetti_faces
」函數是從 AT&T 下載資料封存檔的資料提取/快取函數。
如原始網站所述
有 40 個不同受試者每人十張不同的影像。對於某些受試者,影像是在不同時間拍攝的,光線、臉部表情(張開/閉上眼睛、微笑/不微笑)和臉部細節(眼鏡/不戴眼鏡)都不同。所有影像都是在深色均勻背景下拍攝的,受試者處於直立、正面位置(允許一些側向移動)。
資料集特性
類別 |
40 |
總樣本數 |
400 |
維度 |
4096 |
特徵 |
實數,介於 0 和 1 之間 |
影像被量化為 256 個灰階,並儲存為無符號 8 位元整數;載入器會將這些轉換為 [0, 1] 區間上的浮點數值,這對於許多演算法來說更容易使用。
此資料庫的「目標」是從 0 到 39 的整數,表示所描繪人員的身分;但是,每個類別只有 10 個範例,因此從非監督或半監督的角度來看,這個相對較小的資料集更有趣。
原始資料集由 92 x 112 組成,而此處提供的版本由 64x64 影像組成。
使用這些影像時,請註明 AT&T 劍橋實驗室的功勞。
7.2.2. 20 個新聞群組文字資料集#
20 個新聞群組資料集包含約 18000 個關於 20 個主題的新聞群組貼文,分為兩個子集:一個用於訓練(或開發),另一個用於測試(或效能評估)。訓練集和測試集之間的劃分是基於在特定日期之前和之後發佈的訊息。
此模組包含兩個載入器。第一個載入器「sklearn.datasets.fetch_20newsgroups
」會傳回原始文字的清單,這些文字可以輸入到文字特徵提取器(例如具有自訂參數的「CountVectorizer
」),以提取特徵向量。第二個載入器「sklearn.datasets.fetch_20newsgroups_vectorized
」會傳回可立即使用的特徵,也就是說,不需要使用特徵提取器。
資料集特性
類別 |
20 |
總樣本數 |
18846 |
維度 |
1 |
特徵 |
文字 |
用法#
「sklearn.datasets.fetch_20newsgroups
」函數是一個資料提取/快取函數,會從原始的 20 個新聞群組網站下載資料封存檔,並將封存檔內容解壓縮到「~/scikit_learn_data/20news_home
」資料夾中,並在訓練集或測試集資料夾(或兩者)上呼叫「sklearn.datasets.load_files
」。
>>> from sklearn.datasets import fetch_20newsgroups
>>> newsgroups_train = fetch_20newsgroups(subset='train')
>>> from pprint import pprint
>>> pprint(list(newsgroups_train.target_names))
['alt.atheism',
'comp.graphics',
'comp.os.ms-windows.misc',
'comp.sys.ibm.pc.hardware',
'comp.sys.mac.hardware',
'comp.windows.x',
'misc.forsale',
'rec.autos',
'rec.motorcycles',
'rec.sport.baseball',
'rec.sport.hockey',
'sci.crypt',
'sci.electronics',
'sci.med',
'sci.space',
'soc.religion.christian',
'talk.politics.guns',
'talk.politics.mideast',
'talk.politics.misc',
'talk.religion.misc']
實際資料位於「filenames
」和「target
」屬性中。「target」屬性是類別的整數索引。
>>> newsgroups_train.filenames.shape
(11314,)
>>> newsgroups_train.target.shape
(11314,)
>>> newsgroups_train.target[:10]
array([ 7, 4, 4, 1, 14, 16, 13, 3, 2, 4])
可以透過將要載入的類別清單傳遞給「sklearn.datasets.fetch_20newsgroups
」函數,來僅載入類別的子選擇。
>>> cats = ['alt.atheism', 'sci.space']
>>> newsgroups_train = fetch_20newsgroups(subset='train', categories=cats)
>>> list(newsgroups_train.target_names)
['alt.atheism', 'sci.space']
>>> newsgroups_train.filenames.shape
(1073,)
>>> newsgroups_train.target.shape
(1073,)
>>> newsgroups_train.target[:10]
array([0, 1, 1, 1, 0, 1, 1, 0, 0, 0])
將文字轉換為向量#
為了將文字資料輸入到預測或分群模型中,首先需要將文字轉換為適合統計分析的數值向量。這可以使用「sklearn.feature_extraction.text
」的工具來達成,如下列範例所示,該範例從 20news 的子集提取單字元的 TF-IDF 向量。
>>> from sklearn.feature_extraction.text import TfidfVectorizer
>>> categories = ['alt.atheism', 'talk.religion.misc',
... 'comp.graphics', 'sci.space']
>>> newsgroups_train = fetch_20newsgroups(subset='train',
... categories=categories)
>>> vectorizer = TfidfVectorizer()
>>> vectors = vectorizer.fit_transform(newsgroups_train.data)
>>> vectors.shape
(2034, 34118)
提取的 TF-IDF 向量非常稀疏,在超過 30000 維的空間中,每個樣本平均有 159 個非零分量(少於 0.5% 的非零特徵)。
>>> vectors.nnz / float(vectors.shape[0])
159.01327...
「sklearn.datasets.fetch_20newsgroups_vectorized
」是一個函數,會傳回可立即使用的權杖計數特徵,而不是檔案名稱。
過濾文本以進行更真實的訓練#
對於分類器來說,很容易在 20 個新聞群組資料中出現的特定事物上過度擬合,例如新聞群組標頭。許多分類器實現了非常高的 F 分數,但它們的結果無法推廣到不屬於這個時間窗口的其他文件。
例如,讓我們看看多項式樸素貝葉斯分類器的結果,該分類器訓練速度很快並且取得了不錯的 F 分數
>>> from sklearn.naive_bayes import MultinomialNB
>>> from sklearn import metrics
>>> newsgroups_test = fetch_20newsgroups(subset='test',
... categories=categories)
>>> vectors_test = vectorizer.transform(newsgroups_test.data)
>>> clf = MultinomialNB(alpha=.01)
>>> clf.fit(vectors, newsgroups_train.target)
MultinomialNB(alpha=0.01, class_prior=None, fit_prior=True)
>>> pred = clf.predict(vectors_test)
>>> metrics.f1_score(newsgroups_test.target, pred, average='macro')
0.88213...
(使用稀疏特徵對文本文件進行分類的範例會對訓練和測試資料進行洗牌,而不是按時間分段,在這種情況下,多項式樸素貝葉斯會獲得更高的 F 分數 0.88。您是否對這個分類器內部發生的事情感到懷疑?)
讓我們看看最具資訊量的特徵是什麼
>>> import numpy as np
>>> def show_top10(classifier, vectorizer, categories):
... feature_names = vectorizer.get_feature_names_out()
... for i, category in enumerate(categories):
... top10 = np.argsort(classifier.coef_[i])[-10:]
... print("%s: %s" % (category, " ".join(feature_names[top10])))
...
>>> show_top10(clf, vectorizer, newsgroups_train.target_names)
alt.atheism: edu it and in you that is of to the
comp.graphics: edu in graphics it is for and of to the
sci.space: edu it that is in and space to of the
talk.religion.misc: not it you in is that and to of the
您現在可以看到這些特徵過度擬合的許多事物
幾乎每個群組都根據諸如
NNTP-Posting-Host:
和Distribution:
等標頭出現的頻率高低來區分。另一個重要的特徵是發送者是否與大學有關,這可以通過他們的標頭或簽名來判斷。
單詞 “article” 是一個重要的特徵,它基於人們引用先前貼文的頻率,例如:“在文章 [文章 ID] 中,[名稱] <[電子郵件地址]> 寫道:”
其他特徵與當時發文的特定人士的姓名和電子郵件地址相符。
由於有如此豐富的線索可以區分新聞群組,分類器幾乎不必從文本中識別主題,而且它們的表現都處於相同的高水平。
因此,載入 20 個新聞群組資料的函式提供了一個名為 **remove** 的參數,告知它要從每個文件中去除哪些類型的資訊。**remove** 應該是一個包含 ('headers', 'footers', 'quotes')
的任何子集的元組,告知它分別移除標頭、簽名區塊和引言區塊。
>>> newsgroups_test = fetch_20newsgroups(subset='test',
... remove=('headers', 'footers', 'quotes'),
... categories=categories)
>>> vectors_test = vectorizer.transform(newsgroups_test.data)
>>> pred = clf.predict(vectors_test)
>>> metrics.f1_score(pred, newsgroups_test.target, average='macro')
0.77310...
這個分類器損失了很多 F 分數,僅僅因為我們移除了與主題分類關係不大的元資料。如果我們也從訓練資料中刪除這些元資料,它會損失更多。
>>> newsgroups_train = fetch_20newsgroups(subset='train',
... remove=('headers', 'footers', 'quotes'),
... categories=categories)
>>> vectors = vectorizer.fit_transform(newsgroups_train.data)
>>> clf = MultinomialNB(alpha=.01)
>>> clf.fit(vectors, newsgroups_train.target)
MultinomialNB(alpha=0.01, class_prior=None, fit_prior=True)
>>> vectors_test = vectorizer.transform(newsgroups_test.data)
>>> pred = clf.predict(vectors_test)
>>> metrics.f1_score(newsgroups_test.target, pred, average='macro')
0.76995...
其他一些分類器可以更好地應對這個更困難的任務。試試看有或沒有 remove
選項的文本特徵提取和評估的範例管道範例,以比較結果。
資料注意事項
克里夫蘭印地安人隊是位於美國俄亥俄州克里夫蘭的主要聯盟棒球隊。2020 年 12 月,據報導,「在喬治·佛洛伊德去世以及全國對種族和殖民主義的反思引發幾個月的討論後,克里夫蘭印地安人隊已決定更改隊名。」球隊老闆保羅·多蘭「明確表示,球隊不會將其非正式暱稱「部落」(Tribe)作為新的隊名。」多蘭說:「這不會是與印地安人隊相差一半的名稱。」「我們不會採用以美洲原住民為主題的名稱。」
https://www.mlb.com/news/cleveland-indians-team-name-change
建議
在 20 個新聞群組資料上評估文本分類器時,您應該刪除與新聞群組相關的元資料。在 scikit-learn 中,您可以通過設定
remove=('headers', 'footers', 'quotes')
來完成此操作。F 分數會較低,因為它更真實。此文本資料集包含可能不適合某些 NLP 應用程式的資料。上面的「資料注意事項」部分列出了一個範例。目前在 NLP 中使用文本資料集進行句子補全、分群和其他應用程式等任務所面臨的挑戰是,具有文化偏見和煽動性的文本會傳播偏見。在使用資料集、審查輸出時應考慮到這一點,並應記錄偏見。
範例
7.2.3. 野外標記人臉辨識資料集#
此資料集是透過網際網路收集的名人 JPEG 圖片的集合,所有詳細資訊均可在官方網站上找到
http://vis-www.cs.umass.edu/lfw/
每張圖片都以單一人臉為中心。典型的任務稱為人臉驗證:給定一對圖片,二元分類器必須預測這兩張圖片是否來自同一個人。
另一個任務人臉辨識或人臉識別是:給定一個不知名人士的人臉圖片,通過參考先前看過的已識別人士的圖片庫來識別該人士的姓名。
人臉驗證和人臉辨識都是通常在經過訓練以執行人臉偵測的模型輸出上執行的任務。最受歡迎的人臉偵測模型稱為 Viola-Jones,並在 OpenCV 程式庫中實現。LFW 人臉是通過此人臉偵測器從各種線上網站提取的。
資料集特性
類別 |
5749 |
總樣本數 |
13233 |
維度 |
5828 |
特徵 |
實數,介於 0 和 255 之間 |
用法#
scikit-learn
提供兩個載入器,它們會自動下載、快取、解析元資料檔案、解碼 jpeg 並將有趣的切片轉換為記憶體對應的 numpy 陣列。此資料集的大小超過 200 MB。第一次載入通常需要幾分鐘以上的時間才能將 JPEG 檔案的相關部分完全解碼為 numpy 陣列。如果資料集已載入過一次,則後續的載入時間會少於 200 毫秒,方法是在 ~/scikit_learn_data/lfw_home/
資料夾中使用 joblib
在磁碟上記憶體對應的版本。
第一個載入器用於人臉辨識任務:多類別分類任務(因此屬於監督式學習)
>>> from sklearn.datasets import fetch_lfw_people
>>> lfw_people = fetch_lfw_people(min_faces_per_person=70, resize=0.4)
>>> for name in lfw_people.target_names:
... print(name)
...
Ariel Sharon
Colin Powell
Donald Rumsfeld
George W Bush
Gerhard Schroeder
Hugo Chavez
Tony Blair
預設的切片是人臉周圍的矩形形狀,移除大部分背景
>>> lfw_people.data.dtype
dtype('float32')
>>> lfw_people.data.shape
(1288, 1850)
>>> lfw_people.images.shape
(1288, 50, 37)
在 target
陣列中,1140
張人臉中的每一張都被分配給一個單一的人員 ID
>>> lfw_people.target.shape
(1288,)
>>> list(lfw_people.target[:10])
[5, 6, 3, 1, 0, 1, 3, 4, 3, 0]
第二個載入器通常用於人臉驗證任務:每個樣本都是一對屬於或不屬於同一個人的兩張圖片
>>> from sklearn.datasets import fetch_lfw_pairs
>>> lfw_pairs_train = fetch_lfw_pairs(subset='train')
>>> list(lfw_pairs_train.target_names)
['Different persons', 'Same person']
>>> lfw_pairs_train.pairs.shape
(2200, 2, 62, 47)
>>> lfw_pairs_train.data.shape
(2200, 5828)
>>> lfw_pairs_train.target.shape
(2200,)
對於sklearn.datasets.fetch_lfw_people
和 sklearn.datasets.fetch_lfw_pairs
函式,都可以通過傳遞 color=True
來獲得帶有 RGB 色彩通道的額外維度,在這種情況下,形狀將為 (2200, 2, 62, 47, 3)
。
sklearn.datasets.fetch_lfw_pairs
資料集分為 3 個子集:開發 train
集、開發 test
集和評估 10_folds
集,旨在通過 10 倍交叉驗證方案計算效能指標。
參考文獻
野外標記人臉:用於研究無約束環境中人臉辨識的資料庫。 Gary B. Huang、Manu Ramesh、Tamara Berg 和 Erik Learned-Miller。美國麻薩諸塞州大學阿默斯特分校,技術報告 07-49,2007 年 10 月。
範例
7.2.4. 森林覆蓋類型#
此資料集中的樣本對應於美國的 30×30 公尺森林區域,收集這些資料是為了預測每個區域的覆蓋類型,即主要的樹種。共有七種覆蓋類型,這使其成為一個多類別分類問題。每個樣本有 54 個特徵,這些特徵在資料集的主頁上描述。某些特徵是布林指標,而其他特徵是離散或連續的測量值。
資料集特性
類別 |
7 |
總樣本數 |
581012 |
維度 |
54 |
特徵 |
整數 |
sklearn.datasets.fetch_covtype
將載入覆蓋類型資料集;它會傳回一個類似字典的 'Bunch' 物件,其中在 data
成員中包含特徵矩陣,在 target
中包含目標值。如果選擇性引數 'as_frame' 設定為 'True',則它會傳回作為 pandas 資料框架的 data
和 target
,並且還會有一個額外的成員 frame
。如有必要,資料集將從網路上下載。
7.2.5. RCV1 資料集#
路透社新聞語料庫第一卷 (RCV1) 是路透社有限公司為研究目的提供的超過 800,000 則手動分類的新聞報導的檔案。該資料集在 [1] 中進行了廣泛的描述。
資料集特性
類別 |
103 |
總樣本數 |
804414 |
維度 |
47236 |
特徵 |
實數,介於 0 和 1 之間 |
sklearn.datasets.fetch_rcv1
將載入以下版本:RCV1-v2、向量、完整集合、主題多重標籤
>>> from sklearn.datasets import fetch_rcv1
>>> rcv1 = fetch_rcv1()
它會傳回一個類似字典的物件,具有以下屬性
data
:特徵矩陣是一個 SciPy CSR 稀疏矩陣,具有 804414 個樣本和 47236 個特徵。非零值包含餘弦歸一化、對數 TF-IDF 向量。在 [1] 中提出了一個近乎時間順序的分割:前 23149 個樣本是訓練集。最後 781265 個樣本是測試集。這遵循官方 LYRL2004 時間順序分割。陣列的非零值佔 0.16%
>>> rcv1.data.shape
(804414, 47236)
target
:目標值儲存在一個 SciPy CSR 稀疏矩陣中,具有 804414 個樣本和 103 個類別。每個樣本在其類別中的值為 1,在其他類別中的值為 0。陣列的非零值佔 3.15%
>>> rcv1.target.shape
(804414, 103)
sample_id
:每個樣本都可以通過其 ID 識別,範圍從 2286 到 810596(有間隙)
>>> rcv1.sample_id[:3]
array([2286, 2287, 2288], dtype=uint32)
target_names
:目標值是每個樣本的主題。每個樣本至少屬於一個主題,最多屬於 17 個主題。共有 103 個主題,每個主題都由一個字符串表示。它們的語料庫頻率跨越五個數量級,從 ‘GMIL’ 的 5 次出現到 ‘CCAT’ 的 381327 次出現
>>> rcv1.target_names[:3].tolist()
['E11', 'ECAT', 'M11']
如有必要,數據集將從 rcv1 首頁下載。壓縮大小約為 656 MB。
參考文獻
7.2.6. Kddcup 99 數據集#
KDD Cup ‘99 數據集是通過處理 MIT Lincoln Lab 創建的 1998 DARPA 入侵檢測系統 (IDS) 評估數據集的 tcpdump 部分而創建的 [2]。人工數據(在 數據集首頁 上描述)是使用封閉網路和手工注入攻擊生成的,目的是產生大量不同類型的攻擊,並在背景中包含正常活動。由於最初的目標是為監督式學習演算法產生一個大型訓練集,因此異常數據的比例很高 (80.1%),這在現實世界中是不切實際的,也不適合旨在檢測「異常」數據的非監督式異常檢測,即
與正常數據在質量上不同的數據
在觀察值中佔少數。
因此,我們將 KDD 數據集轉換為兩個不同的數據集:SA 和 SF。
SA 的獲得方式是簡單地選擇所有正常數據,以及一小部分異常數據,使異常比例為 1%。
SF 的獲得方式與 [3] 中一樣,簡單地挑選屬性 logged_in 為正值的數據,從而專注於入侵攻擊,這使得攻擊比例為 0.3%。
http 和 smtp 是 SF 的兩個子集,分別對應於第三個特徵等於 ‘http’(分別等於 ‘smtp’)。
一般 KDD 結構
總樣本數 |
4898431 |
維度 |
41 |
特徵 |
離散 (int) 或連續 (float) |
目標 |
str,‘normal.’ 或異常類型名稱 |
SA 結構
總樣本數 |
976158 |
維度 |
41 |
特徵 |
離散 (int) 或連續 (float) |
目標 |
str,‘normal.’ 或異常類型名稱 |
SF 結構
總樣本數 |
699691 |
維度 |
4 |
特徵 |
離散 (int) 或連續 (float) |
目標 |
str,‘normal.’ 或異常類型名稱 |
http 結構
總樣本數 |
619052 |
維度 |
3 |
特徵 |
離散 (int) 或連續 (float) |
目標 |
str,‘normal.’ 或異常類型名稱 |
smtp 結構
總樣本數 |
95373 |
維度 |
3 |
特徵 |
離散 (int) 或連續 (float) |
目標 |
str,‘normal.’ 或異常類型名稱 |
sklearn.datasets.fetch_kddcup99
將載入 kddcup99 數據集;它返回一個類似字典的對象,其中特徵矩陣位於 data
成員中,目標值位於 target
中。「as_frame」可選參數將 data
轉換為 pandas DataFrame,並將 target
轉換為 pandas Series。如有必要,數據集將從網路上下載。
參考文獻
Analysis and Results of the 1999 DARPA Off-Line Intrusion Detection Evaluation, Richard Lippmann, Joshua W. Haines, David J. Fried, Jonathan Korba, Kumar Das.
K. Yamanishi, J.-I. Takeuchi, G. Williams, and P. Milne. Online unsupervised outlier detection using finite mixtures with discounting learning algorithms. In Proceedings of the sixth ACM SIGKDD international conference on Knowledge discovery and data mining, pages 320-324. ACM Press, 2000.
7.2.7. 加州住房數據集#
資料集特性
- 實例數量:
20640
- 屬性數量:
8 個數值型、預測性屬性和目標
- 屬性資訊:
MedInc 區塊群組的中位數收入
HouseAge 區塊群組的中位數房屋年齡
AveRooms 每戶的平均房間數
AveBedrms 每戶的平均臥室數
Population 區塊群組人口
AveOccup 平均家庭成員數
Latitude 區塊群組緯度
Longitude 區塊群組經度
- 遺失屬性值:
無
此數據集來自 StatLib 儲存庫。 https://www.dcc.fc.up.pt/~ltorgo/Regression/cal_housing.html
目標變數是加州各區的中位數房屋價值,以數十萬美元 ($100,000) 表示。
此數據集源自 1990 年的美國人口普查,每個普查區塊群組使用一行。區塊群組是美國人口普查局發布樣本數據的最小地理單位(一個區塊群組通常有 600 到 3,000 人)。
一個家庭是指居住在一個家中的一群人。由於此數據集中提供的每個家庭的平均房間數和臥室數,對於家庭少且空屋多的區塊群組(例如度假勝地),這些列可能會出現驚人的大值。
可以使用 sklearn.datasets.fetch_california_housing
函數下載/載入。
參考文獻
Pace, R. Kelley and Ronald Barry, Sparse Spatial Autoregressions, Statistics and Probability Letters, 33 (1997) 291-297
7.2.8. 物種分佈數據集#
此數據集表示中南美洲兩種物種的地理分佈。這兩種物種是
“Bradypus variegatus”,棕喉樹懶。
“Microryzomys minutus”,也稱為森林小稻鼠,一種生活在秘魯、哥倫比亞、厄瓜多、秘魯和委內瑞拉的齧齒動物。
此數據集並非典型的數據集,因為不會返回包含屬性 data
和 target
的 Bunch
。相反,我們擁有允許創建不同物種「密度」地圖的資訊。
可以使用屬性 x_left_lower_corner
、y_left_lower_corner
、Nx
、Ny
和 grid_size
來建構地圖的網格,這些屬性分別對應於網格左下角的 x 和 y 坐標、沿 x 軸和 y 軸的點數,以及網格上的步長大小。
網格每個位置的密度包含在 coverage
屬性中。
最後,train
和 test
屬性包含有關特定位置物種位置的資訊。
此數據集由 Phillips 等人 (2006) 提供。
參考文獻
“Maximum entropy modeling of species geographic distributions” S. J. Phillips, R. P. Anderson, R. E. Schapire - Ecological Modelling, 190:231-259, 2006.
範例