官术网_书友最值得收藏!

1.2 機(jī)器學(xué)習(xí)的步驟

機(jī)器學(xué)習(xí)具體要做哪些事情呢?本節(jié)的目標(biāo)就是使讀者了解機(jī)器學(xué)習(xí)的大致步驟。通過閱讀本節(jié),讀者將對(duì)作為機(jī)器學(xué)習(xí)算法基礎(chǔ)的處理流程有所理解,并學(xué)到機(jī)器學(xué)習(xí)的基本概念。

數(shù)據(jù)的重要性

在使用機(jī)器學(xué)習(xí)時(shí),必須要有匯總并整理到一定程度的數(shù)據(jù)。以數(shù)據(jù)為基礎(chǔ),按規(guī)定的法則進(jìn)行學(xué)習(xí),最終才能進(jìn)行預(yù)測(cè)。

沒有數(shù)據(jù),就不能進(jìn)行機(jī)器學(xué)習(xí)。換言之,收集數(shù)據(jù)是首先要做的事情。本節(jié)將說明機(jī)器學(xué)習(xí)的訓(xùn)練過程的一系列流程。為了便于理解,本節(jié)基于示例數(shù)據(jù)進(jìn)行講解,使用的是主流機(jī)器學(xué)習(xí)庫(kù) scikit-learn 包內(nèi)置的數(shù)據(jù),這個(gè)數(shù)據(jù)便于入手,可自由使用。

專欄 數(shù)據(jù)收集、數(shù)據(jù)預(yù)處理的重要性

在實(shí)際用機(jī)器學(xué)習(xí)解決問題之前,要先收集數(shù)據(jù),有時(shí)還需要做問卷調(diào)查,甚至購(gòu)買數(shù)據(jù)。然后,需要為收集到的數(shù)據(jù)人工標(biāo)注答案標(biāo)簽,或者將其加工為機(jī)器學(xué)習(xí)算法易于處理的形式,刪除無用的數(shù)據(jù),加入從別的數(shù)據(jù)源獲得的數(shù)據(jù)等。另外,基于平均值和數(shù)據(jù)分布等統(tǒng)計(jì)觀點(diǎn)查看數(shù)據(jù),或者使用各種圖表對(duì)數(shù)據(jù)進(jìn)行可視化,把握數(shù)據(jù)的整體情況也很重要。此外,有時(shí)還需要對(duì)數(shù)據(jù)進(jìn)行正則化處理。

這些操作被稱為數(shù)據(jù)預(yù)處理。有這樣一種說法:機(jī)器學(xué)習(xí)工作 80% 以上的時(shí)間花在了數(shù)據(jù)預(yù)處理上。

 

專欄 scikit-learn 包

scikit-learn 是一個(gè)機(jī)器學(xué)習(xí)庫(kù),包含了各種用于機(jī)器學(xué)習(xí)的工具。

這個(gè)庫(kù)以 BSD 許可證開源,誰(shuí)都可以免費(fèi)、自由地使用。在寫作本書時(shí)(2019 年 3 月),它的最新版本是 0.20.3。scikit-learn 實(shí)現(xiàn)了許多有監(jiān)督學(xué)習(xí)和無監(jiān)督學(xué)習(xí)的算法,是一套包含了用于評(píng)估的工具、方便的函數(shù)、示例數(shù)據(jù)集等的工具套件。在機(jī)器學(xué)習(xí)領(lǐng)域,scikit-learn 已成為事實(shí)上的標(biāo)準(zhǔn)庫(kù),它具有兩大優(yōu)點(diǎn):一是操作方法統(tǒng)一;二是易于在 Python 中使用。關(guān)于 Python 環(huán)境的設(shè)置和 scikit-learn 的安裝方法,請(qǐng)參考第 5 章。

數(shù)據(jù)和學(xué)習(xí)的種類

前面說過,沒有數(shù)據(jù),就不能進(jìn)行機(jī)器學(xué)習(xí)。具體來說,機(jī)器學(xué)習(xí)需要的是什么樣的數(shù)據(jù)呢?

機(jī)器學(xué)習(xí)需要的是二維的表格形式的數(shù)據(jù)(根據(jù)解決問題的目的不同,存在例外的情況)。表格的列中含有表示數(shù)據(jù)本身特征的多種信息,行則是由多個(gè)信息構(gòu)成的數(shù)據(jù)集。接下來,我們看一個(gè)更具體的例子:學(xué)校的某個(gè)社團(tuán)有 4 名學(xué)生,下面的表 1-4 是每個(gè)學(xué)生的姓名、身高、體重、出生日期和性別信息的數(shù)據(jù)。

▼表 1-4 表格形式的學(xué)生數(shù)據(jù)

我們思考一下用機(jī)器學(xué)習(xí)進(jìn)行性別預(yù)測(cè)的問題。

