日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

【机器学习】Python机器学习的神器- Scikit-learn使用说明

發(fā)布時(shí)間:2025/3/12 python 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【机器学习】Python机器学习的神器- Scikit-learn使用说明 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


全文共 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 SomeModel

SomeClassifier,?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ù)值

    print( model.score( X_test, y_test ) ) print( np.sum(y_pred==y_test)/len(y_test) )1.0 1.0decision_score = model.decision_function( X_test ) print( decision_score )

    為了驗(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 和 windraw 和 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 輸入。

    from sklearn.preprocessing import OneHotEncoder OHE = OneHotEncoder()num = LE.fit_transform( enc ) print( num ) OHE_y = OHE.fit_transform( num.reshape(-1,1) ) OHE_y[2 0 1 2]<4x3 sparse matrix of type '<class 'numpy.float64'>' with 4 stored elements in Compressed Sparse Row format>

    上面結(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ù)。

    OHE_y.toarray()array([[0., 0., 1.],[1., 0., 0.],[0., 1., 0.],[0., 0., 1.]])

    二.?用 DataFrame作為?OneHotEncoder?輸入。

    OHE = OneHotEncoder() OHE.fit_transform( enc_DF ).toarray()array([[0., 0., 1.],[1., 0., 0.],[0., 1., 0.],[0., 0., 1.]])

    和上面結(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): 1

    VotingClassifier

    和隨機(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): 1

    4.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)簽。

    print( len(ova_ml.estimators_) ) ova_ml.estimators_

    展示一下測試集上 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),按照上面那套框架足夠了。

    往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機(jī)器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印機(jī)器學(xué)習(xí)在線手冊深度學(xué)習(xí)筆記專輯《統(tǒng)計(jì)學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專輯 AI基礎(chǔ)下載黃海廣老師《機(jī)器學(xué)習(xí)課程》視頻課黃海廣老師《機(jī)器學(xué)習(xí)課程》711頁完整版課件

    本站qq群955171419,加入微信群請掃碼:

    總結(jié)

    以上是生活随笔為你收集整理的【机器学习】Python机器学习的神器- Scikit-learn使用说明的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。