在機器學習算法的學習過程中,找到用來適合用來練手的數據集是我們面臨的第一道門檻,畢竟俗話說得好,巧婦也難爲無米之炊嘛。
爲此,我在知乎上寫過一篇回答:
機器學習需要的大量數據集從哪裏找?
這篇回答主要是介紹了從各個比賽平臺尋找機器學習相關實戰數據集的方法,目前已經獲得了1.5k個贊同,看來大家對於數據集的需求還是挺旺盛的。不過,雖然這些數據集都是從實際的業務場景抽離出來的,都有着實際的義務含義,但是這些數據集存在三個缺點:
1、這些數據集數據量相對龐大;
2、這些數據集包含了實際業務中的各種情況,而且主辦方爲了增加比賽的難度,甚至故意在數據集里加入一些異常的數據,探索明白這些數據集也需要很長的時間;
3、有些數據集隨着比賽結束就關閉了下載通道,不好獲得。
機器學習算法入門,最好能夠自己親手跑通SVM、LR、隨機森林等常用的幾個機器學習算法,能夠直觀地看看這些算法的表現效果,這和學編程做的第一件事就是讓程序輸出“hello world”一樣。而在入門機器學習算法,對來自生活中的數據集進行加載、轉換、清洗就是一個非常大的工作量,缺少數據集成爲了阻礙很多初學者實踐算法的不小的門檻。
其實,很多人不知道的是,機器學習領域經典的Python包scikit-learn已經將常用的數據集預置進去了,並封裝成了‘’函數。這些數據集都是機器學習領域比較基礎的數據集。他們由於數據量簡單、數據含義直觀等優點,常常混跡於各種課程中。最重要的是:對於自己直觀地看到機器學習算法效果來說,足夠了!下面,將具體介紹這些數據集。
一、如何使用簡單數據集
這些數據集在安裝好scikit-learn就已經存在於我們的電腦上了。主要包括以下幾個數據集:
- 分類數據集:
1.1 鳶尾花數據集:load_iris()
1.2 手寫數字識別數據集:load_digits()
1.3 葡萄酒識別數據集:load_wine()
1.4 乳腺癌診斷數據集:load_breast_cancer() - 迴歸數據集:
2.1 波士頓房價數據集:load_boston()
2.2 糖尿病數據集:load_diabetes() - 多變量回歸數據集:
3.1 蘭納胡德體能數據集:load_linnerud()
使用他們的方法非常簡單。只需要執行:
from sklearn import datasets
dataset = sklearn.datasets.load_數據集名字()
#數據集
X = dataset.data
#對應標籤
Y = dataset.target
當然,如果你想詳細瞭解一下這些數據集,也可以使用以下函數:
- dataset.target_names:查看標籤含義
- dataset.DESCR:查看數據集的描述(包括數據集的來源、屬性個數、各個屬性的單位等)
二、各數據集詳細介紹
在我們使用數據集之前,最好知道這些數據集是描述了一個什麼問題,這樣才能順理成章地明白機器學習算法是怎麼解決這個問題的。以下就是關於這些簡單數據集的描述。
一)鳶尾花數據集
Iris 鳶尾花數據集是一個非常經典而且歷史悠久的數據集,雖然只有150個樣本,但是由於其屬性簡單、意義直觀等特點,在統計學習和機器學習領域簡直是大名鼎鼎的入門數據集。數據集內包含 3 類共 150 條記錄,每類各 50 個數據,每條記錄都有 4 項特徵:花萼長度、花萼寬度、花瓣長度、花瓣寬度,可以通過這4個特徵判斷鳶尾花卉屬於 iris-setosa、 iris-versicolour、 iris-virginica這3個品種中的哪一品種。
二)手寫數字識別數據集
其實這嚴格來說屬於圖像處理的範疇,不過最近傳統圖像處理領域被深度學習顛覆到內褲都保不住了,所以這個數據集被scikit-learn收錄也是可以解釋得通的。這個數據集裏總共有5620個樣本,每個樣本是由於 8*8 = 64個像素點組成的圖片。我們的目標,是根據這些像素點的,預測出其代表了0~9哪個數字。
三)葡萄酒識別數據集
這是從UCI葡萄酒識別數據集中摘錄出來的一個子數據集,總共有178個樣本,完整的數據集可以點擊UCI葡萄酒識別數據集 下載。
這個數據集產生的背景是:有個農民在意大利同一地區種植了三個不同品種的葡萄,待葡萄成熟之後分別將他們製成葡萄酒,然後科學家通過分析每種葡萄酒中13種成分的含量和特性,來判斷某一杯葡萄酒是由哪種葡萄釀製的,這13種屬性分別是:
- Alcohol:酒精
- Malic acid :蘋果酸
- Ash Alcalinity of ash :灰分
- Magnesium :鹼性
- Total phenols:鎂
- Flavanoids :酚
- Nonflavanoid phenols :黃酮類化合物
- Proanthocyanins :非類黃酮酚
- Color intensity :原花青素
- Hue:色度
- OD280/OD315 of diluted wines: OD280/OD315
- Proline:脯氨酸
這些化學成份不認識也無所謂。反正最後我們的目標是判斷一杯葡萄酒是由三種葡萄中的哪一種釀製的。所以,標籤自然就是三個代表三個葡萄品種的枚舉值了。
四)乳腺癌診斷數據集
這個數據集由國外醫療中心腫瘤研究所提供,也可以在UCI數據庫中找到。
該數據集總共有良心和噁心腫瘤2大類,良性腫瘤有357個樣本,惡性腫瘤有212 個樣本,共569個樣本,我們通過乳房CT的30個屬性來判斷該乳房是否患有噁心腫瘤。
具體屬性請去scikit-learn官網自行查看,由於屬性太多,這裏就不一一列出了。
五)波士頓房價數據集
想想我們在購房的時候,必然要考慮這個房子周圍配套設施、是否是學區房、離地鐵近不近,鄰居是不是好相處等因素。這些因素共同決定了這個房子在我們心目中的價格。美國人民也不例外,所以,美國人口普查局就收集了美國馬薩諸塞州波士頓住房價格的有關信息,沒想到被聰明的機器學習專家應用到了迴歸預測中。
這個數據集只有506個樣本,總共13個屬性,屬性含義如下:
- CRIM:城鎮人均犯罪率。
- ZN:住宅用地超過 25000平方米 的比例。
- INDUS:城鎮非零售商用土地的比例。
- CHAS:周圍是否有河流(有河流,則爲1,否則爲0)。
- NOX:一氧化氮濃度。
- RM:住宅平均房間數。
- AGE:1940 年之前建成的房屋比例。
- DIS:到波士頓五個中心區域的加權距離。
- RAD:距離公路的距離。
- TAX:當地稅率。
- PTRATIO:城鎮師生比例。
- B:1000(Bk-0.63)^ 2,其中 Bk 指代城鎮中黑人的比例。
- LSTAT:人口中底層人民的比例。
- MEDV:自住房的平均房價,以千美元計
每個樣本對應一個浮點數標籤,代表某個房子的價格。看看這些影響房價的因素,是不是基本符合我們的購房考慮因素啊?看來全世界人民的心理都是相通的。
六)糖尿病病情預測數據集
隨着生活水平的提高,越來越多的人在平常大量攝入高油高糖的食物。糖尿病的患者人數也在逐年上升。本數據集就是通過一個糖尿病人當前的基本情況和身體指標,預測其一年之後的病情發展情況。數據集總共有442個樣本。通過10個屬性維度來就行區分,分別是:
- Age:年齡
- Sex :性別
- Body mass index:BMI指數
- Average blood pressure:平均血壓
- S1
- S2
- S3
- S4
- S5
- S6
這些S代表了六種血清的化驗數據,別問我具體的含義,只知道是醫學方面的一些量化值就可以了。
屬性值的取值範圍在(-0.2,0.2)之間,標籤的取值範圍在[25,346]之間。
注意:爲了便於輸入算法模型中,這10個特徵變量都以標準偏差時間爲中心並按比例進行了縮放處理。
七)蘭納胡德體能數據集
數據集的名字有點拗口,不過你只要記住這是一個衡量體能的數據集就好了。
數據集的背景就是一個叫蘭納胡德(Linnerud)的人測量了某個健身俱樂部的 20 位中年男子的生理數據。被測變量分爲兩組子數據集。第一個子數據集包含三個生理特徵:
- Weight:體重
- Waist:腰圍
- Pulse:脈搏
第二個子數據集包含了三個運動特徵: - Chins:引體向上
- Situps:仰臥起坐
- Jumps:跳躍
我們要做的,就是尋找子數據一和子數據集二之間的因果關係,這就屬於多變量回歸問題。
我們解釋一下多變量回歸的概念:迴歸問題的本質就是去分析因變量與自變量之間的關係,從而爲分析數據、預測數據提供科學的、合理的依據,但是通常我們所說的迴歸問題,是通過幾個自變量得到一個結果,比如說上邊提到的通過各種因素預測房價等問題。而多變量回歸就是要分析多個自變量造成了多個因變量的變化規律。屬於多對多的關係。
舉個例子,比如現在,有一堆自變量(X1,X2,…Xn),這些因素可以導致(Y1,Y2,…Yn)這些因變量的變化,我們又完全不清楚自變量之間、因變量之間存在的關係。
順便提一句,對於變量之間關係複雜、而樣本量又很少的問題,用偏最小二乘迴歸解決是最個不錯的選擇。sklearn已經實現了偏最小二乘迴歸算法,有興趣的可以參考sklearn文檔。
最後,正因爲這些數據集本身非常簡單,而且已經被scikit-learn做了簡化處理,用來入門可以,要想真正提高自己運用算法和數據挖掘的能力,還是要參加各種比賽或者從事實際的項目,畢竟兩千多年前,大將軍趙括已經用親身經歷告訴我們紙上談兵的慘痛後果了哦。
三、自己構造數據集
如果玩膩了這些簡單的數據集,sklearn還支持自己自定義創造數據集。
構造數據集的函數也在sklearn.datasets下,我們分別採用make_classification、 make_regression、make_blobs三個函數來構建分類、迴歸、聚類數據集。比如我們隨便構建一個10個樣本的分類數據集:
from sklearn.datasets import make_classification
X,Y = datasets.make_classification(n_samples = 10)
print('X:',X[:3])
print('Y:',Y[:3])
print('X維度:',X.shape)
print('Y維度:',Y.shape)
輸出如下:
X: [[ 0.29690827 0.10576263 1.94658436 -1.3104142 -1.1185016 -1.40073829
-0.4096297 -1.86317979 0.64596297 0.75271884 0.35448096 -2.11235401
-2.40728032 -1.23424255 -3.43409603 -2.60231078 0.71952271 -0.40460211
0.88607677 0.21988113]
[-0.3822589 -0.82217221 0.81753074 0.24330878 1.47338236 -1.4133207
0.97520516 -0.12297019 0.19819793 -0.71166377 0.21027697 0.48598411
0.23083475 -0.46330706 -0.44026309 -0.10874537 0.63478363 0.29211047
-0.20734913 -0.7659504 ]
[-0.23784806 0.74146631 -0.49256622 0.77576281 1.16816195 -1.90326764
-1.02380523 0.23918916 -1.17025757 -0.44354062 -0.09143154 0.22992207
-0.60323483 -0.16646197 0.84068396 0.63071089 -1.83135902 0.37492177
-1.36216032 0.56710804]]
Y: [1 1 0]
X維度: (10, 20)
Y維度: (10,)
可以看到,以上函數生成了10個樣本,每個樣本有20個特徵維度。
當然,在生成數據集的過程中,我們可以根據自己的需求自定義一些參數來調整生成的數據集。
在構造這些數據集時,所共同用到的參數有:
- n_samples:樣本個數 n_features :特徵總個數。
- n_informative:有用的特徵個數。也就是說,我們可以和n_features參數相結合生成一些無用特徵,增加算法的預測難度。
- n_redundant:無用的特徵個數。 random_state :隨機數生成種子
- n_repeated:重複特徵數【這個一般無需指定】
這裏可能有人會疑惑:指定n_features和n_informative之後,n_redundant不就確定了?其實不然。如果我們指定的n_features大於n_informative +n_redundant 的個數,那麼程序會從這兩個特徵裏隨機重複挑選一些特徵,直到達到特徵總個數的數量。這樣,我們在實際用算法進行預測的時候,就需要用一些降維算法篩掉冗餘特徵所以說,scikit-learn爲了幫我我們設置複雜的數據集真是操碎了心。
當然,總特徵數(n_features)一定要大於n_informative、n_redundant之和,否則會報錯:
Number of informative, redundant and repeated features must sum to less than the number of total features
當然,以上這些參數都有默認值,可以不用自己指定。
一)構造分類數據集
構造分類數據集完整的範例:
from sklearn.datasets import make_classification
features2,target2 = datasets.make_classification(n_samples = 10,
n_features = 3,
n_informative = 3,
n_redundant = 0,
n_classes = 2,
weights = [0.25,0.75],
random_state = 1)
構造分類數據集特有的參數的解釋:
- n_calss :分類個數
- weights :每個類別佔的樣本比例,這裏數組維數要和分類數相對應
二)構造迴歸數據集
構造迴歸數據集完整的範例:
from sklearn.datasets import make_regression
features,target,cofficients = datasets.make_regression(n_samples = 10,
n_features = 3,
n_informative = 3,
n_targets = 3
,noise = 0.0,
coef = True,
random_state = 1)
構造迴歸數據集特有的參數解釋:
- n_target :默認爲1,如果指定多個迴歸值,那就是構造了類似於蘭納胡德體能數據集的多變量回歸數據集
- noise =0.0:給數據集製造一些噪聲,noise越大的話,點就會越來越離散,就越不好擬合迴歸曲線。
- coef :默認爲False,如果爲真,則返回基礎線性模型的係數。
三)構造聚類數據集
構造聚類數據集完整的範例:
from sklearn.datasets import make_blobs
features,target = make_blobs(n_samples = 10,
n_features = 3,
centers = 3,
cluster_std = 0.5,
shuffle = True,
random_state = 1)
構造聚類數據集特有的參數解釋:
- centers = 3:要生成的樣本聚類中心數。
- cluster_std = 0.5:每個類別的方差,例如我們希望生成2類數據,其中一類方差爲0.1,另一類方差爲0.2,可以將cluster_std設置爲[0.1,0.2]
- shuffle = True:布爾值,控制是否隨機打亂樣本。
雖然這樣有着自己出題自己做的嫌疑,但是,因爲我們對自己構造的數據集非常瞭解,通過這些數據集來看各個算法的表現,完全能夠進一步加深對算法的理解。
三、總結
除此之外,sklearn還提供了一些更加接近現實的入門數據集,有人臉識別數據集、新聞文本數據集、森林類型數據集等。他們佔用存儲空間較大,需要的話可以用Python命令把他們下載下來,這裏不做贅述。
本系列相關文章:
機器學習超詳細實踐攻略(8):使用scikit-learn構建模型的通用模板【萬字長文】