因?yàn)橐A(yù)測(cè)的是性別,所以性別列的男或女的數(shù)據(jù)就是預(yù)測(cè)對(duì)象。本書把預(yù)測(cè)對(duì)象的數(shù)據(jù)稱為目標(biāo)變量。不過,根據(jù)分類的場(chǎng)景的不同,有時(shí)也稱為標(biāo)簽類別標(biāo)簽數(shù)據(jù),對(duì)應(yīng)的英文單詞為 target。

除了性別之外的 4 個(gè)列(姓名、身高、體重、出生日期)是用于預(yù)測(cè)的原始數(shù)據(jù)。本書將用于預(yù)測(cè)的原始數(shù)據(jù)稱為特征值,根據(jù)場(chǎng)景的不同,有時(shí)也稱為特征變量輸入變量,對(duì)應(yīng)的英文單詞為 feature。

了解示例數(shù)據(jù)

我們看一下 scikit-learn 包中內(nèi)置的示例數(shù)據(jù)。這里顯示了部分鳶尾花(iris)數(shù)據(jù)(表 1-5)。Python 生態(tài)圈中用于處理數(shù)據(jù)的工具有 pandas,它常與 scikit-learn 搭配使用。關(guān)于使用 pandas 處理數(shù)據(jù)的方法,請(qǐng)參考后文的“使用 pandas 理解和處理數(shù)據(jù)”部分。

下面輸出數(shù)據(jù)的基本信息。

▼示例代碼

import pandas as pd
from sklearn.datasets import load_iris
data = load_iris()
X = pd.DataFrame(data.data, columns=data.feature_names)
y = pd.DataFrame(data.target, columns=["Species"])
df = pd.concat([X, y], axis=1)
df.head()

▼表 1-5 部分鳶尾花數(shù)據(jù)

列方向上有 sepal length(cm)、sepal width(cm)、petal length(cm)、petal width(cm)、Species 這 5 種信息,意思分別是鳶尾花的萼片長(zhǎng)度、萼片寬度、花瓣長(zhǎng)度、花瓣寬度、品種。前面 4 列是表示特征的特征值,最后 1 列是目標(biāo)變量。在這個(gè)數(shù)據(jù)集中,目標(biāo)變量的值為 0、1、2 這 3 個(gè)值之一。

本書在講解的過程中使用了基于 scikit-learn 庫(kù)編寫的代碼。下面將講解 scikit-learn 的大致用法。不過本書不會(huì)全面講解 scikit-learn 的功能。關(guān)于 scikit-learn 的詳細(xì)信息,請(qǐng)參考官方文檔和其他圖書。

有監(jiān)督學(xué)習(xí)(分類)的例子

本節(jié)將介紹基于有監(jiān)督學(xué)習(xí)解決分類問題的實(shí)現(xiàn)方法。

下面依次來看例題和實(shí)現(xiàn)方法。

例題

例題采用的是美國(guó)威斯康星州乳腺癌數(shù)據(jù)集。這個(gè)數(shù)據(jù)集中包含 30 個(gè)特征值,目標(biāo)變量的值為“良性”或者“惡性”。數(shù)據(jù)數(shù)量有 569 條,其中“惡性”(M)數(shù)據(jù) 212 條,“良性”(B)數(shù)據(jù) 357 條。換言之,這是根據(jù) 30 個(gè)特征值判斷結(jié)果是惡性還是良性的二元分類問題。

下面看一下數(shù)據(jù)長(zhǎng)什么樣子(表 1-6)。

▼表 1-6 部分乳腺癌數(shù)據(jù)

這份數(shù)據(jù)可以通過 scikit-learn 包讀取。

▼示例代碼

from sklearn.datasets import load_breast_cancer
data = load_breast_cancer()

這段代碼用于導(dǎo)入 scikit-learn 內(nèi)置的讀取數(shù)據(jù)集的函數(shù),并將所讀取的數(shù)據(jù)保存在變量 data 中。

接下來,從數(shù)據(jù)集中取出特征值賦給 X,取出目標(biāo)變量賦給 y

▼示例代碼

X = data.data
y = data.target

X 由多個(gè)特征值向量構(gòu)成,我們將其作為矩陣處理,因此遵照慣例使用大寫字母作為變量名。y 是目標(biāo)變量的向量,其元素值的含義為:0 表示惡性(M),1 表示良性(B)。

X 是大小為 569 × 30 的數(shù)據(jù),可將其看作 569 行 30 列的矩陣。雖然 y 是向量,但把它當(dāng)作 569 行 1 列的矩陣后,Xy 的行就能一一對(duì)應(yīng)了。比如特征值 X 的第 10 行與目標(biāo)變量 y 的第 10 個(gè)元素相對(duì)應(yīng)(圖 1-7)。

▲圖 1-7 與 y 的第 10 個(gè)元素對(duì)應(yīng)

