第3章 監(jiān)督學(xué)習(xí)_第1頁(yè)
第3章 監(jiān)督學(xué)習(xí)_第2頁(yè)
第3章 監(jiān)督學(xué)習(xí)_第3頁(yè)
第3章 監(jiān)督學(xué)習(xí)_第4頁(yè)
第3章 監(jiān)督學(xué)習(xí)_第5頁(yè)
已閱讀5頁(yè),還剩140頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第2章監(jiān)督學(xué)習(xí)3.1K近鄰算法3.2線性回歸3.3嶺回歸3.4LASSON回歸3.5邏輯回歸3.6樸素貝葉斯算法3.7決策樹3.8隨機(jī)森林3.9核支持向量機(jī)3.10神經(jīng)網(wǎng)絡(luò)3.11分類器的不確定性3.12小結(jié)3.1K近鄰算法

K近鄰(K-NearestNeighbor,KNN)算法是分類算法中最簡(jiǎn)單的算法,也是一種理論很成熟的機(jī)器學(xué)習(xí)算法,算法的核心思想是“近朱者赤,近墨者黑”。即KNN算法會(huì)根據(jù)訓(xùn)練集的數(shù)據(jù)構(gòu)建一個(gè)模型,然后對(duì)于輸入的新數(shù)據(jù),算法會(huì)將新數(shù)據(jù)的特征與訓(xùn)練集中對(duì)應(yīng)的特征進(jìn)行比對(duì)匹配,在訓(xùn)練集中找到與之相對(duì)較為相似的k個(gè)數(shù)據(jù),判斷未知樣本的標(biāo)簽。如果一個(gè)樣本在特征空間中的k個(gè)最相鄰的樣本中的大多數(shù)屬于某一個(gè)標(biāo)簽,則該樣本也屬于這個(gè)類別,并具有這個(gè)類別上樣本的特性。

那么問(wèn)題來(lái)了,這k個(gè)臨近的樣本是如何計(jì)算出來(lái)的,當(dāng)樣本中一半屬于A標(biāo)簽,一半屬于B標(biāo)簽的情況下如何處理呢?

KNN算法有多個(gè)參數(shù),但算法中主要有三個(gè)參數(shù)比較重要,分別是算法中的k值n_neighbors,權(quán)重weights,度量距離方法的選擇p、metric,只要這三個(gè)要素確定了,算法的預(yù)測(cè)方式也就確定了。分類決策

算法的分類決策規(guī)則通常采用多數(shù)表決法,即由樣本中k個(gè)鄰近最多的類別決定輸入數(shù)據(jù)的類別。如果存在恰好臨近多種類別的個(gè)數(shù)相同,這時(shí)權(quán)重weights就起到了作用,通過(guò)給臨近距離加權(quán)從中選擇一個(gè),這也是算法風(fēng)險(xiǎn)較小的原因。由于一般不改變,遇到相同的情況比較小或者可以改變k值再次預(yù)測(cè),所以我們把重點(diǎn)放在距離度量方式和k值選擇上。距離度量

在KNN算法中,常用的距離度量方式有三種,分別為曼哈頓距離、歐式距離和閔可夫斯基距離,默認(rèn)使用歐氏距離,最常用的也是歐式距離。下面是三種距離度量的公式,其中x1,x2,……,xn,y1,y2,……,yn分別是兩個(gè)數(shù)據(jù)點(diǎn)的特征值。

距離的選擇有兩個(gè)參數(shù)控制,一個(gè)是p值,一個(gè)是metric。當(dāng)metric=“minkowski”,p為2時(shí)是歐氏距離,p是1時(shí),是曼哈頓距離,p為其他值時(shí)是閔可夫斯基距離,從公式可以看出,歐氏距離、曼哈頓距離是閔可夫斯基的特例。k值選擇

k值大小的選擇是非常重要的要素之一。當(dāng)k=1時(shí),稱算法為最近鄰算法。

當(dāng)選擇的k值較小時(shí),就相當(dāng)于用較小的領(lǐng)域中的訓(xùn)練實(shí)例進(jìn)行預(yù)測(cè),訓(xùn)練誤差近似誤差小,泛化誤差會(huì)增大。預(yù)測(cè)結(jié)果對(duì)近鄰的實(shí)例點(diǎn)非常敏感,若此時(shí)近鄰的實(shí)例點(diǎn)是噪聲,預(yù)測(cè)就會(huì)出錯(cuò)。換句話說(shuō),k值較小就意味著整體模型變得復(fù)雜,容易發(fā)生過(guò)擬合。

k值較大,就相當(dāng)于用較大領(lǐng)域中的訓(xùn)練實(shí)例進(jìn)行預(yù)測(cè),泛化誤差小,但缺點(diǎn)是近似誤差大。一個(gè)極端是k等于樣本數(shù)m,則完全沒(méi)有分類,此時(shí)無(wú)論輸入實(shí)例是什么,都只是簡(jiǎn)單的預(yù)測(cè)它屬于在訓(xùn)練實(shí)例中最多的類,模型過(guò)于簡(jiǎn)單。換句話說(shuō),K值較大就意味著整體模型變得簡(jiǎn)單,容易發(fā)生欠擬合。工作原理k=1k=3鳶尾花數(shù)據(jù)集

鳶尾花數(shù)據(jù)集是一個(gè)三分類問(wèn)題,返回類型的是一個(gè)bunch對(duì)象,類似于Python中的字典,所以可以實(shí)現(xiàn)Python中字典的功能,例如利用鍵來(lái)查看相應(yīng)的值。數(shù)據(jù)集內(nèi)包含3個(gè)種類共150條數(shù)據(jù),每類各50個(gè)數(shù)據(jù)。數(shù)據(jù)集有4項(xiàng)特征:花萼長(zhǎng)度、花萼寬度、花瓣長(zhǎng)度、花瓣寬度,可以通過(guò)這4個(gè)特征預(yù)測(cè)鳶尾花卉屬于setosa,versicolour,virginica中的哪一個(gè)標(biāo)簽,即類別。fromsklearn.datasetsimportload_irisiris=load_iris()print(iris.keys())filename的功能是輸出數(shù)據(jù)集所在位置。DESCR中是該數(shù)據(jù)集的詳細(xì)解釋,里面說(shuō)明了數(shù)據(jù),特征的數(shù)目,特征信息,分類信息等。feature_names里是鳶尾花數(shù)據(jù)集的所有特征名。data里面包括了數(shù)據(jù)集中的數(shù)據(jù)。target_names保存了目標(biāo)名。target里面保存了目標(biāo)值。#利用KKNN算法的簡(jiǎn)單實(shí)例#導(dǎo)入相關(guān)包fromsklearn.datasetsimportload_irisfromsklearn.model_selectionimporttrain_test_splitfromsklearn.neighborsimportKNeighborsClassifier#加載數(shù)據(jù)集iris=load_iris()#劃分?jǐn)?shù)據(jù)集X_train,X_test,y_train,y_test=train_test_split(iris.data,iris.target,random_state=0)#加載算法knn=KNeighborsClassifier(n_neighbors=1)#訓(xùn)練數(shù)據(jù)集knn.fit(X_train,y_train)score=knn.score(X_test,y_test)print("預(yù)測(cè)結(jié)果:{}".format(knn.predict(X_test)))print("預(yù)測(cè)精度={}".format(score))#KNN算法用于二分類importnumpyasnpfromsklearn.neighborsimportKNeighborsClassifierfromsklearn.model_selectionimporttrain_test_splitdata=[[-3,-4],[-2,-2],[-5,-4],[-4,-2],[-1,-3],[1,3],[2,3],[1,2],[2,5],[3,4]]target=[0,0,0,0,0,1,1,1,1,1]X=np.array(data)y=np.array(target)X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=1)knn=KNeighborsClassifier(n_neighbors=1)knn.fit(X_train,y_train)score=knn.score(X_test,y_test)print("knn.score={}".format(score))對(duì)二分類數(shù)據(jù)可視化決策邊界可視化importmglearnimportnumpyasnpfromsklearn.model_selectionimporttrain_test_splitfromsklearn.neighborsimportKNeighborsClassifierimportmatplotlib.pyplotaspltdata=[[-3,-4],[-2,-2],[-5,-4],[-4,-2],[-1,-3],[1,3],[2,3],[1,2],[2,5],[3,4]]target=[0,0,0,0,0,1,1,1,1,1]X=np.array(data)y=np.array(target)X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=1)knn=KNeighborsClassifier(n_neighbors=1)fit=knn.fit(X,y)fig,axes=plt.subplots(figsize=(6,6))mglearn.plots.plot_2d_separator(fit,X,fill=True,eps=0.5,ax=axes,alpha=0.4)mglearn.discrete_scatter(X[:,0],X[:,1],y,ax=axes)plt.legend(["Class0","Class1"],loc=4)axes.set_xlabel("firstfeature")axes.set_ylabel("secondfeature")plt.show()

