86scikit-learn 機(jī)器學(xué)習(xí)入門實(shí)戰(zhàn)--機(jī)器學(xué)習(xí)和 scikit-learn 介紹

機(jī)器學(xué)習(xí)和 scikit-learn 介紹

監(jiān)督學(xué)習(xí)介紹

機(jī)器學(xué)習(xí)中,我們通常會(huì)接觸到:監(jiān)督學(xué)習(xí)、無監(jiān)督學(xué)習(xí)、半監(jiān)督學(xué)習(xí),強(qiáng)化學(xué)習(xí)等不同的應(yīng)用類型。其中,監(jiān)督學(xué)習(xí)(英語:Supervised learning)是最為常見,且應(yīng)用最為廣泛的分支之一。
監(jiān)督學(xué)習(xí)的目標(biāo)是從已知訓(xùn)練數(shù)據(jù)中學(xué)習(xí)一個(gè)預(yù)測(cè)模型,使得這個(gè)模型對(duì)于其他輸入數(shù)據(jù)產(chǎn)生一個(gè)預(yù)測(cè)輸出。其中,監(jiān)督學(xué)習(xí)的「監(jiān)督」是相對(duì)與「無監(jiān)督」的一種表達(dá),二者的區(qū)別在于,監(jiān)督學(xué)習(xí)的訓(xùn)練數(shù)據(jù)經(jīng)過了人工進(jìn)行標(biāo)注,而無監(jiān)督學(xué)習(xí)則沒有這個(gè)過程。

image.png

如同上面的兩個(gè)簡(jiǎn)單的數(shù)據(jù)集。左邊的數(shù)據(jù)集明顯沒有經(jīng)過標(biāo)注。而右邊數(shù)據(jù)集則進(jìn)行了顏色標(biāo)注,也就是人為給數(shù)據(jù)樣本打上了橙色、綠色和藍(lán)色的標(biāo)簽。
監(jiān)督學(xué)習(xí)的類型
監(jiān)督學(xué)習(xí)中,所面對(duì)的問題大致分為兩類:分類和回歸。
其中,分類問題可以簡(jiǎn)單概括為:已有了一些數(shù)據(jù)樣本及明確的樣本分類?,F(xiàn)在從這些樣本的特征中總結(jié)規(guī)律,再用于判斷新輸入樣本到底屬于哪一類別。例如下圖展示了一個(gè)分類過程,使用監(jiān)督學(xué)習(xí)算法對(duì)水果進(jìn)行類別區(qū)分。
image.png

分類的例子在生活中處處可見。比如這里正在講,監(jiān)督學(xué)習(xí)可以分為分類和回歸一樣。而面對(duì)一個(gè)新問題,判斷它是屬于分類還是回歸,就需要根據(jù)這個(gè)問題具備的特征來判斷。

其中,回歸問題與分類問題的最大區(qū)別(特征)在于,輸出變量的類型不同。詳細(xì)來說:
分類問題,輸出為有限個(gè)離散變量,布爾值或者定類變量。
回歸問題,輸出為連續(xù)變量,一般為實(shí)數(shù),也就是一個(gè)確切值。

舉個(gè)例子,當(dāng)我們預(yù)測(cè)一個(gè)人的性別時(shí),就是一個(gè)典型的分類問題。而預(yù)測(cè)一個(gè)人的年齡時(shí),則應(yīng)看作是回歸問題。

無監(jiān)督學(xué)習(xí)介紹

