- 圖解機(jī)器學(xué)習(xí)算法
- (日)秋庭伸也 杉山阿圣 寺田學(xué)
- 7623字
- 2022-01-10 14:57:46
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 列的矩陣后,X
和 y
的行就能一一對(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)
上面的代碼使用 model
(LogisticRegression
的實(shí)例)的 fit
方法訓(xùn)練模型,方法的參數(shù)是特征值 X
和目標(biāo)變量 y
。
在調(diào)用 fit
方法后,model
成為學(xué)習(xí)后的模型。
▼示例代碼
y_pred = model.predict(X)
上面的代碼使用學(xué)習(xí)后的模型 model
的 predict
方法對(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í)前的模型 model
的 fit_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í)慣上分別以別名 np
和 plt
調(diào)用 numpy
和 matplotlib
的 pyplot
。
下面以 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)
x2
和y2
的散點(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)
x2
和y2
的折線圖如圖 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ù)分別賦值給 x3
和 y3
。
下面輸出散點(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
。與 numpy
的 np
一樣,習(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í)的算法。
- Greenplum:從大數(shù)據(jù)戰(zhàn)略到實(shí)現(xiàn)
- 計(jì)算機(jī)信息技術(shù)基礎(chǔ)實(shí)驗(yàn)與習(xí)題
- SQL Server 2008數(shù)據(jù)庫(kù)應(yīng)用技術(shù)(第二版)
- 數(shù)據(jù)庫(kù)應(yīng)用基礎(chǔ)教程(Visual FoxPro 9.0)
- iOS and OS X Network Programming Cookbook
- 深入淺出MySQL:數(shù)據(jù)庫(kù)開發(fā)、優(yōu)化與管理維護(hù)(第2版)
- 城市計(jì)算
- 計(jì)算機(jī)應(yīng)用基礎(chǔ)教程上機(jī)指導(dǎo)與習(xí)題集(微課版)
- SQL應(yīng)用及誤區(qū)分析
- Oracle數(shù)據(jù)庫(kù)管理、開發(fā)與實(shí)踐
- 數(shù)據(jù)修復(fù)技術(shù)與典型實(shí)例實(shí)戰(zhàn)詳解(第2版)
- 大數(shù)據(jù)與機(jī)器學(xué)習(xí):實(shí)踐方法與行業(yè)案例
- Access 2010數(shù)據(jù)庫(kù)程序設(shè)計(jì)實(shí)踐教程
- MySQL技術(shù)內(nèi)幕:InnoDB存儲(chǔ)引擎
- Microsoft Dynamics NAV 2015 Professional Reporting