KNN算法雖然使分類算法,但是還可以用于回歸問(wèn)題。在分類任務(wù)中可使用投票法,選擇這K個(gè)樣本中出現(xiàn)最多的類別標(biāo)記作為預(yù)測(cè)結(jié)果;在回歸任務(wù)中可使用平均法,將這K個(gè)樣本的實(shí)值輸出標(biāo)記的平均值作為預(yù)測(cè)結(jié)果。當(dāng)然還可以基于距離遠(yuǎn)近程度進(jìn)行加權(quán)平均等方法。工作原理回歸問(wèn)題我們將用到sklearn中make_regression函數(shù)

n_samples表示生成數(shù)據(jù)集的數(shù)據(jù)數(shù)量,n_features表示特征數(shù),n_informative表示有信息的特征數(shù)量,也就是用來(lái)構(gòu)造線性模型,生成輸出的特征數(shù)量,n_targets表示回歸目標(biāo)的數(shù)量,也就是對(duì)應(yīng)于一個(gè)樣本輸出向量y的維度,默認(rèn)輸出是標(biāo)量,noise代表數(shù)據(jù)中噪聲數(shù)量。fromsklearn.datasetsimportmake_regressionfromsklearn.neighborsimportKNeighborsRegressorfromsklearn.model_selectionimporttrain_test_splitX,y=make_regression(n_samples=100,n_features=1,n_informative=1,noise=12,random_state=11)X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=11)knn=KNeighborsRegressor(n_neighbors=1)knn.fit(X_train,y_train)score=knn.score(X_test,y_test)print("knn.score={}".format(score))對(duì)knn算法參數(shù)進(jìn)行調(diào)整fromsklearn.datasetsimportmake_regressionfromsklearn.neighborsimportKNeighborsRegressorfromsklearn.model_selectionimporttrain_test_splitX,y=make_regression(n_samples=100,n_features=1,n_informative=1,noise=12,random_state=11)X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=11)knn=KNeighborsRegressor(n_neighbors=3)knn.fit(X_train,y_train)train_score=knn.score(X_train,y_train)test_score=knn.score(X_test,y_test)print("knn.train_score={}".format(train_score))print("knn.test_score={}".format(test_score))可視化決策邊界fromsklearn.datasetsimportmake_regressionfromsklearn.neighborsimportKNeighborsRegressorfromsklearn.model_selectionimporttrain_test_splitimportnumpyasnpimportmatplotlib.pyplotaspltX,y=make_regression(n_samples=100,n_features=1,n_informative=1,noise=12,random_state=11)X_train,X_test,y_train,y_test=train_test_split(X,y)knn=KNeighborsRegressor(n_neighbors=3)fit=knn.fit(X,y)fig,axes=plt.subplots(figsize=(6,6))line=np.linspace(-3,3,100).reshape(-1,1)axes.plot(line,knn.predict(line))axes.plot(X,y,"^")plt.show()優(yōu)點(diǎn)1、KNN可以處理分類問(wèn)題,同樣也可以處理多分類問(wèn)題,比如鳶尾花的分類。2、簡(jiǎn)單好用,容易理解,精度高,理論成熟。同時(shí)也很強(qiáng)大,對(duì)于手寫數(shù)字的識(shí)別,鳶尾花這一類問(wèn)題來(lái)說(shuō),準(zhǔn)確率很高。3、可以用來(lái)做分類也可以用來(lái)做回歸,可用于數(shù)值型數(shù)據(jù)和離散型數(shù)據(jù),無(wú)數(shù)據(jù)輸入假定,對(duì)異常值不敏感。缺點(diǎn)1、時(shí)間復(fù)雜度和空間復(fù)雜性高。因?yàn)槊恳淮畏诸惢蛘呋貧w,都要把訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)都算一遍,如果數(shù)據(jù)量很大的話,需要的算力會(huì)很驚人,但是在機(jī)器學(xué)習(xí)中,大數(shù)據(jù)處理又是很常見的一件事。2、對(duì)訓(xùn)練數(shù)據(jù)依賴度特別大,雖然所有機(jī)器學(xué)習(xí)的算法對(duì)數(shù)據(jù)的依賴度很高,但是KNN尤其嚴(yán)重,因?yàn)槿绻覀兊挠?xùn)練數(shù)據(jù)集中,有一兩個(gè)數(shù)據(jù)是錯(cuò)誤的,剛剛好又在我們需要分類的數(shù)值的旁邊,這樣就會(huì)直接導(dǎo)致預(yù)測(cè)的數(shù)據(jù)的不準(zhǔn)確,對(duì)訓(xùn)練數(shù)據(jù)的容錯(cuò)性太差。3、一般數(shù)值很大的時(shí)候不用這個(gè),計(jì)算量太大。但是單個(gè)樣本又不能太少,否則容易發(fā)生誤分。最大的缺點(diǎn)是無(wú)法給出數(shù)據(jù)的內(nèi)在含義。3.2線性回歸

線性回歸屬于回歸算法,回歸算法是一種根據(jù)數(shù)據(jù)構(gòu)建模型,再利用這個(gè)模型訓(xùn)練其中的數(shù)據(jù)進(jìn)行處理的算法,其標(biāo)簽是連續(xù)的。回歸算法主要以線性模型為主。線性模型指的不是一個(gè)模型,而是一類模型,包括線性回歸、嶺回歸、LASSO回歸,邏輯回歸等。本節(jié)先對(duì)線性回歸、多項(xiàng)式回歸做一下介紹。對(duì)于線性模型,其公式一般是如下所示:公式中,X[0]-X[n]表示特征,w[0]-w[n]和b表示模型的參數(shù)。當(dāng)我們的數(shù)據(jù)集特征為1時(shí),此時(shí)的線性模型公式是這樣的:

假如我們給出一些數(shù)據(jù),線性模型可以做出相應(yīng)的決策:

通過(guò)模型可以看到,滿足上述一個(gè)特征的公式。在一次函數(shù)中,自變量前面的w代表斜率,b代表截距。對(duì)于多個(gè)特征線性模型仍能做出決策:線性回歸

線性回歸,又被稱為最小二乘法。在線性回歸中,特征值與目標(biāo)值之間存在著線性關(guān)系。線性回歸算法指的是在認(rèn)為數(shù)據(jù)滿足線性關(guān)系的時(shí)候,根據(jù)訓(xùn)練數(shù)據(jù)構(gòu)建出一個(gè)模型,并用此模型進(jìn)行預(yù)測(cè)。

線性回歸就是求線性回歸方程,尋找參數(shù)w和b,使得對(duì)訓(xùn)練集的預(yù)測(cè)值與真實(shí)的回歸目標(biāo)值y之間的損失函數(shù)最小。線性回歸模型的損失函數(shù)一般有兩種,絕對(duì)損失和平方損失。

絕對(duì)損失函數(shù),即

平方損失函數(shù),即