要想詳細(xì)了解這個(gè)數(shù)據(jù)集,需要具備相應(yīng)的醫(yī)學(xué)知識(shí),但是這里我們僅將其作為數(shù)值,對(duì)其進(jìn)行有監(jiān)督學(xué)習(xí)的二元分類。特征值共有 30 個(gè),分為平均值、誤差值、最差值 3 類,每類包括 10 項(xiàng),分別為半徑、紋理、面積等。這次我們著眼于平均值、誤差值、最差值這 3 類數(shù)據(jù)中的平均值(圖 1-8)。

▲圖 1-8 特征值的種類

▼示例代碼

X = X[:, :10]

這行操作使得只有平均值被重新賦值給了變量 X,用作特征值的數(shù)據(jù)現(xiàn)在縮減到了 10 項(xiàng)。

實(shí)現(xiàn)方法

下面趁熱打鐵,基于美國(guó)威斯康星州乳腺癌數(shù)據(jù)集創(chuàng)建并訓(xùn)練進(jìn)行二元分類的模型。這里使用的分類算法是邏輯回歸。雖然算法名中有“回歸”二字,卻能用于分類,詳細(xì)內(nèi)容請(qǐng)參考 2.3 節(jié)。

▼示例代碼

from sklearn.linear_model import LogisticRegression
model = LogisticRegression()

注意 在使用 scikit-learn 進(jìn)行模型的初始化和訓(xùn)練時(shí),讀者有可能會(huì)看到輸出的警告信息。警告信息是 FutureWarning,即對(duì)將來有可能會(huì)變更的功能的通知,在訓(xùn)練不收斂時(shí)有可能會(huì)出現(xiàn)。本書沒有提及警告的輸出,如果讀者在實(shí)踐中發(fā)現(xiàn)有警告輸出,請(qǐng)根據(jù)警告內(nèi)容采取相應(yīng)的措施。

為了使用邏輯回歸模型,上面的代碼導(dǎo)入了 scikit-learn 的 LogisticRegression 類,然后創(chuàng)建了 LogisticRegression 類的實(shí)例,并將已初始化的模型賦給了 model

▼示例代碼

model.fit(X, y)

上面的代碼使用 modelLogisticRegression 的實(shí)例)的 fit 方法訓(xùn)練模型,方法的參數(shù)是特征值 X 和目標(biāo)變量 y

在調(diào)用 fit 方法后,model 成為學(xué)習(xí)后的模型。

▼示例代碼

y_pred = model.predict(X)

上面的代碼使用學(xué)習(xí)后的模型 modelpredict 方法對(duì)學(xué)習(xí)時(shí)用到的特征值 X 進(jìn)行預(yù)測(cè),并將預(yù)測(cè)結(jié)果賦給變量 y_pred

評(píng)估方法

下面介紹分類的評(píng)估方法。

首先看一下正確率(詳見第 4 章)。這里使用 scikit-learn 的 accuracy_score 函數(shù)查看正確率。

▼示例代碼

from sklearn.metrics import accuracy_score
accuracy_score(y, y_pred)
0.9086115992970123

代碼的輸出結(jié)果是學(xué)習(xí)后的模型預(yù)測(cè)的結(jié)果 y_pred 相對(duì)于作為正確答案的目標(biāo)變量 y 的正確率。

這個(gè)驗(yàn)證通常應(yīng)使用另外準(zhǔn)備的一些不用于學(xué)習(xí)的數(shù)據(jù)來進(jìn)行,否則會(huì)產(chǎn)生過擬合(overfitting)問題。過擬合是有監(jiān)督學(xué)習(xí)的一個(gè)嚴(yán)重問題。有監(jiān)督學(xué)習(xí)追求的是正確預(yù)測(cè)未知的數(shù)據(jù),但是現(xiàn)在輸出的正確率是使用學(xué)習(xí)時(shí)用過的數(shù)據(jù)計(jì)算出來的。這就意味著我們不知道模型對(duì)于未用于學(xué)習(xí)的未知數(shù)據(jù)的預(yù)測(cè)性能的好壞,不知道得到的學(xué)習(xí)后的模型是不是真正優(yōu)秀。關(guān)于過擬合,詳見 4.1 節(jié)的“模型的過擬合”部分。

關(guān)于評(píng)估方法,還有其他問題需要考慮。比如,只看正確率就能判斷結(jié)果是否正確嗎?根據(jù)數(shù)據(jù)的特性不同,有些情況下不能保證分類是正確的。這次用的數(shù)據(jù)中有“惡性”數(shù)據(jù) 212 條,“良性”數(shù)據(jù) 357 條,可以說是在一定程度上均衡的數(shù)據(jù)。

對(duì)于“良性”“惡性”極不均衡的數(shù)據(jù),光看正確率無法判斷結(jié)果是否正確。我們?cè)僖粤硗庖唤M數(shù)據(jù)為例,看一下 30 歲~ 39 歲人群的癌癥檢測(cè)數(shù)據(jù)。通常來說,診斷為惡性的數(shù)據(jù)只占整體的百分之幾,大多數(shù)人沒有腫瘤或者腫瘤是良性的。對(duì)于這樣的數(shù)據(jù),如果模型將所有的樣本都判斷為良性的,那么盡管正確率很高,但光看正確率也不能正確評(píng)估這個(gè)模型(圖 1-9)。

