《python機器學習及實踐_從零開始通往kaggle競賽之路》——讀書筆記

一、簡介

 

1、什麼是機器學習

 

A program can be 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.

 

 

2、機器學習三要素

 

2.1任務T

 

機器學習任務種類有很多,比較經典的有兩類:監督學習和無監督學習

 

監督學習關注對事物未知表現的預測,一般包括:分類問題、迴歸問題

分類問題:對所在類別進行預測,類別是離散的,並且預先知道數量

迴歸問題:也是預測問題,預測目標是連續變量

 

無監督學習傾向於對事物本身特性的,常用的技術包括:數據降維和聚類問題

數據降維:對事物的特性進行壓縮和篩選

聚類問題:依賴於數據的相似性,把相似的數據樣本劃分爲一個簇。和分類問題的區別是,預先不知道簇的數量和每個簇的具體含義。

 

 

2.2經驗E

習慣性的把數據視作經驗。

 

特徵:反映數據內在規律的信息叫做特徵。一個樣本可以用一個特徵向量來描述。

而從原始數據到特徵向量轉化的過程,會有多種數據類型:類別型特徵、數值型特徵、缺失的數據等。

 

監督學習的經驗包括特徵和標記/目標兩部分。一般用一個特徵向量來描述一個樣本,標記/目標的表現形式取決於監督學習的種類

 

無監督學習沒有標記/目標,無法從事預測任務,更適合對數據結構的分析。

 

 

2.3性能P

性能指評價所完成任務質量的指標。

 

對於預測性質的問題,關注預測精度。

分類問題要根據預測正確類別的百分比來評價性能,即準確性

迴歸問題通常衡量預測值與實際值之間的偏差大小。

 

 

出現在測試集中的樣本一定不能被用於模型訓練

一般,訓練集75%,測試集25%

 

 

 

二、經典模型

 

1、監督學習經典模型

 

監督學習任務基本架構和流程:

 

準備訓練數據→抽取特徵,形成特徵向量→把特徵向量和對應的標記/目標送入學習算法,訓練出一個預測模型;然後,用同樣的特徵抽取方法作用於新測試數據,得到用於測試的特徵向量,用預測模型對這些待測試的特徵向量進行預測並得到結果。

 

 

1.1分類學習

 

有二分類、多類分類、多標籤分類。

二分類、多類分類:從兩個或多於兩個類別中選擇一個作爲預測結果

多標籤分類:判斷一個樣本是否同時屬於多個不同類別

 

 

分類問題性能測評指標:

 

 

實際類別

預測類別

 

T

F

T

TT

TF

F

FT

FF