什么是無監(jiān)督學(xué)習(xí)?籠統(tǒng)來講,它和監(jiān)督學(xué)習(xí)是一個(gè)相對(duì)的概念。在監(jiān)督學(xué)習(xí)的過程中,我們需要對(duì)訓(xùn)練數(shù)據(jù)打上標(biāo)簽,這是必不可少的一步。而無監(jiān)督學(xué)習(xí)面對(duì)的數(shù)據(jù)是沒有標(biāo)簽的。
舉個(gè)例子,比如我們現(xiàn)在有一堆動(dòng)物的照片。在監(jiān)督學(xué)習(xí)中,我們需要提前對(duì)每張照片代表的動(dòng)物進(jìn)行標(biāo)記。這一張是狗,那一張是貓,然后再進(jìn)行訓(xùn)練。最后,模型對(duì)于新輸入的照片,就能分清楚動(dòng)物的類別。
當(dāng)進(jìn)行無監(jiān)督學(xué)習(xí)時(shí),照片并未進(jìn)行標(biāo)注。我們需要將所有的訓(xùn)練樣本照片「喂」給算法即可。注意,這個(gè)時(shí)候和監(jiān)督學(xué)習(xí)有一些不同,無監(jiān)督學(xué)習(xí)只能識(shí)別出訓(xùn)練樣本里包含了幾種類別的動(dòng)物,而并不能直接告訴你這只是貓,那一只是狗。但是,這里的類別數(shù)量一般都不會(huì)太大,你可以手動(dòng)對(duì)類別進(jìn)行標(biāo)記,再將數(shù)據(jù)用于其他用途。
上面這個(gè)例子中,無監(jiān)督學(xué)習(xí)識(shí)別出樣本包含幾種類別,就是我們通常所說的「聚類」。如下圖所示,演示了一個(gè)無監(jiān)督的聚類過程。
https://doc.shiyanlou.com/courses/uid214893-20190522-1558510522231
當(dāng)然,上面所說的聚類只是無監(jiān)督學(xué)習(xí)主要面對(duì)的問題,實(shí)際上無監(jiān)督學(xué)習(xí)還包括降維等更多的應(yīng)用方面。機(jī)器學(xué)習(xí)中,當(dāng)我們使用到的數(shù)據(jù)沒有特定標(biāo)簽時(shí),基本都可以被歸為無監(jiān)督學(xué)習(xí)問題。

scikit-learn 介紹

機(jī)器學(xué)習(xí)常用的算法有很多,例如:線性回歸、支持向量機(jī)、k 近鄰、決策樹、樸素貝葉斯、邏輯回歸等。其中的一些算法都有著比較復(fù)雜的數(shù)學(xué)過程,如果每一次都需要自己通過代碼實(shí)現(xiàn)這些算法,那么機(jī)器學(xué)的門檻就變得很高了。
scikit-learn 是一個(gè)十分流行的開源機(jī)器學(xué)習(xí)工具,它基于 Python 的 NumPySciPy 庫構(gòu)建,將眾多的機(jī)器學(xué)習(xí)算法封裝起來,往往只需要幾行代碼,通過簡(jiǎn)單的方法類調(diào)用,就可以實(shí)現(xiàn)原本復(fù)雜的機(jī)器學(xué)習(xí)模型,在學(xué)術(shù)界和工業(yè)界廣泛使用。
scikit-learn 中的數(shù)據(jù)
在 scikit-learn 中實(shí)現(xiàn)的大多數(shù)機(jī)器學(xué)習(xí)算法都將數(shù)據(jù)存儲(chǔ)在二維數(shù)組或矩陣中。數(shù)組可以是 numpy 數(shù)組,在某些情況下是 scipy.sparse 矩陣。數(shù)組的大小為 (n_samples,n_features),其中:
n_samples:樣本數(shù)量:每個(gè)樣本都是要處理(例如分類)的項(xiàng)目。樣本可以是文檔、圖片、聲音、視頻、數(shù)據(jù)庫或CSV文件中的一行,或者可以用一組定量描述的任何東西。
n_features:特征數(shù)量,每個(gè)值定量描述樣本特征。特征通常是實(shí)值,但在某些情況下可能是布爾值或離散值。特征數(shù)量必須預(yù)先確定,有些樣本特征數(shù)量為零,有些維度可能非常高(例如數(shù)百萬個(gè)特征)。對(duì)于特征很多的樣本,scipy.sparse 矩陣會(huì)很有用,因?yàn)樗鼈儽?numpy 數(shù)組的存儲(chǔ)效率更高。