▲圖 1-9 光看正確率無法正確評(píng)估模型

關(guān)于這些內(nèi)容,第 4 章會(huì)詳細(xì)介紹。

無監(jiān)督學(xué)習(xí)(聚類)的例子

下面看一下無監(jiān)督學(xué)習(xí)的聚類問題的實(shí)現(xiàn)方法的各個(gè)步驟。與前面一樣,這里我們也使用 scikit-learn 包。

例題

例題采用的是 scikit-learn 包內(nèi)置的與葡萄酒種類有關(guān)的數(shù)據(jù)集。這個(gè)數(shù)據(jù)集有 13 個(gè)特征值,目標(biāo)變量是葡萄酒種類(表 1-7)。由于這次介紹的是無監(jiān)督學(xué)習(xí)的聚類算法,所以不使用目標(biāo)變量。簡(jiǎn)單起見,本次只使用 13 個(gè)特征值中的 alcohol(酒精度)和 color_intensity(色澤)兩個(gè)特征值(表 1-8)。我們對(duì)這個(gè)數(shù)據(jù)集應(yīng)用 聚類算法,將其分割為 3 個(gè)簇。

▼表 1-7 葡萄酒數(shù)據(jù)的特征值

▼表 1-8 本次使用的兩個(gè)特征值

下面使用 scikit-learn 包加載這個(gè)數(shù)據(jù)集。

▼示例代碼

from sklearn.datasets import load_wine
data = load_wine()

上面的代碼用于導(dǎo)入 scikit-learn 內(nèi)置的讀取葡萄酒數(shù)據(jù)集的函數(shù),并將讀取的數(shù)據(jù)保存在變量 data 中。

接著,僅從數(shù)據(jù)集中選擇 alcohol 列和 color_intensity 列作為特征值賦給 X。這么做是為了在顯示結(jié)果時(shí),只用二維圖形對(duì)結(jié)果進(jìn)行可視化。

▼示例代碼

X = data.data[:, [0, 9]]

特征值 X 是 178 行 2 列的數(shù)據(jù)。

實(shí)現(xiàn)方法

下面使用 算法實(shí)現(xiàn)聚類。

▼示例代碼

from sklearn.cluster import KMeans
n_clusters = 3
model = KMeans(n_clusters=n_clusters)

上面的代碼導(dǎo)入并使用了實(shí)現(xiàn) 算法的 KMeans 類。

初始化 KMeans 類,把它作為學(xué)習(xí)前的模型賦給變量 model。通過 n_clusters 參數(shù),指示模型將數(shù)據(jù)分為 3 個(gè)簇。

▼示例代碼

pred = model.fit_predict(X)

上面的代碼用于向?qū)W習(xí)前的模型 modelfit_predict 方法傳入特征值數(shù)據(jù)。預(yù)測(cè)結(jié)果賦給變量 pred

下面看一下賦給 pred 的數(shù)據(jù)是如何聚類的。

查看結(jié)果

這里將聚類的結(jié)果可視化。

由于本次使用的特征值只有兩種,所以繪制二維圖形即可實(shí)現(xiàn)結(jié)果的可視化。圖 1-10 是以圖形展示的聚類結(jié)果。圖形中每個(gè)數(shù)據(jù)點(diǎn)對(duì)應(yīng)的是一種葡萄酒。從數(shù)據(jù)點(diǎn)的顏色可以看出每種酒屬于哪個(gè)簇。3 個(gè)黃色的星星是各個(gè)簇的重心,是這 3 個(gè)簇的代表點(diǎn)。

▲圖 1-10 特征值的可視化

原本以酒精度、色澤變量表示的葡萄酒,現(xiàn)在以“屬于哪個(gè)簇”這種簡(jiǎn)潔直觀的形式展示了出來。此外,要想了解各個(gè)簇具有什么特征,只需查看作為代表點(diǎn)的重心的值即可。比如,第 3 個(gè)簇的特點(diǎn)是“酒精度低、色澤淡”。

通過 算法實(shí)現(xiàn)的聚類是以“將酒精度百分之多少以上的數(shù)據(jù)分到第 1 個(gè)簇”之類的規(guī)則進(jìn)行聚類的,這些規(guī)則不是由人預(yù)先設(shè)置的,而是由算法自動(dòng)進(jìn)行聚類得出的。這一點(diǎn)很重要,說明這個(gè)算法具有通用性,可應(yīng)用于葡萄酒之外的數(shù)據(jù)。

無監(jiān)督學(xué)習(xí)的評(píng)估方法將在第 3 章介紹各個(gè)算法時(shí)進(jìn)行說明,請(qǐng)參考相應(yīng)內(nèi)容。