準確率Accuracy:(#TT+#FF)/(#TT+#TF+#FT+#FF)     就是不管原來是T還是F,真預測對了的比例

召回率Recall:(#TT)/(#TT+#FT)                   原來是T的那些,預測對了多少比例

精確率Precision:(#TT)/(#TT+#TF)                預測爲T的那些,有多少預測對了

 

1.1.1線性分類器

 

假設特徵和分類結果之間存在線性關係的模型。

線性關係可以表達爲:

1)LR

對於二分類問題,用邏輯斯蒂函數將映射到(0,1),

得到邏輯斯蒂迴歸模型(即決策函數):

損失函數(最大似然估計):

 

另說明:h(x)是每個樣本取值爲1的概率

特點:線性分類器假設數據特徵和分類目標之間關係是線性的

有LogisticRegression:對參數計算精確解析,計算時間長,模型性能略高

和SGDClassifier:隨機梯度上升估計參數,計算時間短,模型性能略低

10萬量級以上數據,考慮時間耗用,使用SGDClassifier

 

2)SVC

決策函數:

損失函數:

當epsilon=0時,退化爲線性可分的情況

損失函數第一項保證了最大化分類間隔,第二項是分類錯誤造成代價

 

特點:在海量高維度數據中篩選對預測任務最爲有效的少數訓練樣本,

節省模型數據內存,提高模型預測性能。

缺點:付出CPU資源和計算時間

 

SVC和LR的區別及聯繫:

都是線性分類器,但是計算參數時,LR考慮了所有樣本對參數的影響,而SVC僅考慮支持向量對參數的影響

都是在尋找w.T·x=0的超平面,但是損失函數不同,SVC希望找到使點到平面的垂直距離最小的參數,而LR則使似然函數最大

 

1.1.2樸素貝葉斯

 

模型構造基礎的貝葉斯理論。

基本數學假設是:各個維度上的特徵被分類的條件概率之間是相互獨立的。

概率模型表達爲:

x(x1,……,xn)爲一n維特徵向量,

y∈{c1,……,ck}是特徵向量x所有k種可能的類別

p(y=ci|x)是x屬於類別ci的概率,則

目標是求所有y∈{c1,……,ck}中P(y|x)最大的。

 

特點:廣泛應用於海量互聯網文本分類任務。

由於其較強的特徵條件獨立假設,使模型預測所需估計的參數規模從冪指數量級向線性量級減少,節約內存消耗和計算時間

無法將各個特徵之間的聯繫考量在內,使得模型在其他數據特徵關聯性較強的分類任務上的性能表現不佳。

 

1.1.3  K近鄰

 

給定一個訓練數據集,對新的輸入實例,在訓練數據集中找到與該實例最鄰近的K個實例,這K個實例的多數屬於某個類,就把該輸入實例分爲這個類。

所以,K近鄰法不具有顯式的學習過程。

實際上是利用訓練數據集對特徵向量空間進行劃分,並作爲其分類的模型。

三要素:K值的選擇,距離度量,分類決策規則

 

特點:無參數模型,非常高的計算複雜度和內存消耗

 

 

1.1.4決策樹

 

假設特徵和目標之間是非線性關係

度量方式:信息熵、基尼不純性

 

特點:推斷邏輯直觀,具有清晰的可解釋性,方便模型可視化

使用決策樹時,無需考慮對數據標準化

有參數模型

 

 

1.1.5集成分類模型

 

綜合考量多個分類器的預測結果,從而做出決策

綜合考量方式分兩種:

一是利用相同的訓練數據同時搭建多個獨立的分類模型,然後通過投票的方式,以少數服從多數的原則作出最終的分類決策,如:隨機森林分類器,即在相同訓練數據上同時搭建多棵決策樹,每棵決策樹構建時都是隨機選取特徵。

二是按照一定次序搭建多個分類模型。這些模型之間彼此存在依賴關係。一般,每個後續模型的加入都需要對現有集成模型的綜合性能有所貢獻,進而不斷提升更新過後的集成模型的性能,並最終期望藉助整合多個分類能力較弱的分類器,搭建出具有更強分類能力的模型,如梯度提升決策樹,每一棵決策樹在生成的過程中都會盡可能降低整體集成模型在訓練集上的擬合誤差。

 

特點:具有更高的表現性能和更好的穩定性

訓練過程耗費更多時間

 

 

1.2迴歸預測

 

1.2.1線性迴歸器

 

線性迴歸模型:

優化目標:最小化預測值和真實值的差異

同樣有精確計算的解析算法和隨機梯度下降估計算法

 

性能評價:使用R2評價模型和數據擬合的好壞,越大代表擬合的越好

 

可作爲基線系統

 

 

1.2.2 支持向量機迴歸:從訓練數據中選出一部分更加有效的支持向量,用於預測

 

1.2.3 K鄰近迴歸:只借助周圍K個最近訓練樣本的目標數值,對待預測的迴歸值進行決策。

衍生出衡量待測樣本回歸值的不同方式,即到底是對K個近鄰目標數值使用普通的算術平均法還是同時考慮距離的差異進行加權平均。

 

 

1.2.4 迴歸樹:迴歸樹在選擇不同特徵作爲分裂節點的策略上,與決策樹思路類似。不同之處在於,迴歸樹葉節點的數據類型不是離散型,而是連續型。決策樹每個葉節點依照訓練數據表現的概率傾向決定了其最終的預測類別;而回歸樹的葉節點卻是一個個具體的值,從預測值連續這個意義上嚴格講,迴歸樹不能成爲“迴歸算法”。因爲迴歸樹的葉節點返回的是“一團”訓練數據的均值,而不是具體的、連續的預測值。

 

樹模型的優點:

1、樹模型可以解決非線性特徵的問題

2、樹模型不要求對特徵標準化和統一化,即數值型和類別型特徵都可以直接被應用在樹模型的構建和預測過程中

3、因爲上述原因,樹模型也可以直觀地輸出決策過程,使得預測結果具有可解釋性

樹模型的缺點

1、因爲樹模型可以解決一些複雜的非線性擬合問題,所以更加容易因爲模型搭建過於複雜而喪失對新數據的精度(泛化能力)

2、樹模型從上至下的預測流程會因爲數據細微的更改而發生較大的結構變化,因此預測穩定性較差

3、依託訓練數據構建最佳的樹模型是NP難問題,即在有限時間內無法找到最優解的問題,因此常使用類似貪婪算法的解法只能找到一些次優解,這也是爲什麼經常藉助集成模型,在多個次優解中尋覓更高的模型性能

 

1.2.5集成模型(迴歸)

普通迴歸森林

提升樹模型

極端隨機森林:與普通的隨機森林不同的是,極端隨機森林在每當構建一棵樹的分裂點的時候,不會任意地選取特徵,而是先隨機收集一部分特徵,然後利用信息熵和基尼不純性等指標挑選最佳的節點特徵

 

特點:訓練過程耗時,但性能好,穩定性好

 

 

 

2、無監督學習經典模型

 

着重於發現數據本身的分佈特點,可發現數據的“羣落”,尋找離羣點,降維

 

2.1數據聚類

 

K-均值聚類步驟:

1、確定要分的類別數目K

根據實際問題反覆嘗試,得到不同的分類並進行比較,得出最後要分的類別數量

2、確定K個類別的初始聚類中心

在用於聚類的全部樣本中,選擇K個樣本作爲K個類別的初始聚類中心,可由系統隨機選擇

3、根據確定的K個初始聚類中心,依次計算每個樣本到K個聚類中心的距離歐氏距離,並根據距離最近的原則將所有的樣本分到事先確定的K個類別中

4、根據所分成的K個類別,計算出各類別中每個變量的均值,並以均值點作爲新的K個類別中心。根據新的中心位置,重新計算每個樣本到新中心的距離,並重新進行分類

5、重複第4步,直到滿足終止聚類條件爲止

 

性能測評:

1、如果被用來評估的數據本身帶有正確的類別信息,用ARI指標,含義和分類問題中的準確性Accurary類似

2、如果被用於評估的數據沒有所屬類別,那麼用輪廓係數來度量聚類結果的質量

輪廓係數兼顧聚類的凝聚度和分離度,取值範圍[-1,1],越大越好

計算步驟:

定義xi與某類簇的距離爲xi與該類簇內所有樣本距離的平均值

①對於已聚類數據xi,計算xi與同一類簇內所有其他樣本距離的平均值,記爲ai

②計算xi與其他各類簇的距離,並找到最小的距離,記爲bi

③對於樣本xi,輪廓係數爲sci=(bi-ai)/max(bi,ai)

④對所有樣本輪廓係數求出平均值即爲當前聚類結果的整體輪廓係數。

 

 

缺點:容易收斂到局部最優解,需要預先設定簇的數量

 

如何預估合理的類簇個數:K-meas模型最終期望所有數據點到其所屬的類簇距離平方和趨於穩定,所以可以觀察這個數值隨K的走勢來找出最佳類簇數量

 

 

另:

K-均值聚類法是根據事先確定的K個類別反覆迭代直到把每個樣本分到指定的裏類別中。類別數目的確定具有一定的主主觀性,究竟分多少類合適,需要研究者對研究問題的瞭解程度、相關知識和經驗

 

聚類數據要求:

1、各變量的取值不應有數量級上的過大差異,否則會對分類結果產生較大影響。這時需要對變量進行標準化處理

2、各變量間不應有較強的相關關係。若兩個強相關的變量同時參與聚類分析,在測度距離時,就加大了它們的貢獻,而其他變量則相對被削弱

 

分類結果是否合理取決於它是否“有用”,但分類結果是否可靠和穩定,則需要反覆聚類和比較

一般來說,在所分的類別中,各類所包含的對象(樣本或變量)的數量應該大致相當。至少這從表面上看更漂亮一些

 

 

 

 

2.2 特徵降維

主成分最爲經典和實用。可以把PCA當做特徵選擇,這種特徵選擇首先是把原來的特徵空間做了映射,使得新的映射後特徵空間數據彼此正交,這樣就可儘可能保留具有區分性的低維數據特徵。

降維過程可能會損失一些模式信息,不過綜合效率更好。

 

 

 

三、進階

 

提升模型性能的方式:預處理數據、控制參數訓練、優化模型配置

 

1、特徵提升

 

特徵抽取:將原始數據轉化爲特徵向量的形式,這個過程同時涉及對數據特徵的量化表示

特徵篩選:在高維度、已量化的特徵向量中選擇對指定任務更有效的特徵組合,與PCA這類通過選擇主成分對特徵進行重建的方法有區別,對於PCA,無法解釋重建之後的特徵,但特徵篩選不對特徵值修改,而是選擇對模型性能提升較大的少量特徵

 

 

2、模型正則化

 

欠擬合:當模型複雜度很低,模型不僅沒有對訓練集上的數據有良好的擬合狀態,且在測試集上也表現平平,即欠擬合

過擬合:模型複雜度很高,幾乎完全擬合了所有的訓練數據,但幾乎喪失了對未知數據的預測能力,即過擬合

 

兩種情況都是缺乏泛化力;

所以,要求增加模型複雜度,提高性能,同時兼顧泛化能力,防止過擬合;

於是,採用模型正則化的方法

 

正則化方法:L1範數正則化和L2範數正則化

 

2.1L1範數正則化:

 

目的是提高模型在未知測試數據上的泛化力,避免參數過擬合

方法是在原模型優化目標的基礎上,增加對參數的懲罰項,即增加參數向量的L1範數

結果會讓參數向量中的許多元素趨向於0,使得大部分特徵失去對優化目標的貢獻。

這種讓有效特徵變得稀疏的L1正則化模型通常稱爲Lasso

 

2.2L2範數正則化:

 

方法是在原模型優化目標的基礎上,即增加參數向量的L2範數

結果會讓參數向量中的大部分元素都變得很小,壓制了參數之間的差異性

這種壓制參數之間差異性的L2正則化模型通常稱爲Ridge

 

 

3、模型檢驗

 

留一驗證

K折交叉驗證:保證所有的數據都有被訓練和驗證的機會,最大可能讓優化的模型性能變現更加可信

 

 

4、超參數搜索

 

網格搜索:對超參數組合空間進行暴力搜索

並行搜索:利用多核處理器、分佈式資源

 

 

5、XGBoost模型

 

基本思想是把成百上千個分類準確率較低的樹模型組合起來,成爲一個準確率很高的模型,這個模型的特點是不斷迭代,每次迭代就生成一棵新的樹,成爲一個準確率很高的模型。

 

 

 

 

 

在上面的基礎上再總結一下

 

機器學習任務分爲有監督學習和無監督學習。

有監督學習又分爲分類問題和迴歸問題,兩者都是預測,不同點是分類問題預測目標是離散變量,知道類別數量,迴歸問題預測目標是連續變量;

 

分類問題的模型中,如果假設特徵是線性的,可選LR和SVC,一般可能SVC更好一點,因爲它只考慮支持向量對參數的影響,同時計算量小;樸素貝葉斯是根據貝葉斯理論構建的模型,假設是特徵之間以及特徵和預測變量之間相互獨立,那麼,它就不適合預測特徵之間明顯有相關性的數據;

K近鄰是無參數算法,不過計算量很大,對於每一個待預測的點都要計算和所有樣本的距離才能找出最近的K個點;決策樹是一種很好的對特徵是非線性關係假設的擬合模型,結果直觀,邏輯清晰,知道是如何一步步分類的,且不要求數據標準化,但是穩定性差,不好找最優解;集成模型性能也好,穩定性也好,就是訓練過程耗時。

 

迴歸問題的模型,上述分類問題都基本有對應的迴歸模型,優缺點基本一致。

 

無監督學習主要是聚類和降維。聚類常用K-means,降維常用主成分。

 

 

在模型性能提升方面,除了選對模型,也涉及數據預處理、模型參數控制和模型優化配置方面

選擇合適的特徵,進行超參數組合,選出最好的超參數,正則化提高模型泛化能力。

 

 

大概流程爲:原始數據,分開訓練集、測試集,數據描述、看數據分佈、有沒有缺失值、特徵選擇,缺失值處理,特徵向量化,選擇模型,訓練,預測等。

 

 

所涉及的sklearn庫中常用的幾行代碼

#分類學習

#監督學習,分類學習,線性分類器
fromsklearn.linear_modelimportLogisticRegression
fromsklearn.linear_modelimportSGDClassifier
fromsklearn.svmimportLinearSVC

#監督學習,分類學習,樸素貝葉斯
fromsklearn.naive_bayesimportMultinomialNB

#監督學習,K近鄰分類器
fromsklearn.neighborsimportKNeighborsClassifier

#監督學習,單一決策樹分類器
fromsklearn.treeimportDecisionTreeClassifier

#監督學習,分類學習,集成學習,隨機森林分類器
fromsklearn.ensembleimportRandomForestClassifier
#監督學習,分類學習,集成學習,梯度提升決策樹
fromsklearn.ensembleimportGradientBoostingClassifier



#分類模型評估結果
fromsklearn.metricsimportclassification_report
print('AccuracyofLRClassifier:',lr.score(X_test,y_test))
print(classification_report(y_test,lr_y_predict,target_names=['Benign','Malignant']))

 

#迴歸問題

#監督學習,線性迴歸
fromsklearn.linear_modelimportLinearRegression
fromsklearn.linear_modelimportSGDRegressor
fromsklearn.svmimportSVR

#監督學習,K近鄰迴歸
fromsklearn.neighborsimportKNeighborsRegressor

#監督學習,單一回歸樹
fromsklearn.treeimportDecisionTreeRegressor

#監督學習,集成模型,普通隨機森林,極端隨機森林,提升樹
fromsklearn.ensembleimportRandomForestRegressor,ExtraTreesRegressor,GradientBoostingRegressor



#迴歸模型評估結果R方,MSE,MAE
ss_y=StandardScaler()
fromsklearn.metricsimportr2_score,mean_squared_error,mean_absolute_error
r2_score(y_test,lr_y_predict)
mean_squared_error(ss_y.inverse_transform(y_test),ss_y.inverse_transform(lr_y_predict))
mean_absolute_error(ss_y.inverse_transform(y_test),ss_y.inverse_transform(lr_y_predict))

 

#無監督學習,聚類
fromsklearn.clusterimportKMeans
#K-means性能評估ARI
fromsklearnimportmetrics
metrics.adjusted_rand_score(y_test,y_predict)
#K-means性能評估輪廓係數
fromsklearn.metricsimportsilhouette_score
sc_score=silhouette_score(X,kmeans_model.labels_,metric='euclidean')

#無監督學習,降維
fromsklearn.decompositionimportPCA

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章