讓我們拿 scikit-learn 的內(nèi)置數(shù)據(jù)集 iris data(鳶尾屬植物數(shù)據(jù)集)作為一個(gè)例子,看看簡(jiǎn)單數(shù)據(jù)集的數(shù)據(jù)結(jié)構(gòu),在這個(gè)數(shù)據(jù)集中,包括了三類不同的鳶尾屬植物:Iris Setosa,Iris Versicolour,Iris Virginica。每類收集了 50 個(gè)樣本,因此這個(gè)數(shù)據(jù)集一共包含了 150 個(gè)樣本。該數(shù)據(jù)集測(cè)量了所有 150 個(gè)樣本的 4 個(gè)特征,分別是(單位都是厘米 cm):
sepal length(花萼長(zhǎng)度)
sepal width(花萼寬度)
petal length(花瓣長(zhǎng)度)
petal width(花瓣寬度)

from sklearn.datasets import load_iris  # 導(dǎo)入內(nèi)置數(shù)據(jù)集中的鳶尾屬植物數(shù)據(jù)集
iris = load_iris()
iris.keys()  # 查看數(shù)據(jù)集的所有鍵

查看 data 的數(shù)據(jù):

n_samples, n_features = iris.data.shape
print(iris.data.shape)
print((n_samples, n_features))
print(iris.feature_names)
print(iris.data[0])

從上面代碼運(yùn)行結(jié)果來看,此數(shù)據(jù)集共有 150 個(gè)樣本,每個(gè)樣本有 4 個(gè)特征,特征用實(shí)數(shù)定量表示。
我們?cè)倏纯?target 和 target_names 的數(shù)據(jù):

print(iris.target.shape)
print(iris.target)
print(iris.target_names)

從結(jié)果來看,該數(shù)據(jù)集 150 個(gè)樣本被分為了三類:setosa、versicolor、virginica,分別用 0、1、2 表示。
接下來將數(shù)據(jù)用圖像的形式展示出來,可以對(duì)該數(shù)據(jù)集有一個(gè)直觀的整體印象。利用該數(shù)據(jù)集 4 個(gè)特征中的后兩個(gè),即花瓣的長(zhǎng)度和寬度,來展示所有的樣本點(diǎn)。

import matplotlib.pyplot as plt
%matplotlib inline
plt.style.use('ggplot')


X = iris.data  # 只包括樣本的特征,150 x 4
y = iris.target  # 樣本的類型,[0, 1, 2]
features = iris.feature_names  # 4 個(gè)特征的名稱
targets = iris.target_names  # 3 類鳶尾花的名稱,跟 y 中的 3 個(gè)數(shù)字對(duì)應(yīng)

plt.figure(figsize=(10, 4))
plt.plot(X[:, 2][y == 0], X[:, 3][y == 0],
         'bs', label=targets[0])  # setosa 類繪圖
plt.plot(X[:, 2][y == 1], X[:, 3][y == 1], 'kx',
         label=targets[1])  # versicolor 類繪圖
plt.plot(X[:, 2][y == 2], X[:, 3][y == 2], 'ro',
         label=targets[2])  # virginica 類繪圖
plt.xlabel(features[2])  # features[2] = pental length(cm)
plt.ylabel(features[3])  # features[3] = pental width(cm)
plt.title('Iris Data Set')
plt.legend()
plt.savefig('Iris Data Set.png', dpi=200)  # 保存圖片
plt.show()