可視化

可視化是利用圖形等把握數(shù)據(jù)的整體情況的方法。在機(jī)器學(xué)習(xí)領(lǐng)域中,許多場(chǎng)景下需要進(jìn)行可視化。有時(shí)用于了解數(shù)據(jù)的概況,有時(shí)用于以圖形展示機(jī)器學(xué)習(xí)的結(jié)果。

這里介紹一下使用 Python 進(jìn)行可視化的方法,書中也將展示作為可視化結(jié)果的圖形等。

工具介紹

這里使用常用的 Python 可視化工具 Matplotlib。Matplotlib 具有許多可視化功能。在可視化時(shí),為了使圖形美觀,需要編寫多行 Python 代碼來設(shè)置坐標(biāo)軸、標(biāo)簽、布局和配色等。代碼行數(shù)的增加容易讓人覺得晦澀難懂,但其實(shí)用于輸出圖形的重要部分的代碼只有寥寥幾行。

在使用 Matplotlib 實(shí)現(xiàn)可視化后,我們就能很容易地把握數(shù)據(jù)的偏差和特征等信息,所以要掌握它的用法。

Python 的可視化工具不只有 Matplotlib,還有以下幾種。

  • pandas

    pandas 是處理數(shù)組數(shù)據(jù)的庫(kù),也具有可視化功能。

     

  • seaborn

    seaborn 在 Matplotlib 的基礎(chǔ)上強(qiáng)化了表現(xiàn)力,用起來更簡(jiǎn)單。

     

  • Bokeh

    Bokeh 使用了 JavaScript,可用于顯示動(dòng)態(tài)圖形。

在瀏覽器上顯示

使用 Jupyter Notebook 可以簡(jiǎn)單地在瀏覽器上顯示數(shù)據(jù)的可視化結(jié)果。

Jupyter Notebook 是在 Web 瀏覽器上運(yùn)行 Python 等語(yǔ)言代碼的環(huán)境(圖 1-11)。

▲圖 1-11 在 Jupyter Notebook 上運(yùn)行 Python 代碼

下面依次來看一下例題及其實(shí)現(xiàn)。

在 Jupyter Notebook 上運(yùn)行 Python 程序,進(jìn)行機(jī)器學(xué)習(xí)的實(shí)驗(yàn)。Jupyter Notebook 不僅能運(yùn)行 Python,還可以作為 R 等語(yǔ)言的運(yùn)行環(huán)境。

關(guān)于 Jupyter Notebook 的安裝和環(huán)境設(shè)置方法,請(qǐng)參考第 5 章。

啟動(dòng)方法

在 Jupyter Notebook 安裝成功后,就可以使用 jupyter 命令了。我們可以從命令提示行和終端運(yùn)行 jupyter notebook 命令。

$ jupyter notebook

在命令運(yùn)行后,瀏覽器將自動(dòng)打開,顯示已運(yùn)行的當(dāng)前目錄的文件或文件夾(圖 1-12)。在 Web 瀏覽器上的單元格內(nèi)輸入程序代碼后,頁(yè)面上將顯示運(yùn)行結(jié)果。運(yùn)行結(jié)果為 notebook 格式的文件,以 .ipynb 擴(kuò)展名保存。用戶還可以在自己的計(jì)算機(jī)上打開其他人創(chuàng)建的 .ipynb 文件,按順序執(zhí)行每個(gè)單元格并查看其運(yùn)行結(jié)果。也可以查看中間處理的變量,改變條件再次運(yùn)行以查看不同的結(jié)果。

▲圖 1-12 顯示文件列表

此外,把這種文件提交到 GitHub 后,不僅可以分享運(yùn)行結(jié)果,還可以在 GitHub 上以圖形顯示運(yùn)行結(jié)果。

用法

從右上角的 New 菜單選擇 Python 3,可新建 notebook 格式的文件(圖 1-13)。

▲圖 1-13 新建 notebook 文件

Web 瀏覽器將打開新建的文件。

在叫作單元格的輸入框里編寫程序代碼。此外,單元格有不同的種類,可通過界面上的 Code 和 Markdown 等下拉菜單決定單元格的作用。默認(rèn)選項(xiàng)是 Code,系統(tǒng)將其識(shí)別為可運(yùn)行的單元格(圖 1-14)。

▲圖 1-14 可運(yùn)行的 notebook

在單元格內(nèi)輸入程序代碼后,使用 Enter 鍵在單元格內(nèi)換行,使用 Ctrl 和 Enter 組合鍵運(yùn)行程序代碼。另外,可使用 Shift 和 Enter 組合鍵運(yùn)行程序代碼,并移動(dòng)到下一個(gè)單元格。

點(diǎn)擊上部的標(biāo)題 Untitled,可修改文件的標(biāo)題(圖 1-15)。Jupyter Notebook 會(huì)自動(dòng)在此處確定的標(biāo)題后附加擴(kuò)展名 .ipynb,以此作為文件名創(chuàng)建文件。

