【机器学习】Python机器学习的神器- Scikit-learn使用说明
全文共 26745 字,106 幅圖表,
預(yù)計(jì)閱讀時(shí)間 67 分鐘。
0
引言
Sklearn (全稱 Scikit-Learn) 是基于 Python 語言的機(jī)器學(xué)習(xí)工具。它建立在 NumPy, SciPy, Pandas 和 Matplotlib 之上,里面的 API 的設(shè)計(jì)非常好,所有對象的接口簡單,很適合新手上路。
在 Sklearn 里面有六大任務(wù)模塊:分別是分類、回歸、聚類、降維、模型選擇和預(yù)處理,如下圖從其官網(wǎng)的截屏。
要使用上述六大模塊的方法,可以用以下的偽代碼,注意 import 后面我用的都是一些通用名稱,如?SomeClassifier, SomeRegressor, SomeModel,具體化的名稱由具體問題而定,比如
SomeClassifier = RandomForestClassifier
SomeRegressor =?LinearRegression
SomeModel = KMeans, PCA
SomeModel = GridSearchCV, OneHotEncoder
上面具體化的例子分別是隨機(jī)森林分類器、線性回歸器、K 均值聚類、主成分分析、網(wǎng)格追蹤法、獨(dú)熱編碼。
分類 (Classification)
from sklearn import SomeClassifier from sklearn.linear_model import SomeClassifier from?sklearn.ensemble?import?SomeClassifier回歸 (Regression)
from sklearn import SomeRegressor from?sklearn.linear_model?import?SomeRegressor from?sklearn.ensemble?import?SomeRegressor聚類 (Clustering)
from sklearn.cluster import SomeModel降維 (Dimensionality Reduction)
from sklearn.decomposition import SomeModel模型選擇 (Model Selection)
from sklearn.model_selection import SomeModel預(yù)處理 (Preprocessing)
from sklearn.preprocessing import SomeModelSomeClassifier,?SomeRegressor,?SomeModel?其實(shí)都叫做估計(jì)器 (estimator),就像 Python 里「萬物皆對象」那樣,Sklearn 里「萬物皆估計(jì)器」。
此外,Sklearn 里面還有很多自帶數(shù)據(jù)集供,引入它們的偽代碼如下。
數(shù)據(jù)集 (Dataset)
from sklearn.datasets import SomeData本貼我們用以下思路來講解:
第一章介紹機(jī)器學(xué)習(xí),從定義出發(fā)引出機(jī)器學(xué)習(xí)四要素:數(shù)據(jù)、任務(wù)、性能度量和模型。加這一章的原因是不把機(jī)器學(xué)習(xí)相關(guān)概念弄清楚之后很難完全弄明白 Sklearn。
第二章介紹 Sklearn,從其 API 設(shè)計(jì)原理出發(fā)分析其五大特點(diǎn):一致性、可檢驗(yàn)、標(biāo)準(zhǔn)類、可組合和默認(rèn)值。最后再分析 Sklearn 里面自帶數(shù)據(jù)以及儲存格式。
第三章介紹 Sklearn 里面的三大核心 API,包括估計(jì)器、預(yù)測器和轉(zhuǎn)換器。這一章的內(nèi)容最重要,幾乎所有模型都會(huì)用到這三大 API。
第四章介紹 Sklearn 里面的高級 API,即元估計(jì)器,有可以大大簡化代碼量的流水線 (Pipeline?估計(jì)器),有集成模型 (Ensemble?估計(jì)器)、有多類別-多標(biāo)簽-多輸出分類模型 (Multiclass 和 Multioutput?估計(jì)器) 和模型選擇工具 (Model Selection?估計(jì)器)。
本帖目錄如下:
目錄
第一章 -?機(jī)器學(xué)習(xí)簡介
????1.1 定義和組成元素
????1.2 數(shù)據(jù)
????1.3 任務(wù)
????1.4 性能指標(biāo)
????1.5 模型
第二章 - Sklearn 數(shù)據(jù)
? ? 2.1 數(shù)據(jù)格式
? ? 2.2 自帶數(shù)據(jù)集
第三章 - 核心 API
? ? 3.1 估計(jì)器
? ? 3.2 預(yù)測器
????3.3 轉(zhuǎn)換器
第四章 - 高級 API
? ? 4.1 Ensemble 估計(jì)器
? ? 4.2 Multiclass?估計(jì)器
????4.3 Multioutput?估計(jì)器
????4.4 Model Selection?估計(jì)器
????4.5 Pipeline?估計(jì)器
總結(jié)
很多介紹 Sklearn 的文章是不會(huì)像我這么詳細(xì)介紹「機(jī)器學(xué)習(xí)」里的概念的,但是不弄清出這些概念或術(shù)語,學(xué) Sklearn 只是走馬觀花,只看到表面,抓不到實(shí)質(zhì)。
建議認(rèn)真仔細(xì)讀第一章!
建議認(rèn)真仔細(xì)讀第一章!
建議認(rèn)真仔細(xì)讀第一章!
1
機(jī)器學(xué)習(xí)簡介
1.1
定義和組成元素
什么是機(jī)器學(xué)習(xí)?字面上來講就是 (人用) 計(jì)算機(jī)來學(xué)習(xí)。談起機(jī)器學(xué)習(xí)就一定要提起湯姆米切爾 (Tom M.Mitchell),就像談起音樂就會(huì)提起貝多芬,談起籃球就會(huì)提起邁克爾喬丹,談起電影就會(huì)提起萊昂納多迪卡普里奧。米切爾對機(jī)器學(xué)習(xí)定義的原話是:
A computer program is said to learn from experience E?with?respect?to some class of tasks ?T and?performance measure P?if?its?performance?at ?tasks in T, as measured by P,?improves with experience E.
整段英文有點(diǎn)抽象難懂對嗎?首先注意到兩個(gè)詞 computer program 和 learn,翻譯成中文就是機(jī)器 (計(jì)算機(jī)程序) 和學(xué)習(xí),再把上面英譯中:
假設(shè)用性能度量?P?來評估機(jī)器在某類任務(wù) T 的性能,若該機(jī)器通利用經(jīng)驗(yàn)?E?在任務(wù)?T?中改善其性能 P,那么可以說機(jī)器對經(jīng)驗(yàn)?E?進(jìn)行了學(xué)習(xí)。
在該定義中,除了核心詞機(jī)器和學(xué)習(xí),還有關(guān)鍵詞經(jīng)驗(yàn) E,性能度量 P 和任務(wù) T。在計(jì)算機(jī)系統(tǒng)中,通常經(jīng)驗(yàn) E 是以數(shù)據(jù) D 的形式存在,而機(jī)器學(xué)習(xí)就是給定不同的任務(wù) T 從數(shù)據(jù)中產(chǎn)生模型 M,模型 M 的好壞就用性能度量 P 來評估。
由上述機(jī)器學(xué)習(xí)的定義可知機(jī)器學(xué)習(xí)包含四個(gè)元素
數(shù)據(jù) (Data)
任務(wù)?(Task)
性能度量?(Quality Metric)
模型 (Model)
下面四小節(jié)分別介紹數(shù)據(jù)、任務(wù)、性能度量和模型。
1.2
數(shù)據(jù)
數(shù)據(jù) (data) 是經(jīng)驗(yàn)的另一種說法,也是信息的載體。數(shù)據(jù)可分為
結(jié)構(gòu)化數(shù)據(jù)和非結(jié)構(gòu)化數(shù)據(jù) (按數(shù)據(jù)具體類型劃分)
原始數(shù)據(jù)和加工數(shù)據(jù) (按數(shù)據(jù)表達(dá)形式劃分)
樣本內(nèi)數(shù)據(jù)和樣本外數(shù)據(jù) (按數(shù)據(jù)統(tǒng)計(jì)性質(zhì)劃分)
結(jié)構(gòu)化和非結(jié)構(gòu)化
結(jié)構(gòu)化數(shù)據(jù) (structured data) 是由二維表結(jié)構(gòu)來邏輯表達(dá)和實(shí)現(xiàn)的數(shù)據(jù)。非結(jié)構(gòu)化數(shù)據(jù)是沒有預(yù)定義的數(shù)據(jù),不便用數(shù)據(jù)庫二維表來表現(xiàn)的數(shù)據(jù)。
非結(jié)構(gòu)化數(shù)據(jù)
非結(jié)構(gòu)化數(shù)據(jù)包括圖片,文字,語音和視屏等如下圖。
對于以上的非結(jié)構(gòu)數(shù)據(jù),相關(guān)應(yīng)用實(shí)例有
深度學(xué)習(xí)的卷積神經(jīng)網(wǎng)絡(luò) (convolutional neural network, CNN) 對圖像數(shù)據(jù)做人臉識別或物體分類
深度學(xué)習(xí)的循環(huán)神經(jīng)網(wǎng)絡(luò) (recurrent neural network, RNN) 對語音數(shù)據(jù)做語音識別或機(jī)器對話,對文字?jǐn)?shù)據(jù)做文本生成或閱讀理解
增強(qiáng)學(xué)習(xí)的阿爾法狗 (AlphaGo) 對棋譜數(shù)據(jù)學(xué)習(xí)無數(shù)遍最終打敗了圍棋世界冠軍李世石和柯潔
計(jì)算機(jī)追根到底還是只能最有效率的處理數(shù)值型的結(jié)構(gòu)化數(shù)據(jù),如何從原始數(shù)據(jù)加工成計(jì)算機(jī)可應(yīng)用的數(shù)據(jù)會(huì)在后面講明。
結(jié)構(gòu)化數(shù)據(jù)
機(jī)器學(xué)習(xí)模型主要使用的是結(jié)構(gòu)化數(shù)據(jù),即二維的數(shù)據(jù)表。非結(jié)構(gòu)化數(shù)據(jù)可以轉(zhuǎn)換成結(jié)構(gòu)化數(shù)據(jù),比如把
圖像類數(shù)據(jù)里像素張量重塑成一維數(shù)組
文本類數(shù)據(jù)用獨(dú)熱編碼轉(zhuǎn)成二維數(shù)組
對于結(jié)構(gòu)化數(shù)據(jù),我們用勒布朗詹姆斯 (Lebron James) 四場比賽的數(shù)據(jù)舉例。
下面術(shù)語大家在深入了解機(jī)器學(xué)習(xí)前一定要弄清楚:
每行的記錄 (這是一場比賽詹姆斯的個(gè)人統(tǒng)計(jì)) ,稱為一個(gè)示例 (instance)
反映對象在某方面的性質(zhì),例如得分,籃板,助攻,稱為特征 (feature) 或輸入 (input)
特征上的取值,例如「示例 1」對應(yīng)的 27, 10, 12 稱為特征值 (feature value)
關(guān)于示例結(jié)果的信息,例如贏,稱為標(biāo)簽 (label) 或輸出 (output)
包含標(biāo)簽信息的示例,則稱為樣例 (example),即樣例 = (特征, 標(biāo)簽)
從數(shù)據(jù)中學(xué)得模型的過程稱為學(xué)習(xí) (learning) 或訓(xùn)練 (training)
在訓(xùn)練數(shù)據(jù)中,每個(gè)樣例稱為訓(xùn)練樣例 (training example),整個(gè)集合稱為訓(xùn)練集 (training set)
原始和加工
計(jì)算機(jī)處理數(shù)值型的結(jié)構(gòu)型數(shù)據(jù)最有效率,但是現(xiàn)實(shí)世界到處出是原始數(shù)據(jù),分為兩類
非結(jié)構(gòu)數(shù)據(jù)比如圖片和文字型數(shù)據(jù) (情況一)
結(jié)構(gòu)型數(shù)據(jù)的分類型變量 (情況二)
圖像性數(shù)據(jù)
拿情況一的圖片為例,通過特定函數(shù) imread 將彩色圖片用?RGB?像素表示出來,再按紅綠藍(lán)的順序,將所有像素排成一個(gè)數(shù)值列向量 (column vector),而計(jì)算機(jī)可以接受這樣的輸入。具體轉(zhuǎn)換過程見下圖。
文本型數(shù)據(jù)
推特?(twitter)?的每條推文?(tweet)?規(guī)定只能發(fā)?280?個(gè)字符。在編碼推文時(shí),將?280?個(gè)字符的序列用獨(dú)熱編碼?(one-hot encoding)?到包含?128?個(gè)字符的?ASCII?表,如下所示。
這樣,每條推文都可以編碼為?2?維張量形狀?(280, 128),比如一條?tweet?是 “I love python :)”,這句話映射到?ASCII?表變成:
如果收集到?1?百萬條推文,那么整個(gè)數(shù)據(jù)集的形狀為?(1000000, 280, 128)。傳統(tǒng)機(jī)器學(xué)習(xí)的對率回歸可以來做情感分析。
分類型變量
籃球比賽結(jié)果非輸即贏,是一個(gè)二類 (binary class) 變量
二類變量用「0-1編碼」,比如比賽結(jié)果= {贏, 輸} 表示成?y= [1 0 0 1],1 代表贏,0 代表輸。
而足球比賽結(jié)果是有贏、平、輸三種,是一個(gè)多類 (multi-class) 變量。
多類變量分別用 0, 1, 2 來表示,那么 y = [0 1 0 2]。但更常見的是用獨(dú)熱編碼 (one-hot encoding),即
樣本內(nèi)和樣本外
在統(tǒng)計(jì)中,把研究對象的全體稱為總體?(population),而把組成總體的各個(gè)元素稱為個(gè)體,把從總體中抽取的若干個(gè)體稱為樣本?(sample)。
舉個(gè)調(diào)查中國男性平均身高的例子:
全國的男性就是總體
每個(gè)男性是個(gè)體
普查所有男性金錢花費(fèi)和時(shí)間成本太高,通常會(huì)抽取若干男性作為樣本,計(jì)算樣本里的男性平均身高作為總體里的所有男性平均身高的推理 (inference)。
統(tǒng)計(jì)學(xué)中做的事情就是用樣本數(shù)據(jù)的統(tǒng)計(jì) (statistics) 來推出總體數(shù)據(jù)的參數(shù) (parameter)。樣本數(shù)據(jù)也叫做樣本內(nèi)數(shù)據(jù),除樣本內(nèi)數(shù)據(jù)之外的總體數(shù)據(jù)叫做樣本外數(shù)據(jù)。
在機(jī)器學(xué)習(xí)中,樣本內(nèi)和樣本外數(shù)據(jù)的定義稍微有些不同,如下圖:
樣本內(nèi)數(shù)據(jù)是用來訓(xùn)練模型的數(shù)據(jù),也叫訓(xùn)練數(shù)據(jù)。它們是已知的,可計(jì)算統(tǒng)計(jì)的。
樣本外數(shù)據(jù)是未來的沒見過的新數(shù)據(jù)。它們是未知的,不可計(jì)算統(tǒng)計(jì)的。
機(jī)器學(xué)習(xí)在樣本內(nèi)數(shù)據(jù)訓(xùn)練模型用來預(yù)測:
樣本內(nèi)預(yù)測:根據(jù)訓(xùn)練模型對樣本內(nèi)數(shù)據(jù)進(jìn)行預(yù)測,可與已知標(biāo)簽比較來評估模型表現(xiàn)
樣本外預(yù)測:根據(jù)訓(xùn)練模型對樣本外數(shù)據(jù)進(jìn)行預(yù)測,不能與未知的標(biāo)簽比較
機(jī)器學(xué)習(xí)的難點(diǎn)就是如何用好的樣本內(nèi)預(yù)測來保證好的樣本外預(yù)測,幸運(yùn)的是我們有〖計(jì)算學(xué)習(xí)理論〗來保證它。
1.3
任務(wù)
根據(jù)學(xué)習(xí)的任務(wù)模式 (訓(xùn)練數(shù)據(jù)是否有標(biāo)簽),機(jī)器學(xué)習(xí)可分為四大類:
有監(jiān)督學(xué)習(xí) (有標(biāo)簽)
無監(jiān)督學(xué)習(xí) (無標(biāo)簽)
半監(jiān)督學(xué)習(xí) (有部分標(biāo)簽)
增強(qiáng)學(xué)習(xí) (有評級標(biāo)簽)
深度學(xué)習(xí)只是一種方法,而不是任務(wù)模式,因此與上面四類不屬于同一個(gè)維度,但是深度學(xué)習(xí)與它們可以疊加成:深度有監(jiān)督學(xué)習(xí)、深度非監(jiān)督學(xué)習(xí)、深度半監(jiān)督學(xué)習(xí)和深度增強(qiáng)學(xué)習(xí)。遷移學(xué)習(xí)也是一種方法,也可以分類為有監(jiān)督遷移學(xué)習(xí)、非監(jiān)督遷移學(xué)習(xí)、半監(jiān)督遷移學(xué)習(xí)和增強(qiáng)遷移學(xué)習(xí)。
下圖畫出機(jī)器學(xué)習(xí)各類之間的關(guān)系。
由于 Sklearn 里面模型主要處理「有監(jiān)督學(xué)習(xí)」和「無監(jiān)督學(xué)習(xí)」兩類,我們接下來也只討論這兩類。
有監(jiān)督學(xué)習(xí)
有監(jiān)督學(xué)習(xí) (supervised learning)?利用輸入數(shù)據(jù)及其對應(yīng)標(biāo)簽來訓(xùn)練模型。這種學(xué)習(xí)方法類似學(xué)生通過研究問題和參考答案來學(xué)習(xí),在掌握問題和答案之間的對應(yīng)關(guān)系后,學(xué)生可自己給出相似新問題的答案了。
在有監(jiān)督學(xué)習(xí)中,數(shù)據(jù) = (特征,標(biāo)簽),而其主要任務(wù)是分類和回歸。以上述詹姆斯的個(gè)人統(tǒng)計(jì)為例。
分類
如果預(yù)測的是離散值?(discrete value),例如比賽結(jié)果贏或輸,此類學(xué)習(xí)任務(wù)稱為分類?(classification)。
回歸
如果預(yù)測的是連續(xù)值 (continuous value),例如詹姆斯效率 65.1, 70.3 等等,此類學(xué)習(xí)任務(wù)稱為回歸 (regression)。
無監(jiān)督學(xué)習(xí)
無監(jiān)督學(xué)習(xí) (unsupervised learning)?是找出輸入數(shù)據(jù)的模式。比如,它可以根據(jù)電影的各種特征做聚類,用這種方法收集數(shù)據(jù)為電影推薦系統(tǒng)提供標(biāo)簽。此外無監(jiān)督學(xué)習(xí)還可以降低數(shù)據(jù)的維度,它可以幫助我們更好的理解數(shù)據(jù)。
在無監(jiān)督學(xué)習(xí)中,數(shù)據(jù) = (特征,)。
聚類
除了根據(jù)詹姆斯個(gè)人統(tǒng)計(jì)來預(yù)測騎士隊(duì)輸贏或者個(gè)人效率值外,我們還可以對該數(shù)據(jù)做聚類 (clustering),即將訓(xùn)練集中的數(shù)據(jù)分成若干組,每組成為一個(gè)簇 (cluster)。
假設(shè)聚類方法將數(shù)據(jù)聚成二個(gè)簇 A 和 B,如下圖
后來發(fā)現(xiàn)簇 A 代表贏,簇 B 代表輸。聚類的用處就是可以找到一個(gè)潛在的原因來解釋為什么樣例 1 和 3 可以贏球。難道真的是只要詹姆斯三雙就可以贏球?
降維
注:下面對降維的理解不是那么嚴(yán)謹(jǐn),只為了讓小白對降維大概有個(gè)概念。
詹姆斯完整統(tǒng)計(jì)數(shù)據(jù)還有搶斷、蓋帽和犯規(guī),但這些對預(yù)測比賽輸贏、效率值都沒什么用,因此可以通過降維的方法將其去除。
1.4
性能度量
回歸和分類任務(wù)中最常見的誤差函數(shù)以及一些有用的性能度量如下。
回歸任務(wù)的誤差函數(shù)估量在數(shù)據(jù)集 D 上模型的連續(xù)型預(yù)測值?h(x) 與連續(xù)型真實(shí)值?y 的距離,h(x) 和?y 可以取任意實(shí)數(shù)。誤差函數(shù)是一個(gè)非負(fù)實(shí)值函數(shù),通常使用 ED[h] 來表示。圖表展示如下。
分類任務(wù)的誤差函數(shù)估量在數(shù)據(jù)集 D 上模型的離散型預(yù)測值?h(x)?與離散型真實(shí)值?y 的不一致程度,慣例是 y 和 h(x) 取±1,比如正類取 1 負(fù)類取 -1。圖表展示如下。
除上述損失函數(shù)之外,分類任務(wù)還有很多其他有用的性能度量。
錯(cuò)誤率:分類錯(cuò)誤的樣本數(shù)占樣本總數(shù)的比例稱為錯(cuò)誤率 (error rate),相應(yīng)的分類正確的樣本數(shù)占樣本總數(shù)的比例稱為精度 (accuracy)。在 10 個(gè)樣本中有 2 個(gè)樣本分類錯(cuò)誤,則錯(cuò)誤率為 20%,而精度為 80%。
查準(zhǔn)率和查全率:錯(cuò)誤率和精度雖然常用,但是不能滿足所有任務(wù)需求。假定用訓(xùn)練好的模型預(yù)測騎士贏球,顯然,錯(cuò)誤率衡量了多少比賽實(shí)際是贏球但預(yù)測成輸球。但是若我們關(guān)心的是“預(yù)測出的比賽中有多少是贏球”,或“贏球的比賽中有多少被預(yù)測出了”,那么錯(cuò)誤率這個(gè)單一指標(biāo)顯然就不夠用了,這時(shí)需要引進(jìn)更為細(xì)分的性能度量,即查準(zhǔn)率 (precision) 和查全率 (recall)。
其他概念比如混淆矩陣、ROC、AUC 我們再下帖的實(shí)例用到時(shí)再細(xì)講。
1.5
模型
有監(jiān)督模型如下圖所示:
無監(jiān)督模型包括各種聚類分析 (KMeans, DBSCAN)、主成分分析 (PCA)、獨(dú)立成分分析 (ICA)、隱含狄利克雷分配 (LDA) 等等。
如要了解更多機(jī)器學(xué)習(xí)的細(xì)節(jié),請參考本帖次條的〖機(jī)器學(xué)習(xí)帖子匯總〗,里面是我寫的所有關(guān)于「有監(jiān)督學(xué)習(xí)」的內(nèi)容。
費(fèi)了這么多時(shí)間來介紹機(jī)器學(xué)習(xí),無非就是讓大家在使用 Sklearn 時(shí)知道自己在做什么,知道那些概念在說什么就夠了。
2
Sklearn 數(shù)據(jù)
Sklearn 和之前討論的 NumPy, SciPy, Pandas, Matplotlib 相似,就是一個(gè)處理特殊任務(wù)的包,Sklearn 就是處理機(jī)器學(xué)習(xí) (有監(jiān)督學(xué)習(xí)和無監(jiān)督學(xué)習(xí)) 的包,更精確的說,它里面有六個(gè)任務(wù)模塊和一個(gè)數(shù)據(jù)引入模塊:
有監(jiān)督學(xué)習(xí)的分類任務(wù)
有監(jiān)督學(xué)習(xí)的回歸任務(wù)
無監(jiān)督學(xué)習(xí)的聚類任務(wù)
無監(jiān)督學(xué)習(xí)的降維任務(wù)
數(shù)據(jù)預(yù)處理任務(wù)
模型選擇任務(wù)
數(shù)據(jù)引入
本節(jié)就來看看 Sklearn 里數(shù)據(jù)格式和自帶數(shù)據(jù)集。
2.1
數(shù)據(jù)格式
在 Sklean 里,模型能即用的數(shù)據(jù)有兩種形式:
Numpy 二維數(shù)組 (ndarray) 的稠密數(shù)據(jù) (dense data),通常都是這種格式。
SciPy 矩陣 (scipy.sparse.matrix) 的稀疏數(shù)據(jù) (sparse data),比如文本分析每個(gè)單詞 (字典有 100000 個(gè)詞) 做獨(dú)熱編碼得到矩陣有很多 0,這時(shí)用 ndarray 就不合適了,太耗內(nèi)存。
上述數(shù)據(jù)在機(jī)器學(xué)習(xí)中通常用符號 X 表示,是模型自變量。它的大小 = [樣本數(shù), 特征數(shù)],圖下圖所示。該房屋數(shù)據(jù)有?21000 條包括平方英尺,臥室數(shù),樓層,日期,翻新年份等等?21?欄。該數(shù)據(jù)形狀為 [21000, 21]
有監(jiān)督學(xué)習(xí)除了需要特征 X 還需要標(biāo)簽 y,而 y 通常就是 Numpy 一維數(shù)組,無監(jiān)督學(xué)習(xí)沒有 y。
2.2
自帶數(shù)據(jù)集
Sklearn 里面有很多自帶數(shù)據(jù)集供用戶使用。
特例描述
還記得〖統(tǒng)計(jì)可視化之 Seaborn〗一貼里鳶尾花的數(shù)據(jù)集嗎?
數(shù)據(jù)集包括 150 條鳶尾花的四個(gè)特征 (萼片長/寬和花瓣長/寬) 和三個(gè)類別。在盤 Seaborn 時(shí)是從 csv 文件讀取的,本帖從 Sklearn 里面的 datasets 模塊中引入,代碼如下:
from sklearn.datasets import load_iris iris = load_iris()數(shù)據(jù)是以「字典」格式存儲的,看看 iris 的鍵有哪些。
iris.keys()dict_keys(['data', 'target', 'target_names', 'DESCR','feature_names', 'filename'])鍵里面的名稱解釋如下:
data:特征值 (數(shù)組)
target:標(biāo)簽值 (數(shù)組)
target_names:標(biāo)簽 (列表)
DESCR:數(shù)據(jù)集描述
feature_names:特征 (列表)
filename:iris.csv 文件路徑
具體感受一下 iris 數(shù)據(jù)中特征的大小、名稱和前五個(gè)示例。
n_samples, n_features = iris.data.shape print((n_samples, n_features)) print(iris.feature_names) iris.data[0:5](150, 4)['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']array([[5.1, 3.5, 1.4, 0.2],[4.9, 3. , 1.4, 0.2],[4.7, 3.2, 1.3, 0.2],[4.6, 3.1, 1.5, 0.2],[5. , 3.6, 1.4, 0.2]])150 個(gè)樣本,4 個(gè)特征,沒毛病!再感受一下標(biāo)簽的大小、名稱和全部示例。
print(iris.target.shape) print(iris.target_names) iris.target(150,)['setosa' 'versicolor' 'virginica']array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])150 個(gè)標(biāo)簽,3 類別 (分別用 0, 1, 2 數(shù)值來代表 setosa, versicolor, virginica)。
用 Pandas 的 DataFrame?(將 X 和 y 合并) 和 Seaborn 的 pairplot?(看每個(gè)特征之間的關(guān)系) 來用表格和圖來展示一下數(shù)據(jù)集的內(nèi)容。
Pandas DataFrame
iris_data = pd.DataFrame( iris.data, columns=iris.feature_names ) iris_data['species'] = iris.target_names[iris.target] iris_data.head(3).append(iris_data.tail(3))Seaborn Pairplot
sns.pairplot( iris_data, hue='species', palette='husl' );正規(guī)引入
看完鳶尾花的 iris 數(shù)據(jù)展示后,現(xiàn)在來看看 Sklearn 三種引入數(shù)據(jù)形式。
打包好的數(shù)據(jù):對于小數(shù)據(jù)集,用?sklearn.datasets.load_*
分流下載數(shù)據(jù):對于大數(shù)據(jù)集,用?sklearn.datasets.fetch_*
隨機(jī)創(chuàng)建數(shù)據(jù):為了快速展示,用?sklearn.datasets.make_*
上面這個(gè)星號 * 是什么意思,指的是具體文件名,敲完
datasets.load_<TAB>
datasets.fetch_<TAB>
datasets.make_<TAB>
點(diǎn)擊鍵盤上的 <TAB> 鍵就可以看到很多完整的文件名,看下面動(dòng)圖就明白了。
Load 一個(gè)數(shù)字小數(shù)據(jù)集 digits?
digits = datasets.load_digits() digits.keys()dict_keys(['data', 'target', 'target_names','images', 'DESCR'])Fetch 一個(gè)加州房屋大數(shù)據(jù)集?california_housing?
california_housing = datasets.fetch_california_housing() california_housing.keys()dict_keys(['data', 'target', 'feature_names', 'DESCR'])Make 一個(gè)高斯分位數(shù)數(shù)據(jù)集 gaussian_quantile?
gaussian_quantiles = datasets.make_gaussian_quantiles() type(gaussian_quantiles), len(gaussian_quantiles)(tuple, 2)好了,本節(jié)講的就是通過 sklearn 獲得數(shù)據(jù)三種方式。在自己做數(shù)據(jù)分析時(shí),最常見的還是從 csv 和 txt 文件中通過 Pandas 讀取并存儲成 DataFrame 的形式,做法在〖數(shù)據(jù)結(jié)構(gòu)之 Pandas (上)〗一貼中講得很詳細(xì)了。
3
核心 API
Sklearn 里萬物皆估計(jì)器。估計(jì)器是個(gè)非常抽象的叫法,可把它不嚴(yán)謹(jǐn)?shù)漠?dāng)成一個(gè)模型 (用來回歸、分類、聚類、降維),或當(dāng)成一套流程 (預(yù)處理、網(wǎng)格最終)。
本節(jié)三大 API 其實(shí)都是估計(jì)器:
估計(jì)器 (estimator) 當(dāng)然是估計(jì)器
預(yù)測器 (predictor) 是具有預(yù)測功能的估計(jì)器
轉(zhuǎn)換器 (transformer) 是具有轉(zhuǎn)換功能的估計(jì)器
這三句看似廢話,其實(shí)蘊(yùn)藏了很多內(nèi)容。其實(shí)我對第 1 點(diǎn)這個(gè)估計(jì)器的起名不太滿意,我覺得應(yīng)該叫擬合器 (fitter) - 具有擬合功能的估計(jì)器。看完這一節(jié)你就會(huì)明白「擬合器」這種叫法更合理。
3.1
估計(jì)器
定義:任何可以基于數(shù)據(jù)集對一些參數(shù)進(jìn)行估計(jì)的對象都被稱為估計(jì)器。
兩個(gè)核心點(diǎn):1. 需要輸入數(shù)據(jù),2. 可以估計(jì)參數(shù)。估計(jì)器首先被創(chuàng)建,然后被擬合。
創(chuàng)建估計(jì)器:需要設(shè)置一組超參數(shù),比如
線性回歸里超參數(shù)?normalize=True
K 均值里超參數(shù)?n_clusters=3
在創(chuàng)建好的估計(jì)器 model 可以直接訪問這些超參數(shù),用 . 符號。
model.normalize
model.n_clusters
但 model?中有很多超參數(shù),你不可能一開始都知道要設(shè)置什么值,沒設(shè)置的用 Sklearn 會(huì)給個(gè)合理的默認(rèn)值,因此新手不用擔(dān)心。
擬合估計(jì)器:需要訓(xùn)練集。在有監(jiān)督學(xué)習(xí)中的代碼范式為
????model.fit( X_train, y_train )
在無監(jiān)督學(xué)習(xí)中的代碼范式為
????model.fit( X_train )
擬合之后可以訪問 model 里學(xué)到的參數(shù),比如線性回歸里的特征前的系數(shù)?coef_,或 K 均值里聚類標(biāo)簽?labels_。
model.coef_
model.labels_
說了這么多抽象的東西,現(xiàn)在展示有監(jiān)督學(xué)習(xí)的「線性回歸」和無監(jiān)督學(xué)習(xí)的「K 均值」的具體例子。
線性回歸
首先從 sklearn 下的 linear_model 中引入 LinearRegression,再創(chuàng)建估計(jì)器起名 model,設(shè)置超參數(shù) normalize 為 True,指的在每個(gè)特征值上做標(biāo)準(zhǔn)化,這樣會(huì)加速數(shù)值運(yùn)算。
from sklearn.linear_model import LinearRegressionmodel = LinearRegression(normalize=True) model創(chuàng)建完后的估計(jì)器會(huì)顯示所有的超參數(shù),比如我們設(shè)置好的 normalize=True,其他沒設(shè)置的都是去默認(rèn)值,比如 n_jobs=None 是只用一個(gè)核,你可以將其設(shè)為 2 就是兩核并行,甚至設(shè)為 -1 就是電腦里所有核并行。
自己創(chuàng)建一個(gè)簡單數(shù)據(jù)集 (沒有噪聲完全線性) 只為了講解估計(jì)器里面的特征。
x = np.arange(10) y = 2 * x + 1 plt.plot( x, y, 'o' );還記得 Sklearn 里模型要求特征 X 是個(gè)兩維變量么 (樣本數(shù)×特征數(shù))?但在本例中 X 是一維,因?yàn)槲覀冇?np.newaxis 加一個(gè)維度,它做的事情就是把 [1, 2, 3] 轉(zhuǎn)成 [[1],[2],[3]]。再把 X 和 y 丟進(jìn) fit() 函數(shù)來擬合線性模型的參數(shù)。
X = x[:, np.newaxis] model.fit( X, y )擬合完后的估計(jì)器和創(chuàng)建完的樣子看起來一樣,但是已經(jīng)用「model.param_」可以訪問到學(xué)好的參數(shù)了,展示如下。
print( model.coef_ ) print( model.intercept_ )[2.] 1.0斜率為 2,截距為 1,沒毛病。和訪問超參數(shù)時(shí)不一樣,注意訪問參數(shù)要加一個(gè)下劃線 _。
K 均值
首先從 sklearn 下的?cluster?中引入?KMeans,再創(chuàng)建估計(jì)器起名?model,設(shè)置超參數(shù)?n_cluster 為?3 (為了展示方便而我們知道用的 iris 數(shù)據(jù)集有 3 類,實(shí)際上應(yīng)該選不同數(shù)量的 n_cluster,根據(jù) elbow 圖來決定,下帖細(xì)講)。
再者,iris 數(shù)據(jù)里是有標(biāo)簽 y 的,我們假裝沒有 y 才能無監(jiān)督的聚類啊,要不然應(yīng)該做有監(jiān)督的分類的。
from sklearn.cluster import KMeansmodel = KMeans( n_clusters=3 ) model創(chuàng)建完后的估計(jì)器會(huì)顯示所有的超參數(shù),比如我們設(shè)置好的 n_cluster=3,其他沒設(shè)置的都是去默認(rèn)值,比如 max_iter=300 是最多迭代次數(shù)為 300,算法不收斂也停了。
還記得 iris 里的特征有四個(gè)嗎 (萼片長、萼片寬、花瓣長、花瓣寬)?四維特征很難可視化,因此我們只取兩個(gè)特征 (萼片長、萼片寬) 來做聚類并且可視化結(jié)果。注意下面代碼 X = iris.data[:,0:2]。
X = iris.data[:,0:2] model.fit(X)擬合完后的估計(jì)器和創(chuàng)建完的樣子看起來一樣,但是已經(jīng)用「model.param_」可以訪問到學(xué)好的參數(shù)了,展示如下。
print( model.cluster_centers_, '\n') print( model.labels_, '\n' ) print( model.inertia_, '\n') print(?iris.target?)有點(diǎn)亂,解釋一下 KMeans 模型這幾個(gè)參數(shù):
model.cluster_centers_:簇中心。三個(gè)簇那么有三個(gè)坐標(biāo)。
model.labels_:聚類后的標(biāo)簽
model.inertia_:所有點(diǎn)到對應(yīng)的簇中心的距離平方和 (越小越好)
需要強(qiáng)調(diào)的是真實(shí)標(biāo)簽 iris.label 和聚類標(biāo)簽?model.labels_ 看起來差的很遠(yuǎn)。類別 0 都一致,但是類別 1 和 2 弄反了,這是因?yàn)樵?KMeans 算法里標(biāo)注的類別索引和真實(shí)類別索引不一樣 (我現(xiàn)在也沒找到什么方法能夠讓它們一致)。
最后畫出兩幅圖,左圖是根據(jù)聚類得到的標(biāo)簽畫出散點(diǎn)圖,而右圖是根據(jù)真實(shí)標(biāo)簽畫出散點(diǎn)圖,對比兩幅圖看很像,聚類的效果還不錯(cuò)是把。畫圖的代碼就不細(xì)說了,不懂的話看〖基本可視化之 Matplotlib〗帖子吧。
小結(jié)
雖然上面以有監(jiān)督學(xué)習(xí)的?LinearRegression 和無監(jiān)督學(xué)習(xí)的?KMeans 舉例,但實(shí)際上你可以將它們替換成其他別的模型,比如有監(jiān)督學(xué)習(xí)的?LogisticRegression?和無監(jiān)督學(xué)習(xí)的?DBSCAN。它們都是「估計(jì)器」,因此都有 fit() 方法。使用它們的通用偽代碼如下:
#?有監(jiān)督學(xué)習(xí) from sklearn.xxx import SomeModel #?xxx?可以是 linear_model 或 ensemble 等model = SomeModel( hyperparameter ) model.fit( X, y )#?無監(jiān)督學(xué)習(xí) from sklearn.xxx import SomeModel #?xxx?可以是?cluster?或?decomposition 等model = SomeModel( hyperparameter ) model.fit( X )3.2
預(yù)測器
定義:預(yù)測器在估計(jì)器上做了一個(gè)延展,延展出預(yù)測的功能。
兩個(gè)核心點(diǎn):1. 基于學(xué)到的參數(shù)預(yù)測,2. 預(yù)測有很多指標(biāo)。最常見的就是 predict() 函數(shù):
model.predict(X_test):評估模型在新數(shù)據(jù)上的表現(xiàn)
model.predict(X_train):確認(rèn)模型在老數(shù)據(jù)上的表現(xiàn)
因?yàn)橐鲱A(yù)測,首先將數(shù)據(jù)分成 80:20 的訓(xùn)練集 (X_train, y_train) 和測試集 (X_test, y_test),在用從訓(xùn)練集上擬合 fit() 的模型在測試集上預(yù)測 predict()。
from sklearn.datasets import load_iris iris = load_iris()from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split( iris['data'], iris['target'], test_size=0.2 )print( 'The size of X_train is ', X_train.shape ) print( 'The size of y_train is ', y_train.shape ) print( 'The size of X_test is ', X_test.shape ) print( 'The size of y_test is ', y_test.shape )The size?of?X_train?is?(120,?4) The size?of?y_train?is?(120,) The size?of?X_test?is?(30,?4) The size?of?y_test?is?(30,)讓我們來看個(gè)有監(jiān)督學(xué)習(xí)的「對率回歸」和繼續(xù)上節(jié)無監(jiān)督學(xué)習(xí)的「K?均值」的例子。
對率回歸
首先從 sklearn 下的?linear_model?中引入?LogisticRegression,再創(chuàng)建估計(jì)器起名?model,設(shè)置超參數(shù) mutli_class 為?multinomial 因?yàn)橛腥N鳶尾花,是個(gè)多分類問題。
接著再訓(xùn)練集上擬合參數(shù),這時(shí)估計(jì)器 model 里面已經(jīng)可以訪問這些參數(shù)了。
predict & predict_proba
對于分類問題,我們不僅想知道預(yù)測的類別是什么,有時(shí)還想知道預(yù)測該類別的信心如何。前者用 predict(),后者用 predict_proba()。
代碼如下,在測試集上比較預(yù)測標(biāo)簽 y_pred 和真實(shí)標(biāo)簽 y_test 發(fā)現(xiàn)它們完全吻合,準(zhǔn)確率 100% (iris 數(shù)據(jù)太簡單 )。
y_pred = model.predict( X_test ) p_pred = model.predict_proba( X_test ) print( y_test, '\n' ) print( y_pred, '\n' ) print( p_pred )解釋一下 p_pred - 測試集里有 30 個(gè)數(shù)據(jù),鳶尾花有 3 類,因此 predict_proba()?生成一個(gè) 30×3 的數(shù)組,每行的概率加起來為 1。
為了驗(yàn)證我們的理解,我們看 Sklearn 是不是把「每行中最大概率值對應(yīng)的那一類」作為預(yù)測結(jié)果。
s = ['Class 1 Prob', 'Class 2 Prob', 'Class 3 Prob'] prob_DF?=?pd.DataFrame(?p_pred,?columns=s?) prob_DF['Predicted Class'] = y_pred prob_DF.head()是的!前三行 Class 1 Prob 最大,預(yù)測是第一類;第四行 Class 2 Prob 最大,預(yù)測是第二類;第四行?Class 3 Prob 最大,預(yù)測是第三類。
score &?decision_function
預(yù)測器里還有額外的兩個(gè)函數(shù)可以使用。在分類問題中
score() 返回的是分類準(zhǔn)確率
decision_function() 返回的是每個(gè)樣例在每個(gè)類下的分?jǐn)?shù)值
為了驗(yàn)證我們的理解,我們看 Sklearn 是不是把「每行中最高得分值對應(yīng)的那一類」作為預(yù)測結(jié)果。
s = ['Class 1 Score', 'Class 2 Score', 'Class 3 Score'] decision_DF?=?pd.DataFrame(?decision_score,?columns=s?) decision_DF['Predicted Class'] = y_pred decision_DF.tail()是的!前兩行 Class 3 Score 最大,預(yù)測是第三類;后三行 Class 1 Score 最大,預(yù)測是第一類。
K 均值
繼續(xù)上一節(jié)的 KMeans 模型,首先用 fit() 訓(xùn)練。
再用 predict() 在測試集上預(yù)測出類別 inx_pred,和真實(shí)標(biāo)簽 y_test 比對。再次強(qiáng)調(diào),inx_pred 和?y_test 給三個(gè)類別的索引定義是不同的。
idx_pred?=?model.predict(?X_test[:,0:2]?) print( index_pred ) print( y_test )最后畫出兩幅圖 (都是在測試集上),左圖是根據(jù)聚類預(yù)測的標(biāo)簽畫出散點(diǎn)圖,而右圖是根據(jù)真實(shí)標(biāo)簽畫出散點(diǎn)圖,對比兩幅圖看很像,聚類的效果也不錯(cuò)。
KMeans 模型里也有 score() 函數(shù),輸出是值是它要優(yōu)化的目標(biāo)函數(shù)的對數(shù)。
model.score( X_test[:,0:2] )-9.662259042197803小節(jié)
估計(jì)器都有?fit()?方法,預(yù)測器都有?predict()?和 score() 方法,言外之意不是每個(gè)預(yù)測器都有?predict_proba()?和?decision_function()?方法,這個(gè)在用的時(shí)候查查官方文檔就清楚了 (比如 RandomForestClassifier 就沒有 decision_function()?方法)。
使用它們的通用偽代碼如下:
#?有監(jiān)督學(xué)習(xí) from sklearn.xxx import SomeModel #?xxx?可以是 linear_model 或 ensemble 等model = SomeModel( hyperparameter ) model.fit( X, y ) y_pred = model.predict( X_new ) s = model.score( X_new )#?無監(jiān)督學(xué)習(xí) from sklearn.xxx import SomeModel #?xxx?可以是?cluster?或?decomposition 等model = SomeModel( hyperparameter ) model.fit( X ) idx_pred = model.predict( X_new ) s = model.score( X_new )3.3
轉(zhuǎn)換器
定義:轉(zhuǎn)換器也是一種估計(jì)器,兩者都帶擬合功能,但估計(jì)器做完擬合來預(yù)測,而轉(zhuǎn)換器做完擬合來轉(zhuǎn)換。
核心點(diǎn):估計(jì)器里 fit + predict,轉(zhuǎn)換器里 fit + transform。
本節(jié)介紹兩大類轉(zhuǎn)換器
將分類型變量 (categorical) 編碼成數(shù)值型變量 (numerical)
規(guī)范化 (normalize) 或標(biāo)準(zhǔn)化 (standardize) 數(shù)值型變量
分類型變量編碼
LabelEncoder & OrdinalEncoder
LabelEncoder?和?OrdinalEncoder 都可以將字符轉(zhuǎn)成數(shù)字,但是
LabelEncoder??的輸入是一維,比如 1d?ndarray
OrdinalEncoder??的輸入是二維,比如 DataFrame
首先給出要編碼的列表 enc 和要解碼的列表 dec。
enc = ['win','draw','lose','win'] dec = ['draw','draw','win']從 sklearn 下的?preprocessing?中引入?LabelEncoder,再創(chuàng)建轉(zhuǎn)換器起名?LE,不需要設(shè)置任何超參數(shù)。?
from sklearn.preprocessing import LabelEncoder LE = LabelEncoder()print( LE.fit(enc) ) print( LE.classes_ ) print( LE.transform(dec) )LabelEncoder() ['draw' 'lose' 'win'] [0 0 2]上面結(jié)果解釋如下
第 4 行轉(zhuǎn)換器 fit 之后還是轉(zhuǎn)換器,只不過從數(shù)據(jù) enc 上學(xué)到了些東西
第 5 行的 LE.classes_ 就是學(xué)到的東西之一,系統(tǒng)把 'draw', 'lose', 'win' 分別賦予 0, 1, 2
第 6 行用學(xué)到的東西來解碼?['draw','draw','win'] 得到 [0 0 2]
除了LabelEncoder 能編碼,OrdinalEncoder 也可以。首先從 sklearn 下的?preprocessing?中引入?OrdinalEncoder,再創(chuàng)建轉(zhuǎn)換器起名?OE,不需要設(shè)置任何超參數(shù)。 下面結(jié)果和上面類似,就不再多解釋了。
from sklearn.preprocessing import OrdinalEncoder OE = OrdinalEncoder()enc_DF = pd.DataFrame(enc) dec_DF = pd.DataFrame(dec)print( OE.fit(enc_DF) ) print( OE.categories_ ) print( OE.transform(dec_DF) )OrdinalEncoder(categories='auto', dtype=<class 'numpy.float64'>)[array(['draw', 'lose', 'win'], dtype=object)][[0.][0.][2.]]上面這種編碼的問題是,機(jī)器學(xué)習(xí)算法會(huì)認(rèn)為兩個(gè)臨近的值比兩個(gè)疏遠(yuǎn)的值要更相似。顯然這樣不對 (比如,0 和 1 比 0 和 2 距離更近,難道 draw 和 win 比 draw 和 lose 更相似?)。
要解決這個(gè)問題,一個(gè)常見的方法是給每個(gè)分類創(chuàng)建一個(gè)二元屬性,即獨(dú)熱編碼 (one-hot encoding)。如何用它看下段。
OneHotEncoder
獨(dú)熱編碼其實(shí)就是把一個(gè)整數(shù)用向量的形式表現(xiàn)。下圖就是對數(shù)字 0-9 做獨(dú)熱編碼。
轉(zhuǎn)換器?OneHotEncoder 可以接受兩種類型的輸入:
用?LabelEncoder?編碼好的一維數(shù)組
DataFrame?
一.?用?LabelEncoder 編碼好的一維數(shù)組 (元素為整數(shù)),重塑 (用 reshape(-1,1)) 成二維數(shù)組作為?OneHotEncoder 輸入。
上面結(jié)果解釋如下
第 5 行打印出編碼結(jié)果 [2 0 1 2]
第 6 行將其轉(zhuǎn)成獨(dú)熱形式,輸出是一個(gè)「稀疏矩陣」形式,因?yàn)閷?shí)操中通常類別很多,因此就一步到位用稀疏矩陣來節(jié)省內(nèi)存
想看該矩陣?yán)锞唧w內(nèi)容,用 toarray() 函數(shù)。
二.?用 DataFrame作為?OneHotEncoder?輸入。
和上面結(jié)果類似,不解釋了。
特征縮放
數(shù)據(jù)要做的最重要的轉(zhuǎn)換之一是特征縮放 (feature scaling)。當(dāng)輸入的數(shù)值的量剛不同時(shí),機(jī)器學(xué)習(xí)算法的性能都不會(huì)好。
具體來說,對于某個(gè)特征,我們有兩種方法:
標(biāo)準(zhǔn)化 (standardization):每個(gè)維度的特征減去該特征均值,除以該維度的標(biāo)準(zhǔn)差。
規(guī)范化 (normalization):每個(gè)維度的特征減去該特征最小值,除以該特征的最大值與最小值之差。
MinMaxScaler
整套轉(zhuǎn)換器「先創(chuàng)建再 fit 在 transform」的流程應(yīng)該很清楚了。自己讀下面代碼看看是不是秒懂。唯一需要注意的就是輸入 X 要求是兩維。
from sklearn.preprocessing import MinMaxScalerX = np.array( [0, 0.5, 1, 1.5, 2, 100] )X_scale = MinMaxScaler().fit_transform( X.reshape(-1,1) ) X_scalearray([[0. ],[0.005],[0.01 ],[0.015],[0.02 ],[1. ]])StandardScaler
牢記轉(zhuǎn)換器「先創(chuàng)建再 fit 在 transform」的流程就行了。
from sklearn.preprocessing import StandardScalerX_scale = StandardScaler().fit_transform( X.reshape(-1,1) ) X_scalearray([[-0.47424487],[-0.46069502],[-0.44714517],[-0.43359531],[-0.42004546],[ 2.23572584]])警示:?fit() 函數(shù)只能作用在訓(xùn)練集上,千萬不要作用在測試集上,要不然你就犯了數(shù)據(jù)窺探的錯(cuò)誤了!拿標(biāo)準(zhǔn)化舉例,用訓(xùn)練集 fit 出來的均值和標(biāo)準(zhǔn)差參數(shù),來對測試集做標(biāo)準(zhǔn)化。
4
高級 API
Sklearn 里核心 API 接口是估計(jì)器,那高級 API 接口就是元估計(jì)器 (meta-estimator),即由很多基估計(jì)器 (base estimator) 組合成的估計(jì)器。
類比〖Python 入門篇 (下)〗一貼里的把函數(shù)當(dāng)成參數(shù)的高階函數(shù),元估計(jì)器把估計(jì)器當(dāng)成參數(shù)。代碼范式大概如下:
????meta_model( base_model )
本節(jié)討論五大元估計(jì)器,分別帶集成功能的 ensemble,多分類和多標(biāo)簽的 multiclass,多輸出的 multioutput,選擇模型的 model_selection,和流水線的 pipeline。
ensemble.BaggingClassifier
ensemble.VotingClassifier
multiclass.OneVsOneClassifier
multiclass.OneVsRestClassifier
multioutput.MultiOutputClassifier
model_selection.GridSearchCV
model_selection.RandomizedSearchCV
pipeline.Pipeline
在下面五節(jié),我們會(huì)用的鳶尾花數(shù)據(jù) iris 和數(shù)字?jǐn)?shù)據(jù) digits,還有一些自己創(chuàng)建的數(shù)據(jù)。
4.1
Ensemble 估計(jì)器
Ensemble 估計(jì)器是用來做集成學(xué)習(xí),該估計(jì)器里面有若干個(gè)分類器 (classifier) 或回歸器 (regressor)。詳情參考〖集成學(xué)習(xí)前傳〗一貼。
分類器統(tǒng)計(jì)每個(gè)子分類器的預(yù)測類別數(shù),再用「多數(shù)投票」原則得到最終預(yù)測。
回歸器計(jì)算每個(gè)子回歸器的預(yù)測平均值。
最常用的 Ensemble 估計(jì)器排列如下:
AdaBoostClassifier: 逐步提升分類器
AdaBoostRegressor:?逐步提升回歸器
BaggingClassifier:?裝袋分類器
BaggingRegressor:?裝袋回歸器
GradientBoostingClassifier: 梯度提升分類器
GradientBoostingRegressor:?梯度提升回歸器
RandomForestClassifier: 隨機(jī)森林分類器
RandomForestRegressor:?隨機(jī)森林回歸器
VotingClassifier: 投票分類器
VotingRegressor:?投票回歸器
我們用鳶尾花數(shù)據(jù)?iris,拿
含同質(zhì)估計(jì)器?RandomForestClassifier?
含異質(zhì)估計(jì)器?VotingClassifier?
來舉例。首先將數(shù)據(jù)分成 80:20 的訓(xùn)練集和測試集,并引入 metrics 來計(jì)算各種性能指標(biāo)。
from sklearn.datasets import load_iris iris = load_iris()from sklearn.model_selection import train_test_split from sklearn import metricsX_train, X_test, y_train, y_test = train_test_split( iris['data'], iris['target'], test_size=0.2?)RandomForestClassifier
隨機(jī)森林 (random forest) 是決策樹 (decision tree) 的一種集成模型,每棵決策樹處理的數(shù)據(jù)用裝袋法 (bagging) 生成。隨機(jī)森林可以減小預(yù)測的方差,并且可以評估特征重要性。詳情參考〖隨機(jī)森林和提升樹〗一貼。
RandomForestClassifier??通過控制?n_estimators 超參數(shù)來決定基估計(jì)器的個(gè)數(shù),本例是 4 棵決策樹 (森林由樹組成);此外每棵樹的最大樹深為 5 (max_depth=5)。
from sklearn.ensemble import RandomForestClassifierRF = RandomForestClassifier( n_estimators=4, max_depth=5 ) RF.fit( X_train, y_train )估計(jì)器有 fit(),元估計(jì)器當(dāng)然也有 fit()。在估計(jì)器那一套又可以照搬到元估計(jì)器 (起名 RF) 上了。看看?RF 里包含的估計(jì)器個(gè)數(shù)和其本身。
print( RF.n_estimators ) RF.estimators_擬合?RF 完再做預(yù)測,用?metrics? 里面的?accuracy_score 來計(jì)算準(zhǔn)確率。訓(xùn)練準(zhǔn)確率 98.33%,測試準(zhǔn)確率 100%。
print ( "RF - Accuracy (Train): %.4g" % metrics.accuracy_score(y_train, RF.predict(X_train)) ) print ( "RF - Accuracy (Test): %.4g" % metrics.accuracy_score(y_test, RF.predict(X_test)) )RF - Accuracy (Train): 0.9833 RF - Accuracy (Test): 1VotingClassifier
和隨機(jī)森林由同質(zhì)分類器「決策樹」不同,投票分類器由若干個(gè)異質(zhì)分類器組成。下例用?VotingClassifier 建立個(gè)含有對率回歸 (LR)、隨機(jī)森林 (RF) 和高斯樸素貝葉斯 (GNB) 三個(gè)分類器的集成模型。
RandomForestClassifier? 的基分類器只能是決策樹,因此只用通過控制?n_estimators?超參數(shù)來決定樹的個(gè)數(shù),而?VotingClassifier?的基分類器要實(shí)實(shí)在在的輸入其本身。
看看?Ensemble?里包含的估計(jì)器個(gè)數(shù)和其本身。
print( len(Ensemble.estimators_) ) Ensemble.estimators_比如元估計(jì)器和它三個(gè)組成元素的表現(xiàn)。還是集成后的?Ensemble?表現(xiàn)最好。
LR.fit( X_train, y_train ) RF.fit( X_train, y_train ) GNB.fit( X_train, y_train )LR - Accuracy (Train): 0.975 RF - Accuracy (Train): 0.9833 GNB - Accuracy (Train): 0.95 Ensemble - Accuracy (Train): 0.9833LR - Accuracy (Test): 1 RF - Accuracy (Test): 1 GNB - Accuracy (Test): 1 Ensemble - Accuracy (Test): 14.2
Multiclass 估計(jì)器
sklearn.multiclass?可以處理多類別 (multi-class) 的多標(biāo)簽 (multi-label) 的分類問題。
從小節(jié) 4.2 到 4.4,我們都會(huì)使用數(shù)字?jǐn)?shù)據(jù)集 digits。首先將數(shù)據(jù)分成 80:20 的訓(xùn)練集和測試集。
from sklearn.datasets import load_digitsdigits = load_digits() digits.keys()dict_keys(['data', 'target', 'target_names', 'images', 'DESCR'])X_train, X_test, y_train, y_test = train_test_split( digits['data'],digits['target'],test_size=0.2?)print( 'The size of X_train is ', X_train.shape ) print( 'The size of y_train is ', y_train.shape ) print( 'The size of X_test is ', X_test.shape ) print( 'The size of y_test is ', y_test.shape )The size of X_train is (1437, 64) The size of y_train is (1437,) The size of X_test is (360, 64) The size of y_test is (360,)訓(xùn)練集和測試集分別有 1437 和 360 張圖像。每張照片是包含 8×8 的像素,將其打平 (flatten) 把 2?維的 8×8 重塑成?1?維的 64。
看看訓(xùn)練集中前 100 張圖片和對應(yīng)的標(biāo)簽 (左下角藍(lán)色小字)。像素很低 (為了我們跑模型快些),但基本上還是能看清。
多類別分類
手寫數(shù)字有 0-9 十類,但手頭上只有兩分類估計(jì)器 (比如像支撐向量機(jī)) 怎么用呢?我們可以采取下面三種常見策略:
一對一 (One vs One, OvO):一個(gè)分類器用來處理數(shù)字 0 和數(shù)字 1,一個(gè)用來處理數(shù)字 0 和數(shù)字 2,一個(gè)用來處理數(shù)字 1 和 2,以此類推。N 個(gè)類需要 N(N-1)/2 個(gè)分類器。
一對其他 (One vs All, OvA):訓(xùn)練 10 個(gè)二分類器,每一個(gè)對應(yīng)一個(gè)數(shù)字,第一個(gè)分類 1 和「非1」,第二個(gè)分類 2 和「非2」,以此類推。N 個(gè)類需要 N 個(gè)分類器。
OneVsOneClassifier
考慮一個(gè)具體天氣多分類問題,天氣可以是晴天、陰天和雨天,在 OvO 中,三個(gè)分類器為?f1?,?f2?和?f3?。
f1?負(fù)責(zé)分類三角形和正方形
f2?負(fù)責(zé)分類三角形和圓形
f3?負(fù)責(zé)分類圓形和正方形
結(jié)果如下
f1?預(yù)測 ▲
f2?預(yù)測 ▲?
f3?預(yù)測 ●
根據(jù)多數(shù)原則得到的結(jié)合預(yù)測為 ●,如下圖所示。
回到數(shù)字分類問題上,代碼如下:
10 類 45 個(gè) OvO 分類器,沒錯(cuò),10*9/2 = 45。
print( len(ovo_lr.estimators_) ) ovo_lr.estimators_訓(xùn)練集分類全對,測試集準(zhǔn)確率 98%。
OneVsRestClassifier
在 OvA 中,把數(shù)據(jù)分成“某個(gè)”和“其他”
圖一,某個(gè) = 三角形,其他 = 正方形和圓形
圖二,某個(gè) = 正方形,其他 = 三角形和圓形
圖三,某個(gè) = 圓形,其他 = 三角形和正方形
三分類分解成三個(gè)二分類,對應(yīng)的分類器為 f1?, f2?和?f3?。
f1?預(yù)測負(fù)類,即預(yù)測 ● 和 ?
f2?預(yù)測負(fù)類,即預(yù)測 ▲ 和 ●
f3?預(yù)測正類,即預(yù)測 ●
三個(gè)分類器都預(yù)測了 ●,根據(jù)多數(shù)原則得到的預(yù)測是 ●。
回到數(shù)字分類問題上,代碼如下:
10 類 45 個(gè) OvA 分類器,沒錯(cuò)。
print( len(ova_lr.estimators_) ) ova_lr.estimators_訓(xùn)練集準(zhǔn)確率幾乎 100%,測試集準(zhǔn)確率 96%。
多標(biāo)簽分類
到目前為止,所有的樣例都總是被分配到僅一個(gè)類。有些情況下,你也許想讓分類器給一個(gè)樣例輸出多個(gè)類別。在無人駕駛的應(yīng)用中,在下圖識別出有車和指示牌,沒有交通燈和人。
我們不打算深入物體識別。先看一個(gè)簡單點(diǎn)的例子,僅僅是為了闡明「多標(biāo)簽分類」的原理。在手寫數(shù)字的例子上,我們特意為每個(gè)數(shù)字設(shè)計(jì)了多標(biāo)簽:
標(biāo)簽 1 - 奇數(shù)、偶數(shù)
標(biāo)簽 2 - 小于等于 4,大于 4
再建立多標(biāo)簽 y_train_multilabel,代碼如下 (OneVsRestClassifier 也可以用來做多標(biāo)簽分類):
from sklearn.multiclass import OneVsRestClassifiery_train_multilabel = np.c_[ y_train%2==0, y_train<=4 ] print(y_train_multilabel)[[ True True][False False][False False]...[False False][False False][False False]]看下圖訓(xùn)練集第 1 和 2 個(gè)圖片是數(shù)字 4 和 5,對應(yīng)上面兩標(biāo)簽當(dāng)然是
[True True]:4 是偶數(shù),小于等于 4
[False False]:5 不是偶數(shù),大于 4
訓(xùn)練模型,只不過這時(shí)用的是 y_train_multilabel。
有兩個(gè)估計(jì)器,每個(gè)對應(yīng)一個(gè)標(biāo)簽。
展示一下測試集上 100 張圖片。
第一張圖片是數(shù)字 2,它是偶數(shù) (標(biāo)簽 1 為 true),小于等于 4?(標(biāo)簽 2 為 true)。
print( y_test[:1] ) print( ova_ml.predict(X_test[:1,:]) )[2] [[1?1]]4.3
Multioutput 估計(jì)器
sklearn.multioutput?可以處理多輸出 (multi-output) 的分類問題。
多輸出分類是多標(biāo)簽分類的泛化,在這里每一個(gè)標(biāo)簽可以是多類別 (大于兩個(gè)類別) 的。一個(gè)例子就是預(yù)測圖片每一個(gè)像素(標(biāo)簽) 的像素值是多少 (從 0 到 255 的 256 個(gè)類別)。
Multioutput 估計(jì)器有兩個(gè):
MultiOutputRegressor: 多輸出回歸? ?
MultiOutputClassifier: 多輸出分類
本節(jié)只關(guān)注多輸出分類。
MultiOutputClassifier
首先引入?MultiOutputClassifier 和 RandomForestClassifier。你看,這兩個(gè)都是元估計(jì)器,因此在 Sklearn 里面估計(jì)器可以隨意組合。
from sklearn.multioutput import MultiOutputClassifier from sklearn.ensemble import RandomForestClassifier在手寫數(shù)字的例子上,我們也為特意每個(gè)數(shù)字設(shè)計(jì)了多標(biāo)簽而且每個(gè)標(biāo)簽的類別都大于二。
標(biāo)簽 1 - 小于等于 4,4 和 7 之間,大于等于 7 (三類)
標(biāo)簽 2 - 數(shù)字本身 (十類)
代碼如下:
用含有 100 棵決策樹的隨機(jī)森林來解決這個(gè)多輸入分類問題。
看看這個(gè)模型在測試集前五張照片上的預(yù)測。
MO.predict( X_test[:5,:] )array([[0, 2],[0, 2],[0, 0],[2, 9],[1, 5]])這個(gè) ndarray 第一列是標(biāo)簽 1 的類別,第二列是標(biāo)簽 2 的類別。預(yù)測結(jié)果是這五張照片分別顯示數(shù)字 2, 2, 0, 9, 5 (標(biāo)簽 2),它們前三個(gè)數(shù) 2, 2, 0 都小于等于 4 (標(biāo)簽 1 第一類),第四個(gè)數(shù) 9 大于等于 7 (標(biāo)簽 1 第二類),而第五個(gè)數(shù) 5 在 4 和 7 之間 (標(biāo)簽 1 第三類)。
再看看真實(shí)標(biāo)簽。
y_test_1st = y_test.copy() y_test_1st[ y_test<=4 ] = 0 y_test_1st[ np.logical_and(y_test>4, y_test<7) ] = 1 y_test_1st[ y_test>=7 ] = 2y_test_multioutput = np.c_[ y_test_1st, y_test ]y_test_multioutput[:5]array([[0, 2],[0, 2],[0, 0],[2, 9],[1, 5]])相當(dāng)好!
4.4
Model Selection 估計(jì)器
模型選擇 (Model Selction) 在機(jī)器學(xué)習(xí)非常重要,它主要用于評估模型表現(xiàn),常見的?Model Selection 估計(jì)器有以下幾個(gè):
cross_validate: 評估交叉驗(yàn)證的表現(xiàn)。
learning_curve: 建立學(xué)習(xí)曲線。? ?
GridSearchCV: 用交叉驗(yàn)證從網(wǎng)格中一組超參數(shù)搜索出最佳超參數(shù)。
RandomizedSearchCV: 用交叉驗(yàn)證從一組隨機(jī)超參數(shù)搜索出最佳超參數(shù)。
本小節(jié)關(guān)注調(diào)節(jié)超參數(shù)的兩個(gè)估計(jì)器,即上面列出的最后兩個(gè)。它們都要用到交叉驗(yàn)證,先來了解一下這個(gè)知識點(diǎn)。
交叉驗(yàn)證
K-折交叉驗(yàn)證集 (K-fold cross validation set),就是把整個(gè)數(shù)據(jù)集平均但隨機(jī)分成 K 份,每份大概包含 m/K 個(gè)數(shù)據(jù) (m 是總數(shù)據(jù)數(shù))。
在這 K 份,每次選 1 份作為訓(xùn)練集在擬合參數(shù) wλ,把參數(shù)用在剩下 K-1 份驗(yàn)證集上計(jì)算誤差。由于遍歷了這 K 份數(shù)據(jù),因此該操作稱為交叉驗(yàn)證。
如何通過選擇交叉驗(yàn)證誤差來選擇模型描述如下。
接下來我們來看這兩個(gè)調(diào)參的估計(jì)器,網(wǎng)格追蹤和隨機(jī)追蹤。
網(wǎng)格追蹤:參數(shù) 1 在 [1, 10, 100, 1000] 中取值,參數(shù) 2 在 [0.01, 0.1, 1 10] 中取值,注意并不是等間距取值。模型在所有 16 個(gè)組合跑,選取一對對應(yīng)最小交叉驗(yàn)證誤差的參數(shù)。
隨機(jī)追蹤:根據(jù)指定分布隨機(jī)搜索,可以選擇獨(dú)立于參數(shù)個(gè)數(shù),比如 log(參數(shù) 1) 服從 0 到 3 的均勻分布,?log(參數(shù) 2) 服從 -2 到 1 的均勻分布。此外,會(huì)設(shè)定一個(gè)預(yù)算參數(shù)。
原理講清楚了,看代碼吧。
解釋一下代碼:
前 10 行就是引入各種包,并準(zhǔn)備好 X 和 y,創(chuàng)建一個(gè)含 20 個(gè)決策樹的隨機(jī)森林模型,那么它有超參數(shù)最大樹深、最多特征數(shù)、最小可分裂樣本數(shù)、和分裂標(biāo)準(zhǔn)。
第 12-27 行是運(yùn)行隨機(jī)追蹤,關(guān)鍵點(diǎn)是建立了一個(gè)參數(shù)分布 (param_dist),而且還預(yù)先設(shè)定了個(gè)迭代組數(shù) n_iter_search=20。
第 22-42 行是運(yùn)行網(wǎng)格追蹤,關(guān)鍵點(diǎn)是建立了一個(gè)參數(shù)網(wǎng)格 (param_grid)。
解釋一下運(yùn)行結(jié)果:
第一行輸出每種追蹤法運(yùn)行的多少次和花的時(shí)間。
第二行輸出最佳超參數(shù)的組合。
第三行輸出最高得分。
由上面結(jié)果可知,隨機(jī)追蹤比網(wǎng)格追蹤用更短時(shí)間內(nèi)找到一組超參數(shù),獲得了更高的得分。
4.5
Pipeline?估計(jì)器
Pipeline 估計(jì)器又叫流水線,把各種估計(jì)器串聯(lián) (Pipeline) 或并聯(lián) (FeatureUnion) 的方式組成一條龍服務(wù)。用好了它真的能大大提高效率。
Pipeline
Pipeline 將若干個(gè)估計(jì)器按順序連在一起,比如
????特征提取 -> 降維 -> 擬合 -> 預(yù)測
在整個(gè) Pipeline 中,它的屬性永遠(yuǎn)和最后一個(gè)估計(jì)器屬性一樣
如果最后一個(gè)估計(jì)器是預(yù)測器,那么?Pipeline?是預(yù)測器
如果最后一個(gè)估計(jì)器是轉(zhuǎn)換器,那么?Pipeline?是轉(zhuǎn)換器
下面用一個(gè)簡單例子來說明如果用 Pipeline 來做「先填補(bǔ)缺失值-再標(biāo)準(zhǔn)化」這兩步的。先生成含缺失值 NaN 的數(shù)據(jù) X。
首先引入 Pipeline,再引入
處理缺失值的轉(zhuǎn)換器 SimpleImputer
做規(guī)劃化的轉(zhuǎn)換器 MinMaxScaler
第 4-7 行創(chuàng)建了流水線,范式非常簡單,就在 Pipeline() 里一個(gè)輸入「含名稱的估計(jì)器的列表」。SimpleImputer 起名叫 impute,MinMaxScaler起名叫?normalize。
由于最后一個(gè)估計(jì)器是轉(zhuǎn)換器,因此 pipe 也是個(gè)轉(zhuǎn)換器。寫好了就可以那它來做「先填補(bǔ)缺失值-再標(biāo)準(zhǔn)化」的重復(fù)工作了。
看看運(yùn)行結(jié)果,值都被填滿了,而且兩列也被標(biāo)準(zhǔn)化了。
來驗(yàn)證上面流水線的參數(shù),我們可以按順序來運(yùn)行這兩個(gè)轉(zhuǎn)換器,結(jié)果是一樣的。
FeatureUnion
如果我們想在一個(gè)節(jié)點(diǎn)同時(shí)運(yùn)行幾個(gè)估計(jì)器,我們可用 FeatureUnion。下例首先建立一個(gè) DataFrame,
前兩列智力 IQ 和脾氣 temper 都是分類型變量
后兩列收入 income 和身高 height 都是數(shù)值型變量
每列中都有缺失值
我們現(xiàn)在按下列步驟來清洗數(shù)據(jù)。
對分類型變量:獲取 -> 中位數(shù)填充 -> 獨(dú)熱編碼
對數(shù)值型變量:獲取 -> 均值填充 -> 標(biāo)準(zhǔn)化
上面兩步是平行進(jìn)行的。
首先我們自己定義一個(gè)從 DataFrame 里面獲取每列的類,起名叫 DataFrameSelector。
知識點(diǎn)
代碼不難,主要就是 transform 函數(shù)中,將輸入的 DataFrame X 根據(jù)屬性名稱來獲取其值。
接下來建立一個(gè)流水線 full_pipe,它并聯(lián)著兩個(gè)流水線
categorical_pipe 處理分類型變量
DataFrameSelector 用來獲取
SimpleImputer 用出現(xiàn)最多的值來填充 None
OneHotEncoder 來編碼返回非稀疏矩陣
numeric_pipe 處理數(shù)值型變量
DataFrameSelector 用來獲取
SimpleImputer 用均值來填充 NaN
normalize 來規(guī)范化數(shù)值
下面代碼非常漂亮。
將結(jié)果打印出來,齊活!
X_proc = full_pipe.fit_transform( X ) print( X_proc )[[1. ????????0.12 0. 1. 0. 0. 1. ][0.77777778 0.72 1. 0. 0. 1. 0. ][0.55555556 0.48 1. 0. 0. 0. 1. ][0. ????????0.52 0. 0. 1. 1. 0. ][0.04444444 1. ??0. 1. 0. 1. 0. ][0.11111111 0. ??1. 0. 0. 1. 0. ][0.08888889 0.92 0. 1. 0. 1. 0. ][0.34166667 0.52 0. 1. 0. 1. 0. ][0.15555556 0.4 ?0. 1. 0. 1. 0. ]]5
總結(jié)
Sklearn 里面設(shè)計(jì) API 遵循五大原則。
一致性
所有對象的接口一致且簡單,在「估計(jì)器」中
創(chuàng)建:model = Constructor(hyperparam)
擬參:
有監(jiān)督學(xué)習(xí) -?model.fit(X_train, y_train)
無監(jiān)督學(xué)習(xí) -?model.fit(X_train)
在「預(yù)測器」中
有監(jiān)督學(xué)習(xí)里預(yù)測標(biāo)簽:y_pred = model.predict(X_test)
無監(jiān)督學(xué)習(xí)里識別模式:idx_pred = model.predict( Xtest)
在「轉(zhuǎn)換器」中
創(chuàng)建:trm = Constructor(hyperparam)
獲參:trm.fit(X_train)
轉(zhuǎn)換:X_trm = trm.transform(X_train)
可檢驗(yàn)
所有估計(jì)器里設(shè)置的超參數(shù)和學(xué)到的參數(shù)都可以通過實(shí)例的變量直接訪問來檢驗(yàn)其值,區(qū)別是超參數(shù)的名稱最后沒有下劃線 _,而參數(shù)的名稱最后有下劃線 _。舉例如下:
通例:model.hyperparameter
特例:SVC.kernel
通例:model.parameter_
特例:SVC.support_vectors_
標(biāo)準(zhǔn)類
Sklearn 模型接受的數(shù)據(jù)集的格式只能是「Numpy 數(shù)組」和「Scipy 稀疏矩陣」。超參數(shù)的格式只能是「字符」和「數(shù)值」。
不接受其他的類!
可組成
模塊都能重復(fù)「連在一起」或「并在一起」使用,比如兩種形式流水線 (pipeline)
任意轉(zhuǎn)換器序列?
任意轉(zhuǎn)換器序列 + 估計(jì)器
有默認(rèn)
Sklearn 給大多超參數(shù)提供了合理的默認(rèn)值,大大降低了建模的難度。
結(jié)合本帖講的總結(jié)一套機(jī)器學(xué)習(xí)的初級框架:
確定任務(wù):是「有監(jiān)督」的分類或回歸?還是「無監(jiān)督」的聚類或降維?確定好后基本就能知道用 Sklearn 里哪些模型了。
數(shù)據(jù)預(yù)處理:這步最繁瑣,要處理缺失值、異常值;要編碼分類型變量;要正規(guī)化或標(biāo)準(zhǔn)化數(shù)值型變量,等等。但是有了 Pipeline 神器一切變得簡單高效。
訓(xùn)練和評估:這步最簡單,訓(xùn)練用估計(jì)器 fit() 先擬合,評估用預(yù)測器?predict() 來評估。
選擇模型:啟動(dòng) Model Selection 估計(jì)器里的?GridSearchCV 和 RandomizedSearchCV,選擇得分最高的那組超參數(shù) (即模型)。
本帖講的東西有點(diǎn)抽象,但最核心的東西就是弄懂估計(jì)器以及元估計(jì)器的原理。剩下的就是 1) 了解各種模型,2) 知道模型中每個(gè)參數(shù)的含義,3) 查閱 Sklearn 官方文檔。非深度的機(jī)器學(xué)習(xí)不像深度學(xué)習(xí)有那么多調(diào)參技巧 (tuning trick),按照上面那套框架足夠了。
本站qq群955171419,加入微信群請掃碼:
總結(jié)
以上是生活随笔為你收集整理的【机器学习】Python机器学习的神器- Scikit-learn使用说明的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: edge浏览器下载位置设置在哪里设置
- 下一篇: 【Python】7种方案,彻底实现可视化