scikit-learn 中的三種數(shù)據(jù)生成的方法:
Packaged Data:一些小型數(shù)據(jù)集是 scikit-learn 內(nèi)置的,可以使用 sklearn.datasets.load_ * 模塊生成,上面的鳶尾花植屬數(shù)據(jù)集就是由這個(gè)模塊導(dǎo)入的。
Downloadable Data:一些可供下載的較大的數(shù)據(jù)集,可用 sklearn.datasets.fetch_ * 簡(jiǎn)化下載過程,生成數(shù)據(jù)。
Generated Data:還有些數(shù)據(jù)集是根據(jù)隨機(jī)數(shù)種子從模型生成的,可用 sklearn.datasets.make_ * 生成。
scikit-learn 估計(jì)器
每個(gè)算法都是通過一個(gè) scikit-learn 的估計(jì)器(Estimator)實(shí)現(xiàn)的,比如調(diào)用線性回歸的估計(jì)器:

from sklearn.linear_model import LinearRegression

構(gòu)建相應(yīng)的模型 model,并設(shè)置模型參數(shù):

model = LinearRegression()
print(model)

代碼運(yùn)行結(jié)果如下:

LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)

model 模型的輸出參數(shù),即是這個(gè)估計(jì)器的默認(rèn)參數(shù)。當(dāng)然,你可以參考 官方文檔 中的說明來自定義參數(shù)。
估計(jì)器接口
scikit-learn 為所有的方法提供了一些統(tǒng)一的接口,用估計(jì)器構(gòu)建了相應(yīng)的模型 model 之后,可以使用以下方法:

在所有估計(jì)器中可用:
model.fit():擬合訓(xùn)練數(shù)據(jù)。對(duì)于監(jiān)督學(xué)習(xí),它接受兩個(gè)參數(shù):數(shù)據(jù) X 和標(biāo)簽 y,例如 model.fit(X,y)。對(duì)于無監(jiān)督學(xué)習(xí),此方法僅接受單個(gè)參數(shù),即數(shù)據(jù) X(例如 model.fit(X))。

在監(jiān)督學(xué)習(xí)估計(jì)器中可用:
model.predict():給定一個(gè)訓(xùn)練后的模型,預(yù)測(cè)新數(shù)據(jù)集的標(biāo)簽。此方法接受一個(gè)參數(shù),即新數(shù)據(jù) X_new,例如 model.predict(X_new),并返回?cái)?shù)組中每個(gè)對(duì)象的學(xué)習(xí)后的標(biāo)簽。
model.predict_proba():對(duì)于分類問題,一些估計(jì)器也提供了此方法,該方法返回新數(shù)據(jù)具有每個(gè)分類標(biāo)簽的概率。在這種情況下,model.predict()只返回概率最高的標(biāo)簽。
model.score():對(duì)于分類或回歸問題,此方法返回一個(gè)數(shù)值,在 0 到 1 之間,分?jǐn)?shù)越高表示適合度越高。

在無監(jiān)督學(xué)習(xí)估計(jì)器中可用:
model.predict():在聚類算法中預(yù)測(cè)標(biāo)簽。
model.transform():給定一個(gè)無監(jiān)督學(xué)習(xí)模型,對(duì)數(shù)據(jù)進(jìn)行處理,轉(zhuǎn)化為另一種類型的數(shù)據(jù),一般用于特征抽取和轉(zhuǎn)換,通常會(huì)轉(zhuǎn)換為向量,比如正則化或者歸一化。
model.fit_transform():fit_transform 是 fit 和 transform 的組合,fit_transform(partData) 對(duì)部分?jǐn)?shù)據(jù)先擬合 fit,找到該 part 的整體指標(biāo),如均值、方差、最大值最小值等(根據(jù)具體轉(zhuǎn)換的目的),然后對(duì)該 partData 進(jìn)行轉(zhuǎn)換 transform,從而實(shí)現(xiàn)數(shù)據(jù)的標(biāo)準(zhǔn)化、歸一化等。再根據(jù)之前部分 fit 擬合的整體指標(biāo),對(duì)剩余的數(shù)據(jù)(restData)使用同樣的均值、方差、最大最小值等指標(biāo)進(jìn)行轉(zhuǎn)換 transform(restData),從而保證 partData、restData 處理方式相同。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容