▲圖 1-15 修改 notebook 的標(biāo)題

從菜單選擇 Save and Checkpoint,可保存當(dāng)前的狀態(tài)。

上面簡(jiǎn)要地介紹了 Jupyter Notebook 的使用方法。除此之外,它還有很多方便的用法,感興趣的讀者可參考官網(wǎng)、相關(guān)的文章和圖書。

圖形的種類和畫法:使用 Matplotlib 顯示圖形的方法

在頁(yè)面上顯示圖形

在 Jupyter Notebook 頁(yè)面上可顯示圖形。在 Code 單元格內(nèi),運(yùn)行 %matplotlib inline 這個(gè)以 % 開始的“魔法”命令后,即使不運(yùn)行后面將介紹的 show方法,頁(yè)面上也會(huì)輸出圖形(圖 1-16)。

▲圖 1-16 在 notebook 內(nèi)顯示圖形

下面看一下圖 1-16 中的代碼。

▼示例代碼

import numpy as np
import matplotlib.pyplot as plt

上面的代碼為了生成數(shù)據(jù)而導(dǎo)入了 numpy,為了顯示圖形而導(dǎo)入了 matplotlib。NumPy 是以數(shù)組形式處理數(shù)據(jù)并進(jìn)行高效計(jì)算的 Python 第三方包。習(xí)慣上分別以別名 npplt 調(diào)用 numpymatplotlibpyplot

下面以 sin 曲線為例,顯示其圖形。

▼示例代碼

x1 = np.linspace(-5, 5, 101)
y1 = np.sin(x1)
  • x1 中保存的是為顯示 sin 曲線而生成的從 -5 到 5 的 101 個(gè)數(shù)據(jù)。
  • y1 中保存的是使用 NumPy 的 sin 函數(shù)生成的數(shù)據(jù)。

下面以用 Matplotlib 繪制 sin 曲線的圖形為例進(jìn)行說明。

最簡(jiǎn)單的顯示圖形的方法是 plt.plot(x1, y1)(圖 1-17)。

▼示例代碼

plt.plot(x1, y1)

▲圖 1-17 sin 曲線的圖形

下面介紹使用 Matplotlib 繪制圖形的代碼的標(biāo)準(zhǔn)寫法。前面只是簡(jiǎn)單地調(diào)用了 plt.plot,這種做法沒有明確輸出對(duì)象,只是聲明“在這里繪圖”,比較粗糙。嚴(yán)密的做法應(yīng)為先創(chuàng)建要繪制的對(duì)象,再輸出圖形,代碼及圖形如下(圖 1-18)。

▼示例代碼

fig, ax = plt.subplots()
ax.set_title("Sin")
ax.set_xlabel("rad")
ax.plot(x1, y1)
handles, labels = ax.get_legend_handles_labels()
ax.legend(handles, labels)
plt.show()

▲圖 1-18 先創(chuàng)建對(duì)象再輸出圖形

上面的代碼包含了顯示標(biāo)簽和坐標(biāo)軸名稱等信息的處理,因此變成了 7 行,但其中用于顯示圖形的主要代碼只有 ax.plot(x1, y1) 一行。雖然這種方法更受歡迎,不過如果要輸出簡(jiǎn)單的圖形,可以使用 plt.plot(x1, y1) 形式。請(qǐng)記住,方法共有兩種:一種是 plt.plot 這種簡(jiǎn)易方法;另一種是 ax.plot 這種嚴(yán)密地面向?qū)ο筮M(jìn)行聲明的方法。最后運(yùn)行 plt.show()。如果已運(yùn)行魔法命令 %matplotlib inline,那就不用特意調(diào)用 show 了。為了使代碼在 Jupyter Notebook 之外的環(huán)境中也能輸出圖形,這里特意編寫了這一行代碼。不管寫不寫這行代碼,圖形都會(huì)在 Jupyter Notebook 中顯示。

繪制各種圖形

首先生成用于顯示圖形的數(shù)據(jù)。

▼示例代碼

x2 = np.arange(100)
y2 = x2 * np.random.rand(100)

x2 中保存的是元素為“從 0 到 99 的整數(shù)”的數(shù)組。

y2 中保存的是元素為“在從 0 到 1 的范圍內(nèi)隨機(jī)選出的 100 個(gè)數(shù)據(jù)”的數(shù)組與剛才的變量 x2 相乘的結(jié)果。

下面將使用這兩個(gè)變量繪制各種圖形。