因?yàn)槠椒秸`差利于算法的運(yùn)算,通常將平方誤差作為線性回歸模型的損失函數(shù),線性回歸模型求解就是為了使損失函數(shù)最小。

在線性回歸中,沒(méi)有需要調(diào)節(jié)的參數(shù)。但存在兩個(gè)參數(shù)coef_和intercept_用來(lái)保存回歸模型的系數(shù)和截距。fromsklearn.datasetsimportload_breast_cancerfromsklearn.model_selectionimporttrain_test_splitfromsklearn.linear_modelimportLinearRegressioncanner=load_breast_cancer()X_train,X_test,y_train,y_test=train_test_split(canner.data,canner.target,random_state=2)reg=LinearRegression()reg.fit(X_train,y_train)score=reg.score(X_test,y_test)print("系數(shù)矩陣{}".format(reg.coef_))print("線性回歸模型:{}".format(ercept_))print("score={}".format(score))

線性回歸在線性可分的情況下表現(xiàn)得非常出色,但對(duì)于線性不可分的情況下,會(huì)表現(xiàn)得束手無(wú)策,比如對(duì)于以下數(shù)據(jù):從圖中可以看出該數(shù)據(jù)的決策邊界應(yīng)該是個(gè)二次函數(shù),接下來(lái)我們通過(guò)線性回歸進(jìn)行決策。importnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.linear_modelimportLinearRegressionX=np.array([1,3,5,7,9,11,13,15,17,19,21])X=X.reshape(-1,1)y=np.array([80,64,52,36,59,24,66,79,72,89,100])plt.scatter(X,y)plt.show()liner=LinearRegression()liner.fit(X,y)#預(yù)測(cè)結(jié)果展示#生成待預(yù)測(cè)的數(shù)據(jù)y_predict=liner.predict(X)#預(yù)測(cè)數(shù)據(jù)plt.scatter(X,y)plt.plot(X,y_predict,c="r")plt.show()

可以看到效果差強(qiáng)人意。那么既然線性不可分,利用線性回歸無(wú)法進(jìn)行劃分,應(yīng)該怎么處理呢?下面就是就線性不可分?jǐn)?shù)據(jù)的處理,多項(xiàng)式回歸。多項(xiàng)式回歸

線性回歸適合于線性可分的數(shù)據(jù),當(dāng)我們處理非線性可分的數(shù)據(jù)時(shí)可以使用多項(xiàng)式回歸。在這種回歸中,我們是要找到一條曲線來(lái)擬合數(shù)據(jù)點(diǎn),在特征工程公有多項(xiàng)式特征類似于這個(gè)算法。

如果我們?cè)谟镁€性回歸劃分的話無(wú)從下手,可以嘗試多項(xiàng)式回歸。算法式子可用下式表示:importnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.preprocessingimportPolynomialFeaturesfromsklearn.linear_modelimportLinearRegression#生成原始數(shù)據(jù)X=np.array([1,3,5,7,9,11,13,15,17,19,21])#重塑數(shù)據(jù),使其變?yōu)槎SX=X.reshape(-1,1)y=np.array([80,64,52,36,59,24,66,79,72,89,100])plt.scatter(X,y)plt.show()#多項(xiàng)式特征轉(zhuǎn)換poly=PolynomialFeatures(degree=2)X1=poly.fit_transform(X)#下面與線性回歸步驟相同建立模型,開始訓(xùn)練liner=LinearRegression()liner.fit(X1,y)#預(yù)測(cè)結(jié)果展示#生成待預(yù)測(cè)的數(shù)據(jù)y_predict=liner.predict(X1)#預(yù)測(cè)數(shù)據(jù)plt.scatter(X,y)plt.plot(X,y_predict,c="r")plt.show()可以看到多項(xiàng)式回歸對(duì)數(shù)據(jù)擬合的比較完美。線性回歸優(yōu)點(diǎn):1、回歸分析法在分析多因素模型時(shí),建模速度快,不需要很復(fù)雜的計(jì)算,在數(shù)據(jù)量大的情況下依然運(yùn)行速度很快。更加簡(jiǎn)單和方便;2、回歸分析可以準(zhǔn)確地計(jì)量各個(gè)因素之間的相關(guān)程度與回歸擬合程度的高低,提高預(yù)測(cè)方程式的效果;3、可以根據(jù)系數(shù)給出每個(gè)變量的理解和解釋缺點(diǎn):1、回歸方程式只是一種推測(cè),這影響了因子的多樣性和某些因子的不可測(cè)性,使得回歸分析在某些情況下受到限制。2、對(duì)異常值很敏感。多項(xiàng)式回歸優(yōu)點(diǎn)1、能夠擬合非線性可分的數(shù)據(jù),更加靈活的處理復(fù)雜的關(guān)系

2、因?yàn)樾枰O(shè)置變量的指數(shù),所以它是完全控制要素變量的建模

缺點(diǎn)1、需要一些數(shù)據(jù)的先驗(yàn)知識(shí)才能選擇最佳指數(shù)

2、如果指數(shù)選擇不當(dāng)容易出現(xiàn)過(guò)擬合3.3嶺回歸

嶺回歸是由最小二乘法改進(jìn)而來(lái),雖然利用了最小二乘法,但放棄了其無(wú)偏性,以降低精度來(lái)獲得回歸系數(shù)更為符合實(shí)際的回歸方法,這種方法要強(qiáng)于最小二乘法。在嶺回歸中,不但要求模型特征系數(shù)w要表現(xiàn)的好,而且會(huì)添加約束,盡量減小特征的系數(shù)值大小,使之接近于0,這種約束方式被稱為L(zhǎng)2正則化,其目的是為了避免過(guò)擬合。

在嶺回歸中還添加了參數(shù),其中最重要的莫過(guò)于alpha,通過(guò)調(diào)整alpha的值來(lái)降低特征系數(shù)的大小。在本例中,對(duì)嶺回歸與線性回歸進(jìn)行對(duì)比,觀察其特點(diǎn)fromsklearn.datasetsimportload_breast_cancerfromsklearn.model_selectionimporttrain_test_splitfromsklearn.linear_modelimportLinearRegressioncanner=load_breast_cancer()X_train,X_test,y_train,y_test=train_test_split(canner.data,canner.target,random_state=2)reg=LinearRegression()reg.fit(X_train,y_train)train_score=reg.score(X_train,y_train)test_score=reg.score(X_test,y_test)print("系數(shù)矩陣{}".format(reg.coef_))print("線性回歸模型:{}".format(ercept_))print("train_score={}".format(train_score))print("test_score={}".format(test_score))fromsklearn.datasetsimportload_breast_cancerfromsklearn.model_selectionimporttrain_test_splitfromsklearn.linear_modelimportRidgecanner=load_breast_cancer()X_train,X_test,y_train,y_test=train_test_split(canner.data,canner.target,random_state=2)reg=Ridge()reg.fit(X_train,y_train)train_score=reg.score(X_train,y_train)test_score=reg.score(X_test,y_test)print("系數(shù)矩陣{}".format(reg.coef_))print("嶺回歸模型:{}".format(ercept_))print("train_score={}".format(train_score))print("test_score={}".format(test_score))

可以從嶺回歸得到的精度發(fā)現(xiàn),訓(xùn)練集的精度有所下降,而測(cè)試集的精度卻提高了,說(shuō)明了存在過(guò)擬合問(wèn)題。

通過(guò)對(duì)alpha參數(shù)的調(diào)整,發(fā)現(xiàn)測(cè)試集上的分?jǐn)?shù)上升了。而那么alpha的改變到底改變了什么呢?又是如何改變的呢?下面通過(guò)可視化觀察其特征變化。fromsklearn.datasetsimportload_breast_cancerfromsklearn.model_selectionimporttrain_test_splitimportmatplotlib.pyplotaspltfromsklearn.linear_modelimportLinearRegressionfromsklearn.linear_modelimportRidgecanner=load_breast_cancer()X_train,X_test,y_train,y_test=train_test_split(canner.data,canner.target,random_state=2)lr=LinearRegression().fit(X_train,y_train)r1=Ridge().fit(X_train,y_train)r01=Ridge(alpha=0.1).fit(X_train,y_train)plt.plot(lr.coef_,'o',label='Linearregression')plt.plot(r1.coef_,'^',label='Ridgealpha=1')plt.plot(r01.coef_,'v',label='Ridgealpha=0.1')plt.xlabel("Coefficientindex")plt.ylabel("Coefficientmagnitude")plt.hlines(0,0,len(lr.coef_))plt.legend()plt.show()

從圖中我們可以看到,線性模型沒(méi)有經(jīng)過(guò)正則化的處理,特征系數(shù)的數(shù)值都比較大,而嶺回歸中的系數(shù)幾乎都接近于零。當(dāng)嶺回歸的alpha值為1時(shí),特征系數(shù)幾乎都在零在一條線上,當(dāng)alpha值為0.1時(shí),特征系數(shù)有所增加。對(duì)于alpha值,當(dāng)alpha值增大時(shí),數(shù)據(jù)集的特征系數(shù)會(huì)減小,從而降低訓(xùn)練集的性能,但是會(huì)提升測(cè)試集的性能,也就是泛化性能,當(dāng)alpha減小時(shí),特征系數(shù)則會(huì)增大,如果alpha值非常小時(shí),則會(huì)消除正則化,建立的模型也會(huì)趨向于線性回歸。優(yōu)點(diǎn)1、嶺回歸可以解決特征數(shù)量比樣本量多的問(wèn)題。2、嶺回歸作為一種縮減算法可以判斷哪些特征重要或者不重要,有點(diǎn)類似于降維的效果3、嶺回歸可以解決變量間存在共線性問(wèn)題。缺點(diǎn)1、不能降低樣本特征數(shù)計(jì)算量大。2、犧牲了一定的精確度。3.4LASSON回歸

與嶺回歸相似,套索(LASSO)回歸也是用于限制數(shù)據(jù)的特征系數(shù),防止過(guò)擬合。不同的是LASSO回歸中用絕對(duì)值偏差作為算法的正則化項(xiàng)。即在LASSO回歸中,會(huì)使某些特征系數(shù)恰好為0。LASSO回歸處理后,某些特征被完全忽略,從而研究重要特征對(duì)數(shù)據(jù)的影響,這種稱為L(zhǎng)1正則化。

LASSO系數(shù)也與嶺回歸類似,比較重要的是alpha。

既然有了一種正則化的方式,為什么還要出現(xiàn)另一種呢?

這是因?yàn)長(zhǎng)1正則化用于處理高維數(shù)據(jù),高維數(shù)據(jù)就是指數(shù)據(jù)的維度很高,也就是說(shuō)特征變量十分多的情況。在處理高維數(shù)據(jù)過(guò)程中碰到最大的問(wèn)題就是維數(shù)過(guò)高,因?yàn)榫S數(shù)越高計(jì)算量會(huì)增加,還有就是不能可視化,無(wú)法觀察工作原理,還會(huì)導(dǎo)致過(guò)擬合,無(wú)法精確預(yù)測(cè)。L2正則化會(huì)保留特征來(lái)降低系數(shù),這樣并不會(huì)減少計(jì)算量,而L1正則化會(huì)直接刪掉一些特征系數(shù)。因此L1正則化在高維數(shù)據(jù)集中的優(yōu)勢(shì)尤其明顯。

在LASSO回歸中,我們?nèi)允褂镁€性回歸和嶺回歸中的數(shù)據(jù)集fromsklearn.datasetsimportload_breast_cancerfromsklearn.model_selectionimporttrain_test_splitfromsklearn.linear_modelimportLassocanner=load_breast_cancer()X_train,X_test,y_train,y_test=train_test_split(canner.data,canner.target,random_state=2)reg=Lasso(alpha=0.001)reg.fit(X_train,y_train)train_score=reg.score(X_train,y_train)test_score=reg.score(X_test,y_test)print("系數(shù)矩陣{}".format(reg.coef_))print("LASSO回歸模型:{}".format(ercept_))print("train_score={}".format(train_score))print("test_score={}".format(test_score))

經(jīng)過(guò)LASSO回歸處理后,系數(shù)矩陣中有的特征系數(shù)為零。下面通過(guò)可視化觀察系數(shù)改變后特征的變化。fromsklearn.datasetsimportload_breast_cancerfromsklearn.model_selectionimporttrain_test_splitimportmatplotlib.pyplotaspltfromsklearn.linear_modelimportLassofromsklearn.linear_modelimportRidgecanner=load_breast_cancer()X_train,X_test,y_train,y_test=train_test_split(canner.data,canner.target,random_state=2)r1=Ridge(alpha=0.1).fit(X_train,y_train)l1=Lasso().fit(X_train,y_train)l01=Lasso(alpha=0.01).fit(X_train,y_train)l001=Lasso(alpha=0.00001).fit(X_train,y_train)plt.plot(l1.coef_,'o',label='Lassoalpha=1')plt.plot(l01.coef_,'^',label='Lassoalpha=0.01')plt.plot(l001.coef_,'v',label='Lassoalpha=0.00001')plt.plot(r1.coef_,'.',label="Ridgealpha=0.1")plt.xlabel("Coefficientindex")plt.ylabel("Coefficientmagnitude")plt.legend()plt.show()

通過(guò)圖中數(shù)據(jù)可以看到,當(dāng)LASSO系數(shù)較大時(shí),數(shù)據(jù)集的特征幾乎全為0,隨著alpha值的減小,特征系數(shù)才逐漸增大,當(dāng)alpha等于0.00001時(shí),幾乎沒(méi)有了正則化的約束,而Ridge回歸中,雖然有特征系數(shù)很小的點(diǎn),但都不為0。在LASSO回歸和Ridge回歸中,雖然都是alpha系數(shù),但意義完全不同,在嶺回歸中,隨著alpha值的增大,數(shù)據(jù)集的特征系數(shù)會(huì)減小,隨著alpha值的減小,數(shù)據(jù)集的特征系數(shù)會(huì)增大,而LASSO回歸中,隨著alpha值的增大,特征系數(shù)會(huì)增大,隨著alpha值的減小,特征系數(shù)會(huì)減小。而且?guī)X回歸中,特征系數(shù)不會(huì)為0,LASSO回歸中會(huì)。1、Lasso回歸的出現(xiàn)能夠有效的解決線性回歸出現(xiàn)的過(guò)擬合。2、嶺回歸與Lasso回歸最大的區(qū)別在于嶺回歸引入的是L2正則化,Lasso回歸引入的是L1正則化,Lasso回歸能夠使得許多特征變量變成0,這點(diǎn)要優(yōu)于嶺回歸,是得運(yùn)算素的變快。缺點(diǎn)3、不適用一般情況,僅適用于特征非常多和對(duì)模型解釋。3.5邏輯回歸

在分類算法中,有的可以用于回歸問(wèn)題,同樣對(duì)于回歸算法,有的適用于分類問(wèn)題。而邏輯回歸就屬于線性模型中的一種,用于解決分類問(wèn)題。邏輯回歸是用來(lái)處理自變量和結(jié)果的回歸問(wèn)題,雖然被叫做回歸,但卻是一種分類方法。主要有兩個(gè)使用場(chǎng)景,第一,用于研究二分類或者多分類問(wèn)題,第二尋找因變量的影響因素。

邏輯回歸算法與線性回歸算法最大的差異是,邏輯回歸中的

被當(dāng)做決策邊界,而對(duì)于線性回歸等模型中是一條直線、平面或者超平面。邏輯回歸建立的模型如下面這個(gè)公式:

在公式中0代表閾值,但是對(duì)于現(xiàn)實(shí)數(shù)據(jù),閾值的設(shè)置也是一個(gè)問(wèn)題,如果采取平均值,假設(shè)正常數(shù)據(jù)點(diǎn)都處于0左右,而出現(xiàn)一個(gè)異常值非常大,則會(huì)出現(xiàn)錯(cuò)誤。

于是需要建立的一個(gè)函數(shù)來(lái)映射概率,sigmoid函數(shù):

該函數(shù)將所有數(shù)據(jù)都映射到0-1之間,對(duì)于異常值進(jìn)行了處理,其圖像這樣的:

與訓(xùn)練線性回歸模型類似,為了邏輯回歸模型的參數(shù)w和b需要一個(gè)代價(jià)函數(shù),算法的代價(jià)函數(shù)是對(duì)m個(gè)樣本的損失函數(shù)求和然后除以m,因?yàn)閷?duì)于線性模型損失函數(shù)對(duì)于模型的影響不是很大,所以不作詳細(xì)介紹。邏輯回歸的原理是:根據(jù)一個(gè)問(wèn)題,建立代價(jià)函數(shù),然后通過(guò)迭代優(yōu)化求解出最優(yōu)的模型參數(shù),然后測(cè)試驗(yàn)證我們這個(gè)求解的模型的好壞。

邏輯回歸有一個(gè)重要的參數(shù)C,C值越大正則化越弱。與前面類似如果參數(shù)C值較大,那么特征系數(shù)也將會(huì)越大,邏輯回歸可能將訓(xùn)練集擬合到最好,而如果C值較小,那么模型更強(qiáng)調(diào)使特征系數(shù)接近于0,正則化越強(qiáng)。我們繼續(xù)對(duì)乳腺癌數(shù)據(jù)集進(jìn)行建模。fromsklearn.datasetsimportload_breast_cancerfromsklearn.model_selectionimporttrain_test_splitfromsklearn.linear_modelimportLogisticRegressioncanner=load_breast_cancer()X_train,X_test,y_train,y_test=train_test_split(canner.data,canner.target,random_state=2)reg=LogisticRegression()reg.fit(X_train,y_train)train_score=reg.score(X_train,y_train)test_score=reg.score(X_test,y_test)print("系數(shù)矩陣{}".format(reg.coef_))print("邏輯回歸模型:{}".format(ercept_))print("train_score={}".format(train_score))print("test_score={}".format(test_score))

可以看到精確度非常高,因?yàn)樵摂?shù)據(jù)集本身就是分類問(wèn)題,恰好也說(shuō)明了線性模型中的邏輯回歸適用于分類。對(duì)C值進(jìn)行調(diào)節(jié),并通過(guò)可視化觀察特征系數(shù)的變化。fromsklearn.datasetsimportload_breast_cancerfromsklearn.model_selectionimporttrain_test_splitimportmatplotlib.pyplotaspltfromsklearn.linear_modelimportLogisticRegressioncanner=load_breast_cancer()X_train,X_test,y_train,y_test=train_test_split(canner.data,canner.target,random_state=2)lg01=LogisticRegression(C=0.1).fit(X_train,y_train)lg1=LogisticRegression().fit(X_train,y_train)lg10=LogisticRegression(C=10).fit(X_train,y_train)plt.plot(lg01.coef_.T,'x',label='LogisticC=0.1')plt.plot(lg1.coef_.T,'o',label='LogisticC=1')plt.plot(lg10.coef_.T,'.',label='LogisticC=10')plt.xticks(range(canner.data.shape[1]),canner.feature_names,rotation=90)plt.hlines(0,0,canner.data.shape[1])plt.xlabel("Coefficientindex")plt.ylabel("Coefficientmagnitude")plt.legend()plt.show()因?yàn)檫壿嫽貧w使用L2正則化,可以看到隨著C值增大特征系數(shù)也會(huì)變大,可以看到隨著C值減小特征系數(shù)也會(huì)變小,但是不會(huì)為0。優(yōu)點(diǎn):

1、簡(jiǎn)單、速度快,適用于二分類問(wèn)題。2、易于理解,能直接看到各個(gè)特征的權(quán)重。3、容易吸收新的數(shù)據(jù)更新模型。缺點(diǎn):

1、適應(yīng)能力弱,對(duì)數(shù)據(jù)適應(yīng)能力有局限性。3.6樸素貝葉斯算法

貝葉斯算法是一類分類算法的總稱,來(lái)源于統(tǒng)計(jì)學(xué)。它是由18世紀(jì)英國(guó)數(shù)學(xué)家貝葉斯學(xué)派創(chuàng)始人塔馬斯·貝葉斯所提出的利用概率統(tǒng)計(jì)知識(shí)進(jìn)行分類的方法演變而來(lái),貝葉斯學(xué)派很古老,但是從誕生到一百年前一直不是主流。

樸素貝葉斯分類與我們介紹的線性模型十分相似,是一種十分簡(jiǎn)單的分類算法,叫它樸素貝葉斯分類是因?yàn)檫@種方法的思想真的很樸素,樸素貝葉斯的原理是:對(duì)于給出的待分類項(xiàng),求解在此項(xiàng)出現(xiàn)的條件下各個(gè)類別出現(xiàn)的概率,哪個(gè)最大,就認(rèn)為此待分類項(xiàng)屬于哪個(gè)類別。即如果一個(gè)事物在一些屬性條件發(fā)生的情況下,事物屬于A的概率>屬于B的概率,則判定事物屬于A。樸素貝葉斯算法較為簡(jiǎn)單、高效,在處理分類問(wèn)題上,是值得優(yōu)先考慮的方法之一,但是泛化能力比分類模型較差。

樸素貝葉斯分類算法,核心是下面這個(gè)貝葉斯公式:

樸素貝葉斯算法同樣有多種算法,分別是高斯樸素貝葉斯(GaussianNaiveBayes),伯努利樸素貝葉斯(BernoulliNaiveBayes),多項(xiàng)式樸素貝葉斯(MultinomialNaiveBayes)。高斯樸素貝葉斯其實(shí)就是正態(tài)分布用于解決一些連續(xù)數(shù)據(jù)的問(wèn)題,伯努利樸素貝葉斯就是應(yīng)用于二分類,多項(xiàng)式樸素貝葉斯文本計(jì)數(shù)中經(jīng)常使用。接下來(lái)對(duì)這三種貝葉斯算法進(jìn)行模型的構(gòu)建。

在對(duì)KNN算法處理回歸問(wèn)題中,用到了sklearn庫(kù)中的make_regression函數(shù),該函數(shù)可通過(guò)設(shè)置得到想要的數(shù)據(jù)集,同時(shí)在sklearn庫(kù)中還有一個(gè)手動(dòng)設(shè)置的分類數(shù)據(jù)集,make_blobs。

n_samples表示數(shù)據(jù)的數(shù)量。

n_features表示特征的數(shù)量。

centers表示類別的數(shù)量。

首先函數(shù)生成數(shù)據(jù)為300個(gè)、特征為2、類別為7的數(shù)據(jù)集,然后利用三種樸素貝葉斯算法觀察其精度。#高斯樸素貝葉斯fromsklearn.datasetsimportmake_blobsfromsklearn.model_selectionimporttrain_test_splitfromsklearn.naive_bayesimportGaussianNBX,y=make_blobs(n_samples=300,centers=7,random_state=3)X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=3)bayes=GaussianNB()bayes.fit(X_train,y_train)train_score=bayes.score(X_train,y_train)test_score=bayes.score(X_test,y_test)print("trainpredict={}".format(train_score))print("testpredict={}".format(test_score))#伯努利樸素貝葉斯fromsklearn.datasetsimportmake_blobsfromsklearn.model_selectionimporttrain_test_splitfromsklearn.naive_bayesimportBernoulliNBX,y=make_blobs(n_samples=300,centers=7,random_state=3)X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=3)bayes=BernoulliNB()bayes.fit(X_train,y_train)train_score=bayes.score(X_train,y_train)test_score=bayes.score(X_test,y_test)print("trainpredict={}".format(train_score))print("testpredict={}".format(test_score))因?yàn)槎囗?xiàng)式樸素貝葉斯只適用于處理非負(fù)離散數(shù)值,所以在下面對(duì)數(shù)據(jù)進(jìn)行了歸一化。#多項(xiàng)式樸素貝葉斯fromsklearn.datasetsimportmake_blobsfromsklearn.model_selectionimporttrain_test_splitfromsklearn.naive_bayesimportMultinomialNBimportnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.preprocessingimportMinMaxScalerX,y=make_blobs(n_samples=300,centers=7,random_state=3)X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=3)scaler=MinMaxScaler()scaler.fit(X_train)X_train_scaler=scaler.transform(X_train)X_test_scaler=scaler.transform(X_test)bayes=MultinomialNB()bayes.fit(X_train_scaler,y_train)train_score=bayes.score(X_train_scaler,y_train)test_score=bayes.score(X_test_scaler,y_test)print("trainpredict={}".format(train_score))print("testpredict={}".format(test_score))

因?yàn)橛械乃惴ú贿m用該數(shù)據(jù)集的緣故,可以看到評(píng)分越來(lái)越低。列下來(lái)通過(guò)決策可視化觀察其決策邊界。

伯努利樸素貝葉斯主要解決的是二項(xiàng)分布,多項(xiàng)式樸素貝葉斯多用于轉(zhuǎn)化為對(duì)文本的處理,所以效果不是很好。優(yōu)點(diǎn)1、樸素貝葉斯算法分類效率穩(wěn)定,不僅能處理二分類還能處理多分類,適用于小規(guī)模數(shù)據(jù),而且還能做增量式訓(xùn)練,即數(shù)據(jù)量過(guò)多超出內(nèi)存時(shí),我們可以分批的去增量訓(xùn)練。2、對(duì)缺失數(shù)據(jù)不太敏感,算法也比較簡(jiǎn)單,常用于文本分類。3、當(dāng)屬性相關(guān)性較小時(shí),樸素貝葉斯性能最好。缺點(diǎn)1、在屬性個(gè)數(shù)比較多或者屬性之間相關(guān)性較大時(shí),分類效果不好,往往無(wú)法預(yù)測(cè)精確的數(shù)據(jù)。2、需要知道先驗(yàn)概率,且先驗(yàn)概率很多時(shí)候取決于假設(shè),因此在某些時(shí)候會(huì)由于假設(shè)的先驗(yàn)?zāi)P偷脑驅(qū)е骂A(yù)測(cè)效果不佳。3、由于我們是通過(guò)先驗(yàn)和數(shù)據(jù)來(lái)決定后驗(yàn)的概率從而決定分類,所以分類決策存在一定的錯(cuò)誤率,并且對(duì)輸入數(shù)據(jù)的表達(dá)形式很敏感。3.7決策樹

決策樹是一種相對(duì)普遍的機(jī)器學(xué)習(xí)算法,常用于分類和回歸。在機(jī)器學(xué)習(xí)中,決策樹是一個(gè)預(yù)測(cè)模型,他代表的是對(duì)象屬性與對(duì)象值之間的一種映射關(guān)系,它在對(duì)數(shù)據(jù)進(jìn)行分類的同時(shí),還可以給出各個(gè)特征的重要性評(píng)分。決策樹在決策過(guò)程中,會(huì)根據(jù)數(shù)據(jù)的特征來(lái)劃分?jǐn)?shù)據(jù)的類別。

對(duì)于上表數(shù)據(jù),如果做出劃分你會(huì)怎么做?決策樹可能會(huì)做出以下劃分:

當(dāng)然可能也會(huì)有其他劃分方法,總而言之,在使用決策樹分類的時(shí)候,從根結(jié)點(diǎn)開始,對(duì)數(shù)據(jù)集的某一個(gè)特征進(jìn)行測(cè)驗(yàn),選擇最優(yōu)特征,然后每一個(gè)數(shù)據(jù)被對(duì)應(yīng)著分配到子結(jié)點(diǎn)。如此循環(huán)繼續(xù)進(jìn)行,當(dāng)?shù)竭_(dá)葉結(jié)點(diǎn)時(shí),循環(huán)停止,這時(shí)每個(gè)數(shù)據(jù)都被分到一個(gè)類別。如果還有子集不能夠被正確的分類,那么就對(duì)這些子集選擇新的最優(yōu)特征,繼續(xù)對(duì)其進(jìn)行分割,構(gòu)建相應(yīng)的節(jié)點(diǎn),如此遞歸進(jìn)行,直至所有訓(xùn)練數(shù)據(jù)子集被基本正確的分類,或者沒(méi)有合適的特征為止。每個(gè)子集都被分到葉節(jié)點(diǎn)上,即都有了明確的類,這樣就生成了一顆決策樹。

但是如果特征的數(shù)量非常大,數(shù)據(jù)非常多的情況下,算法的計(jì)算量肯定也會(huì)非常大,那應(yīng)該如何處理呢?

從決策樹函數(shù)中看到?jīng)Q策樹的參數(shù)比較多,其中比較重要的參數(shù)是max_depth決策樹的最大深度。因?yàn)闆Q策樹模型比較復(fù)雜,對(duì)于訓(xùn)練集中的數(shù)據(jù)表現(xiàn)得很好,但在測(cè)試集上的表現(xiàn)并不是很好,所以容易產(chǎn)生過(guò)擬合。通過(guò)對(duì)最大深度的限制則可以解決這一問(wèn)題。

通過(guò)對(duì)最大深度的限制則可以解決這一問(wèn)題,這種對(duì)樹預(yù)先進(jìn)行處理的操作,稱為預(yù)剪枝。 預(yù)剪枝是在樹的生長(zhǎng)過(guò)程中設(shè)定一個(gè)指標(biāo),當(dāng)達(dá)到該指標(biāo)時(shí)就停止生長(zhǎng),這樣雖然方便但是容易出現(xiàn)局限性,一旦達(dá)到指標(biāo),使得結(jié)點(diǎn)就變成了葉結(jié)點(diǎn),如果往后繼續(xù)分支可能會(huì)出現(xiàn)更好的分類方法。所以說(shuō)采用預(yù)剪枝可能會(huì)誤導(dǎo)更優(yōu)分類。

還有一種方式,先構(gòu)建樹,然后刪除信息量很少的結(jié)點(diǎn),這種方式被稱為后剪枝,也叫做剪枝。后剪枝中樹首先要充分生長(zhǎng),充分利用全部數(shù)據(jù)集。讓葉結(jié)點(diǎn)都有最小的不純度值,然后對(duì)所有相鄰的成對(duì)葉節(jié)點(diǎn)考慮是否消去它們,如果消去能引起令人滿意的不純度增長(zhǎng),那么執(zhí)行消去,并令它們的公共父節(jié)點(diǎn)成為新的葉節(jié)點(diǎn)。這種"合并"葉節(jié)點(diǎn)的做法和節(jié)點(diǎn)分支的過(guò)程恰好相反,經(jīng)過(guò)剪枝后葉節(jié)點(diǎn)常常會(huì)分布在很寬的層次上,樹也變得非平衡。

實(shí)際中構(gòu)建決策樹并不只包含剪枝,它包括兩個(gè)重要部分:特征選擇、決策樹的生成。特征選擇就是把數(shù)據(jù)集中的眾多的特征中選擇一個(gè)特征,當(dāng)成當(dāng)前結(jié)點(diǎn)的判斷標(biāo)志。如何選擇特征有許多不同的評(píng)估標(biāo)準(zhǔn),通常包括這些標(biāo)準(zhǔn),基尼指數(shù)、信息增益率、信息熵,從而衍生出不同的決策樹算法?;诨嶂笖?shù)的算法被稱為CART算法,基于信息熵、信息增益率的算法包括ID3、C4.5算法。

ID3算法于1975年被提出,以“信息熵”為核心計(jì)算每個(gè)屬性的信息增益,結(jié)點(diǎn)劃分標(biāo)準(zhǔn)是選取信息增益最高的屬性作為劃分屬性。ID3算法只能處理離散屬性,并且類別值較多的輸入變量比類別值少的輸入變量更有機(jī)會(huì)成為當(dāng)前最佳劃分點(diǎn)。

C4.5算法使用信息增益率來(lái)選擇屬性,存在取值數(shù)目較少屬性的偏好,因此,采用一個(gè)啟發(fā)式搜索方法,先從候選劃分屬性中找出信息增益高于平均水平的屬性,再?gòu)闹羞x擇信息增益率最高的屬性作為劃分屬性?;谶@些改進(jìn),C4.5算法克服了ID3算法使用信息增益選擇屬性時(shí)偏向選擇取值多的屬性的不足。

CART算法生成的決策樹為結(jié)構(gòu)簡(jiǎn)單的二叉樹,每次對(duì)樣本集的劃分都計(jì)算Gini系數(shù),Gini系數(shù)越小則劃分越合理。Gini系數(shù)又稱基尼不純度,表示一個(gè)隨機(jī)選中的樣本在在子集中被分錯(cuò)的可能性。

算法的選擇可以根據(jù)函數(shù)中的criterion參數(shù)進(jìn)行調(diào)整,默認(rèn)為基尼指數(shù)gini,可以調(diào)節(jié)為信息增益的熵entropy。通過(guò)min_impurity_decrease來(lái)優(yōu)化模型,這個(gè)參數(shù)用來(lái)指定信息墑或者基尼不純度的閥值,當(dāng)決策樹分裂后,其信息增益低于這個(gè)閥值時(shí)則不再分裂。

信息熵表示事件的不確定性。變量不確定性越高,熵越高。劃分?jǐn)?shù)據(jù)集的大原則是:讓數(shù)據(jù)從無(wú)序變得有序,在劃分?jǐn)?shù)據(jù)集前后信息發(fā)生的變化稱為信息增益獲得信息增益最高的特征就是最好的選擇。

Gini系數(shù)是一種與信息熵類似的做特征選擇的方式,通常用于cart算法中?;岵患兌缺硎疽粋€(gè)隨機(jī)選中一個(gè)數(shù)據(jù),他在被劃分的時(shí)候分錯(cuò)的可能性?;岵患兌葹檫@個(gè)樣本被選中的概率乘以它被分錯(cuò)的概率。當(dāng)一個(gè)節(jié)點(diǎn)中所有樣本都是一個(gè)類時(shí),基尼不純度為零。

決策樹生成是根據(jù)選擇的特征評(píng)估標(biāo)準(zhǔn),從上至下遞歸地生成子節(jié)點(diǎn),直到數(shù)據(jù)集不可分則停止決策樹停止生長(zhǎng)。樹結(jié)構(gòu)來(lái)說(shuō),遞歸結(jié)構(gòu)是最容易理解的方式。接下來(lái)通過(guò)鳶尾花數(shù)據(jù)集對(duì)CART樹進(jìn)行分析。fromsklearn.datasetsimportload_irisfromsklearn.model_selectionimporttrain_test_splitfromsklearn.treeimportDecisionTreeClassifieriris=load_iris()X_train,X_test,y_train,y_test=train_test_split(iris.data,iris.target,random_state=3)tree=DecisionTreeClassifier(random_state=3)tree.fit(X_train,y_train)score=tree.score(X_test,y_test)print(score)因?yàn)闆Q策樹的算法復(fù)雜,容易產(chǎn)生過(guò)擬合,所以我們要對(duì)訓(xùn)練集進(jìn)行測(cè)試。train_score=tree.score(X_train,y_train)print(train_score)

可以看到在訓(xùn)練集上的評(píng)分達(dá)到了1.0,與測(cè)試集上的評(píng)分差的比較多,所以肯定出現(xiàn)了過(guò)擬合。所以可以對(duì)數(shù)據(jù)進(jìn)行剪枝。fromsklearn.datasetsimportload_irisfromsklearn.model_selectionimporttrain_test_splitfromsklearn.treeimportDecisionTreeClassifieriris=load_iris()X_train,X_test,y_train,y_test=train_test_split(iris.data,iris.target,random_state=3)tree=DecisionTreeClassifier(max_depth=3,random_state=3)tree.fit(X_train,y_train)train_score=tree.score(X_train,y_train)test_score=tree.score(X_test,y_test)print("訓(xùn)練集精度:{}".format(train_score))print("測(cè)試集精度:{}".format(test_score))接下來(lái)通過(guò)可視化觀察決策樹構(gòu)建的樹。從圖片中我們看到,對(duì)鳶尾花數(shù)據(jù)集的決策只用到了petallength和petalwidth兩個(gè)特征。在決策樹中還可以看模型的特征重要性,特征的值全部在0-1之間,越接近1表示特征越重要。通過(guò)以下代碼還可以查看特征重要性fromsklearn.datasetsimportload_irisfromsklearn.model_selectionimporttrain_test_splitfromsklearn.treeimportDecisionTreeClassifieriris=load_iris()X_train,X_test,y_train,y_test=train_test_split(iris.data,iris.target,random_state=3)tree=DecisionTreeClassifier(max_depth=3,random_state=3)tree.fit(X_train,y_train)print("特征重要性{}".format(tree.feature_importances_))

接下來(lái)查看樹的決策邊界可以看到構(gòu)建的模型對(duì)原數(shù)據(jù)基本劃分正確。優(yōu)點(diǎn)1、決策樹通過(guò)可視化的樹容易解釋。人們?cè)谕ㄟ^(guò)解釋后都有能力去理解決策樹所表達(dá)的意義。2、易于通過(guò)靜態(tài)測(cè)試來(lái)對(duì)模型進(jìn)行評(píng)測(cè)??梢蕴幚磉B續(xù)和種類字段。決策樹可以清晰的顯示哪些字段比較重要。其他的技術(shù)往往要求數(shù)據(jù)屬性的單一。3、可以對(duì)有許多屬性的數(shù)據(jù)集構(gòu)造決策樹。在相對(duì)短的時(shí)間內(nèi)能夠?qū)Υ笮蛿?shù)據(jù)源做出可行且效果良好的結(jié)果。4、決策樹可很好地?cái)U(kuò)展到大型數(shù)據(jù)庫(kù)中,同時(shí)它的大小獨(dú)立于數(shù)據(jù)庫(kù)的大小,計(jì)算量相對(duì)來(lái)說(shuō)不是很大。缺點(diǎn):1、對(duì)于那些各類別樣本數(shù)量不一致的數(shù)據(jù),在決策樹當(dāng)中,信息增益的結(jié)果偏向于那些具有更多數(shù)值的特征。決策樹處理缺失數(shù)據(jù)時(shí)的困難。2、過(guò)度擬合問(wèn)題的出現(xiàn)。3、對(duì)有時(shí)間順序的數(shù)據(jù),需要很多預(yù)處理的工作。4、忽略數(shù)據(jù)集中屬性之間的相關(guān)性。當(dāng)類別太多時(shí),錯(cuò)誤可能就會(huì)增加的比較快。一般的算法分類的時(shí)候,只是根據(jù)一個(gè)字段來(lái)分類。3.8隨機(jī)森林

因?yàn)闆Q策樹通常會(huì)出現(xiàn)過(guò)擬合的情況,所以出現(xiàn)了隨機(jī)森林這一方法。隨機(jī)森林是集成算法的一種。

集成算法常見的的有三類,分別是裝袋(Bagging)算法,提升(Boosting)算法和投票(Voting)算法。裝袋算法就是將訓(xùn)練集奮力成多個(gè)子集,然后對(duì)各個(gè)子集進(jìn)行訓(xùn)練模型。提升算法就是訓(xùn)練多個(gè)模型并組成一個(gè)序列,序列中的每一個(gè)模型都會(huì)修正前一個(gè)模型的錯(cuò)誤。投票算法就是訓(xùn)練多個(gè)模型,并采用樣本統(tǒng)計(jì)來(lái)提高模型的準(zhǔn)確度。

隨機(jī)森林屬于Bagging算法的一種,在分類和回歸問(wèn)題上都可以運(yùn)用,相對(duì)是一種比較新的機(jī)器學(xué)習(xí)算法。所謂隨機(jī)森林就是將變量、數(shù)據(jù)的進(jìn)行隨機(jī)化,用隨機(jī)的方式建立一個(gè)森林,森林里面有很多的決策樹組成,隨機(jī)森林的每一棵決策樹之間是沒(méi)有關(guān)聯(lián)的,決策樹算法通過(guò)循環(huán)的二分類,計(jì)算量大大降低。在得到森林之后,當(dāng)有一個(gè)新的輸入樣本進(jìn)入的時(shí)候,就讓森林中的每一棵決策樹分別進(jìn)行一下判斷,看看這個(gè)樣本應(yīng)該屬于哪一類(對(duì)于分類算法),然后看看哪一類被選擇最多,就預(yù)測(cè)這個(gè)樣本為那一類。

隨機(jī)森林在對(duì)數(shù)據(jù)進(jìn)行分類的同時(shí),還可以給出各個(gè)變量的重要性評(píng)分,評(píng)估各個(gè)變量在分類中所起的作用,再匯總分類樹的結(jié)果。許多研究表明,組合分類器比單一分類器的分類效果好,隨機(jī)森林在運(yùn)算量沒(méi)有顯著提高的前提下提高了預(yù)測(cè)精度。隨機(jī)森林對(duì)多元公線性不敏感,結(jié)果對(duì)缺失數(shù)據(jù)和非平衡的數(shù)據(jù)比較穩(wěn)健,可以很好地預(yù)測(cè)多達(dá)千個(gè)解釋變量的作用,被譽(yù)為當(dāng)前最好的算法之一。

在隨機(jī)森林中,有三個(gè)比較重要的特征,分別是最大特征數(shù)量max_features,分類器的個(gè)數(shù)n_estimators,最小樣本葉片數(shù)量min_sample_leaf。max_features是隨機(jī)森林允許在單個(gè)樹中嘗試的最大特征數(shù),如果設(shè)置max_features等于決策樹中的n_features,那么每次劃分?jǐn)?shù)據(jù)集的時(shí)候都要考慮所有特征,沒(méi)有了隨機(jī)性.但在隨機(jī)森林中,bootstrap表示自主取樣,即有放回的取樣,這樣增加了隨機(jī)森林的隨機(jī)性。如果設(shè)置max_features等于1,那么劃分時(shí)無(wú)法選擇對(duì)那個(gè)特征進(jìn)行測(cè)試只能對(duì)特征搜索不同的閾值。所以最大特征數(shù)量的設(shè)置非常重要。n_estimators表示隨機(jī)森林中迭代器的數(shù)量。min_sample_leaf是最小樣本葉片大小。葉是決策樹的末端節(jié)點(diǎn)。較小的葉子使模型更容易捕捉訓(xùn)練數(shù)據(jù)中的噪聲。一般來(lái)說(shuō)將最小葉子節(jié)點(diǎn)數(shù)目設(shè)置為大于50,應(yīng)該盡量嘗試多種葉子大小種類,以找到最優(yōu)的那個(gè)。接下來(lái)實(shí)現(xiàn)又三棵樹組成的隨機(jī)森林。fromsklearn.datasetsimportload_irisfromsklearn.model_selectionimporttrain_test_splitfromsklearn.ensembleimportRandomForestClassifierimportmatplotlib.pyplotaspltimportmglearniris=load_iris()X=iris.data[:,2:4]y=iris.targetX_train,X_test,y_train,y_test=train_test_split(X,y,random_state=3)forest=RandomForestClassifier(n_estimators=3,max_depth=3)forest.fit(X_train,y_train)fig,axes=plt.subplots(2,2,figsize=(6,6))fori,(ax,tree)inenumerate(zip(axes.ravel(),forest.estimators_)):ax.set_title("tree{}".format(i))mglearn.plots.plot_tree_partition(X_train,y_train,tree,ax=ax)mglearn.plots.plot_2d_separator(forest,X_train,fill=True,alpha=0.4)axes[-1,-1].set_title("Randomforest")mglearn.discrete_scatter(X_train[:,0],X_train[:,1],y_train)plt.show()

從圖中可以看出每棵樹都有不同的決策邊界,而隨機(jī)森林最后的模型由三棵樹綜合而成。隨機(jī)森林比任何一棵樹的過(guò)擬合都要小,給出的決策邊界也更符合直覺。還查看隨機(jī)森林對(duì)數(shù)據(jù)集中特征重要的的處理。fromsklearn.datasetsimportload_irisfromsklearn.model_selectionimporttrain_test_splitfromsklearn.ensembleimportRandomForestClassifieriris=load_iris()X_train,X_test,y_train,y_test=train_test_split(iris.data,iris.target,random_state=3)tree=RandomForestClassifier(max_depth=3,n_estimators=3)tree.fit(X_train,y_train)print("特征重要性{}".format(tree.feature_importances_))

從特征中看到,沒(méi)有一個(gè)為0的特征,也就說(shuō)明了隨機(jī)森林構(gòu)建的模型比起決策樹更能從總體上分析。優(yōu)點(diǎn)1、在數(shù)據(jù)集上表現(xiàn)良好,兩個(gè)隨機(jī)性的引入,使得隨機(jī)森林不容易陷入過(guò)擬合。2、在當(dāng)前的很多數(shù)據(jù)集上,相對(duì)其他算法有著很大的優(yōu)勢(shì),兩個(gè)隨機(jī)性的引入,使得隨機(jī)森林具有很好的抗噪聲能力。3、訓(xùn)練速度快,容易做成并行化方法,實(shí)現(xiàn)比較簡(jiǎn)單。4、它能夠處理很高維度的數(shù)據(jù),并且不用做特征選擇,對(duì)數(shù)據(jù)集的適應(yīng)能力強(qiáng):既能處理離散型數(shù)據(jù),也能處理連續(xù)型數(shù)據(jù),數(shù)據(jù)集無(wú)需規(guī)范化。缺點(diǎn)1、隨機(jī)森林已經(jīng)被證明在某些噪音較大的分類或回歸問(wèn)題上會(huì)過(guò)擬合。2、對(duì)于有不同取值的屬性的數(shù)據(jù),取值劃分較多的屬性會(huì)對(duì)隨機(jī)森林產(chǎn)生更大的影響,所以隨機(jī)森林在這種數(shù)據(jù)上產(chǎn)出的屬性權(quán)值是不可信的。3.9核支持向量機(jī)

核支持向量機(jī)是一種十分經(jīng)典的算法,其應(yīng)用領(lǐng)域主要是就是文本分類、圖像識(shí)別。為避免過(guò)擬合提供了很好的理論保證。核支持向量機(jī)是一種二分類的模型。當(dāng)然如果進(jìn)行修改之后也是可以用于多類別問(wèn)題的分類,還可以用于回歸分析,它在解決小樣本、非線性及高維模式識(shí)別中表現(xiàn)出許多特有的優(yōu)勢(shì),并能夠推廣應(yīng)用到函數(shù)擬合等其他機(jī)器學(xué)習(xí)問(wèn)題中。

感知機(jī)的分類原理就是嘗試找到一條直線,能夠把二元數(shù)據(jù)隔離開。放到三維空間或者更高維的空間,感知機(jī)的模型就是嘗試找到一個(gè)超平面,能夠把所有的二元類別隔離開。 關(guān)鍵問(wèn)題就是如何尋找這個(gè)面,所以就要借助支持向量的作用,支持向量就是他們就是離分界線最近的向量。

對(duì)于這個(gè)分離的超平面,我們定義為

,如果在函數(shù)的上方我們就使y=1,在y的下方就使y=-1。

超平面之所以成為超平面,是因?yàn)楫?dāng)維數(shù)過(guò)高大于三的時(shí)候,我們?nèi)庋垡呀?jīng)看不到這個(gè)平面,更無(wú)法想象。那些距離這個(gè)超平面最近的點(diǎn)就是所謂支持向量,實(shí)際上如果確定了支持向量也就確定了這個(gè)超平面,確定了超平面之后,這些支持向量也就沒(méi)有了特殊的作用,與其他樣本一樣。

其中最重要的三個(gè)參數(shù)為:kernel、gamma、C。

kernel:可以選擇的kernel有rbf,linear,polyandothers。其中rbf和poly適用于非線性超平面。

C:和邏輯回歸中的C值一樣,C值越大正則化越弱。與前面類似如果參數(shù)C值較大,那么特征系數(shù)也將會(huì)越大,邏輯回歸和線性svm可能將訓(xùn)練集擬合到最好,而如果C值較小,那么模型更強(qiáng)調(diào)使特征向量接近于0。 gamma:gamma值越大,SVM就會(huì)傾向于越準(zhǔn)確的劃分每一個(gè)訓(xùn)練集里的數(shù)據(jù)。

在支持向量機(jī)中用一個(gè)核的選擇,那么對(duì)于核的選擇技巧是什么呢?第一,如果樣本數(shù)量小于特征數(shù),那么就沒(méi)必要選擇非線性核,簡(jiǎn)單的使用線性核就可以了。第二,如果樣本數(shù)量大于特征數(shù)目,這時(shí)可以使用非線性核,將樣本映射到更高維度,一般可以得到更好的結(jié)果。第三,如果樣本數(shù)目和特征數(shù)目相等,該情況可以使用非線性核,原理和第二種一樣。優(yōu)點(diǎn)1、使用核函數(shù)可以向高維空間進(jìn)行映射,對(duì)高維分類問(wèn)題效果好

2、使用核函數(shù)可以解決非線性的分類3、分類效果,較好分類思想很簡(jiǎn)單,就是將樣本與決策面的間隔最大化4.因?yàn)樽罱K只使用訓(xùn)練集中的支持向量,所以節(jié)約內(nèi)存缺點(diǎn):1、當(dāng)數(shù)據(jù)量較大時(shí),訓(xùn)練時(shí)間會(huì)較長(zhǎng)

2、當(dāng)數(shù)據(jù)集的噪音過(guò)多時(shí),表現(xiàn)不好3、內(nèi)存消耗大,難以解釋,運(yùn)行和調(diào)參也麻煩4、無(wú)法直接支持多分類,但是可以使用間接的方法來(lái)做3.10神經(jīng)網(wǎng)絡(luò)

神經(jīng)網(wǎng)絡(luò),也稱為簡(jiǎn)稱為人工神經(jīng)網(wǎng)絡(luò)或類神經(jīng)網(wǎng)絡(luò),是一種模擬動(dòng)物神經(jīng)元的算法,類似大腦中神經(jīng)突觸連接,通過(guò)進(jìn)行分布式并行處理信息,并建立數(shù)學(xué)模型。這種網(wǎng)絡(luò)依靠系統(tǒng)的復(fù)雜程度,調(diào)節(jié)系統(tǒng)內(nèi)部的連接關(guān)系,從而達(dá)到處理信息的目的,并具有自學(xué)習(xí)和自適應(yīng)的能力。

神經(jīng)網(wǎng)絡(luò)是一種運(yùn)算模型,一般是通過(guò)統(tǒng)計(jì)學(xué)的一種方法進(jìn)行優(yōu)化,所以神經(jīng)網(wǎng)絡(luò)也是數(shù)學(xué)統(tǒng)計(jì)學(xué)方法的實(shí)踐,通過(guò)統(tǒng)計(jì)學(xué)的方法我們可以得到大量函數(shù)來(lái)應(yīng)用于神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),另一方面在人工智能的感知領(lǐng)域,我們通過(guò)數(shù)學(xué)統(tǒng)計(jì)學(xué)的應(yīng)用可以來(lái)做人工感知方面的決定問(wèn)題,這種方法比起正式的邏輯學(xué)推理演算更具有優(yōu)勢(shì)。典型的神經(jīng)網(wǎng)絡(luò)具有以下三個(gè)部分:結(jié)構(gòu):結(jié)構(gòu)指定了網(wǎng)絡(luò)中的變量和它們的拓?fù)潢P(guān)系。例如,神經(jīng)網(wǎng)絡(luò)中的變量可以是神經(jīng)元連接的權(quán)重和神經(jīng)元的激勵(lì)值。激勵(lì)函數(shù):每個(gè)神經(jīng)元都有一個(gè)激活函數(shù),它主要是一個(gè)根據(jù)輸入傳遞輸出的函數(shù).大部分神經(jīng)網(wǎng)絡(luò)模型具有一個(gè)短時(shí)間尺度的動(dòng)力學(xué)規(guī)則,來(lái)定義神經(jīng)元如何根據(jù)其他神經(jīng)元的活動(dòng)來(lái)改變自己的激勵(lì)值。一般激勵(lì)函數(shù)依賴于網(wǎng)絡(luò)中的權(quán)重。學(xué)習(xí)規(guī)則:學(xué)習(xí)規(guī)則指定了網(wǎng)絡(luò)中的權(quán)重如何隨著時(shí)間推進(jìn)而調(diào)整。這一般被看做是一種長(zhǎng)時(shí)間尺度的動(dòng)力學(xué)規(guī)則。一般情況下,學(xué)習(xí)規(guī)則依賴于神經(jīng)元的激勵(lì)值。它也可能依賴于監(jiān)督者提供的目標(biāo)值和當(dāng)前權(quán)重的值。

神經(jīng)網(wǎng)絡(luò)中比較重要的就是多層感知器,MLP算法了。MLP也被稱為前饋神經(jīng)網(wǎng)絡(luò),或者被泛稱為神經(jīng)網(wǎng)絡(luò)。我們重點(diǎn)介紹這一算法。

神經(jīng)網(wǎng)絡(luò)的預(yù)測(cè)精確,但是計(jì)算量也相對(duì)來(lái)說(shuō)大。神經(jīng)元之間的每個(gè)連接都有一個(gè)權(quán)重。這個(gè)權(quán)重表示輸入值的重要性。一個(gè)特征的權(quán)重越高,說(shuō)明該特征比其他特征更為重要。我們?cè)诰€性回歸時(shí)寫下了這樣一個(gè)公式:

在這x表示特征,w表示特征的權(quán)重,y就是加權(quán)求和。模型如下圖所示:

而神經(jīng)網(wǎng)絡(luò)的神經(jīng)元分為三種不同類型的層次:輸入層,隱藏層,人工神經(jīng)網(wǎng)絡(luò)。輸入層接收輸入數(shù)據(jù),隱藏層對(duì)輸入數(shù)據(jù)進(jìn)行數(shù)學(xué)計(jì)算。人

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論