接下來要展示的是通過 plt 變量聲明圖形形式的簡(jiǎn)易方法的示例。對(duì)于前面代碼中明示圖形位置的 ax 變量,我們也可以用同樣的方式輸出其圖形。

  • 散點(diǎn)圖

    使用 scatter 方法繪制散點(diǎn)圖。

    ▼示例代碼

    plt.scatter(x2, y2)

    x2y2 的散點(diǎn)圖如圖 1-19 所示。

    ▲圖 1-19 散點(diǎn)圖

     

  • 直方圖

    使用 hist 方法繪制直方圖。

    ▼示例代碼

    plt.hist(y2, bins=5)

    設(shè) y2 的直方圖的 bin 為 5,輸出的圖形如圖 1-20 所示。

    ▲圖 1-20 直方圖

     

  • 柱狀圖

    使用 bar 方法繪制柱狀圖。

    plt.bar(x2, y2)

    輸出的柱狀圖如圖 1-21 所示。

    ▲圖 1-21 柱狀圖

     

  • 折線圖

    使用 plot 方法繪制折線圖。

    ▼示例代碼

    plt.plot(x2, y2)

    x2y2 的折線圖如圖 1-22 所示。

    ▲圖 1-22 折線圖

     

  • 箱形圖

    使用 boxplot 方法繪制箱形圖。

    ▼示例代碼

    plt.boxplot(y2)

    用箱形圖輸出 y2 的數(shù)據(jù),如圖 1-23 所示。箱形圖是查看數(shù)據(jù)分布的優(yōu)秀的可視化方法。

    ▲圖 1-23 箱形圖

紅酒數(shù)據(jù)集

下面對(duì) scikit-learn 內(nèi)置的紅酒數(shù)據(jù)進(jìn)行可視化。

▼示例代碼

from sklearn.datasets import load_wine
data = load_wine()

加載與紅酒有關(guān)的數(shù)據(jù),并將數(shù)據(jù)保存在變量 data 中。

▼示例代碼

x3 = data.data[:, [0]]
y3 = data.data[:, [9]]

將要顯示的索引為 0 的 alcohol(酒精度)和索引為 9 的 color_intensity(色澤)數(shù)據(jù)分別賦值給 x3y3

下面輸出散點(diǎn)圖(圖 1-24)。

▼示例代碼

plt.scatter(x3, y3)

▲圖 1-24 紅酒數(shù)據(jù)集的散點(diǎn)圖

下面輸出 y3 的直方圖(圖 1-25)。

▼示例代碼

plt.hist(y3, bins=5)

▲圖 1-25  的直方圖

通過可視化查看與紅酒數(shù)據(jù)集相關(guān)的兩個(gè)圖形,我們可以了解數(shù)據(jù)的特性。

使用 pandas 理解和處理數(shù)據(jù)

注意 在進(jìn)行機(jī)器學(xué)習(xí)時(shí),有時(shí)會(huì)查看特征值、對(duì)數(shù)據(jù)進(jìn)行取舍選擇或再加工等。下面將介紹如何使用 pandas 庫(kù)的數(shù)據(jù)可視化的方便功能去了解數(shù)據(jù)的情況。已經(jīng)知道 pandas 基本用法的讀者和想先了解機(jī)器學(xué)習(xí)算法的讀者,跳過這一部分也沒關(guān)系。

下面介紹使用 pandas 庫(kù)進(jìn)行數(shù)據(jù)可視化的方便功能。

▼示例代碼

import pandas as pd

上面的代碼導(dǎo)入了常用于機(jī)器學(xué)習(xí)數(shù)據(jù)的變形等操作的 pandas。與 numpynp 一樣,習(xí)慣上用 pd 來調(diào)用它。

▼示例代碼

from sklearn.datasets import load_wine
data = load_wine()
df_X = pd.DataFrame(data.data, columns=data.feature_names)

然后將紅酒數(shù)據(jù)轉(zhuǎn)換為 pandas 的 DataFrame。

DataFrame 可以方便地處理像 Excel 工作表那樣的二維數(shù)據(jù)。df_X 是 DataFrame 形式的特征值。

下面的代碼調(diào)用 head 方法輸出了數(shù)據(jù)集前 5 行的數(shù)據(jù)(表 1-9),用于查看數(shù)據(jù)集中包含了什么樣的數(shù)據(jù)。

▼示例代碼

df_X.head()

▼表 1-9 紅酒數(shù)據(jù)

接著將紅酒數(shù)據(jù)的目標(biāo)變量轉(zhuǎn)換為 pandas 的 DataFrame。

▼示例代碼

df_y = pd.DataFrame(data.target, columns=["kind(target)"])

接下來看一下轉(zhuǎn)換后的數(shù)據(jù)。做法和剛才相同:調(diào)用 head 方法。從表 1-10 中可以看出,df_y 是名副其實(shí)的目標(biāo)變量數(shù)據(jù)。

▼表 1-10 紅酒數(shù)據(jù)的目標(biāo)變量

▼示例代碼

df_y.head()

為了便于使用,我們將這些數(shù)據(jù)合并在一起。下面使用 pandas 的 concat 將特征值 df_X 和目標(biāo)變量 df_y 合并。

▼示例代碼

df = pd.concat([df_X, df_y], axis=1)

輸出數(shù)據(jù)的前幾行看看。下面的代碼使用 head 方法輸出了合并結(jié)果的前 5 行(表 1-11)。這樣就得到了包含特征值和目標(biāo)變量的數(shù)據(jù)。

▼示例代碼

df.head()

▼表 1-11 紅酒數(shù)據(jù)的特征值和目標(biāo)變量

接下來,通過可視化和數(shù)理統(tǒng)計(jì)來分析這份數(shù)據(jù)。

圖 1-26 是以直方圖的形式輸出的 alcohol 列的數(shù)據(jù)。由于下面的代碼沒有指定 bins 參數(shù),所以程序使用默認(rèn)的參數(shù)值 10,輸出了有 10 個(gè)區(qū)間的直方圖。

▼示例代碼

plt.hist(df.loc[:, "alcohol"])

▲圖 1-26 有 10 個(gè)區(qū)間的直方圖

圖 1-27 是以箱形圖顯示的同一個(gè) alcohol 列的數(shù)據(jù)。接下來開始使用 pandas 的統(tǒng)計(jì)功能。

▼示例代碼

plt.boxplot(df.loc[:, "alcohol"])

▲圖 1-27 以箱形圖顯示的 alcohol 列的數(shù)據(jù)

下面的代碼使用 corr 方法匯總計(jì)算并輸出了相關(guān)系數(shù)(表 1-12)。相關(guān)系數(shù)越接近于 1,越表明數(shù)據(jù)之間是正相關(guān)關(guān)系;越接近于 -1,越表明數(shù)據(jù)之間是負(fù)相關(guān)關(guān)系。換言之,如果相關(guān)系數(shù)在 0 左右,表明數(shù)據(jù)列之間的相關(guān)性很低。

▼示例代碼

df.corr()

▼表 1-12 相關(guān)系數(shù)

下面再介紹一個(gè)查看數(shù)據(jù)情況的方法。

describe 方法用于輸出每列的統(tǒng)計(jì)信息。輸出的統(tǒng)計(jì)信息從上到下依次為行數(shù)、平均值、標(biāo)準(zhǔn)差、最小值、25 百分位數(shù)、中位數(shù)、75 百分位數(shù)、最大值(表 1-13)。從統(tǒng)計(jì)信息可以看出每列包含的數(shù)據(jù)具有何種特性、有沒有缺損等信息。

▼示例代碼

df.describe()

▼表 1-13 統(tǒng)計(jì)信息

下面使用 pandas 的功能將所有列之間的關(guān)系可視化(圖 1-28)。

使用 scatter_matrix 輸出散點(diǎn)圖矩陣。這里將 14 列全都輸出了出來(圖 1-28)。

▼示例代碼

from pandas.plotting import scatter_matrix
_ = scatter_matrix(df, figsize=(15, 15))

▲圖 1-28 各列的關(guān)聯(lián)性

下面只查看部分列的關(guān)聯(lián)性。

下列代碼輸出的是從所有散點(diǎn)圖矩陣中選出的索引為 0 的列、索引為 9 的列和最后一列的關(guān)聯(lián)性(圖 1-29)。通過像這樣減少散點(diǎn)圖矩陣輸出的列,能夠看出更細(xì)致的情況。

▼示例代碼

_ = scatter_matrix(df.iloc[:, [0, 9, -1]])

▲圖 1-29 顯示重要的關(guān)聯(lián)性

本章小結(jié)

本章前半部分介紹了機(jī)器學(xué)習(xí)的基礎(chǔ)內(nèi)容:機(jī)器學(xué)習(xí)包括有監(jiān)督學(xué)習(xí)和無監(jiān)督學(xué)習(xí)等,存在與分類問題、回歸問題、降維和聚類對(duì)應(yīng)的算法。

后半部分介紹了機(jī)器學(xué)習(xí)庫(kù) scikit-learn,并列舉了有監(jiān)督學(xué)習(xí)(分類)和無監(jiān)督學(xué)習(xí)(聚類)的實(shí)現(xiàn)示例。最后,我們了解了使用可視化工具 Matplotlib 顯示圖形的方法。

到這里,事前準(zhǔn)備工作就結(jié)束了。從下一章開始,我們將正式學(xué)習(xí)機(jī)器學(xué)習(xí)的算法。

主站蜘蛛池模板: 西平县| 丁青县| 永兴县| 丹东市| 奉贤区| 望都县| 宝坻区| 武安市| 巴彦淖尔市| 保康县| 华安县| 全州县| 上虞市| 山阴县| 卓尼县| 金堂县| 荣成市| 凌源市| 和静县| 工布江达县| 漳平市| 吴桥县| 淳化县| 邓州市| 鹿泉市| 彭泽县| 井研县| 宁城县| 保靖县| 普洱| 德安县| 昌宁县| 左贡县| 香港 | 山西省| 卓尼县| 新宁县| 花莲市| 天等县| 平泉县| 太和县|