機器學(xué)習(xí)|sklearn庫主要模塊功能和輔助函數(shù)
本文轉(zhuǎn)自小數(shù)志微信公眾號|作者:luanhz
作為一名數(shù)據(jù)分析師,當(dāng)我初次接觸數(shù)據(jù)分析三劍客(numpy、pandas、matplotlib)時,感覺每個庫的功能都很多很雜,也費了一番功夫琢磨并出了教程。
后來,當(dāng)接觸了機器學(xué)習(xí)庫sklearn之后,才發(fā)現(xiàn)三劍客也不外如是,相比sklearn簡直是小巫見大巫;再后來,又開始了pyspark的學(xué)習(xí)之旅,發(fā)現(xiàn)無論是模塊體積還是功能細分,pyspark又都完爆sklearn;最近,逐漸入坑深度學(xué)習(xí)(TensorFlow框架),終于意識到python數(shù)據(jù)科學(xué)庫沒有最大,只有更大……
鑒于機器學(xué)習(xí)本身理論性很強,加之sklearn庫功能強大API眾多,自然不是總結(jié)一份教程所能涵蓋的。所以這一次,僅對其中的各子模塊進行梳理和介紹,以期通過本文能對sklearn迅速建立宏觀框架。
01 sklearn簡介
sklearn,全稱scikit-learn,是python中的機器學(xué)習(xí)庫,建立在numpy、scipy、matplotlib等數(shù)據(jù)科學(xué)包的基礎(chǔ)之上,涵蓋了機器學(xué)習(xí)中的樣例數(shù)據(jù)、數(shù)據(jù)預(yù)處理、模型驗證、特征選擇、分類、回歸、聚類、降維等幾乎所有環(huán)節(jié),功能十分強大,目前sklearn版本是0.23。
與深度學(xué)習(xí)庫存在pytorch、TensorFlow等多種框架可選不同,sklearn是python中傳統(tǒng)機器學(xué)習(xí)的首選庫,不存在其他競爭者。
本文將分別圍繞下圖中各大子模塊進行分別介紹,不會面面俱到、但求提綱挈領(lǐng)。

sklearn常用模塊一覽
02 樣例數(shù)據(jù)集

sklearn為初學(xué)者提供了一些經(jīng)典數(shù)據(jù)集,通過這些數(shù)據(jù)集可快速搭建機器學(xué)習(xí)任務(wù)、對比模型性能。數(shù)據(jù)集主要圍繞分類和回歸兩類經(jīng)典任務(wù),對于不同需求,常用數(shù)據(jù)集簡介如下:
load_breast_cancer:乳腺癌數(shù)據(jù)集,特征為連續(xù)數(shù)值變量,標簽為0或1的二分類任務(wù)
load_iris:經(jīng)典鳶尾花數(shù)據(jù)集,特征為連續(xù)數(shù)值變量,標簽為0/1/2的三分類任務(wù),且各類樣本數(shù)量均衡,均為50個
load_wine:紅酒數(shù)據(jù)集,與鳶尾花數(shù)據(jù)集特點類似,也是用于連續(xù)特征的3分類任務(wù),不同之處在于各類樣本數(shù)量輕微不均衡
load_digits:小型手寫數(shù)字數(shù)據(jù)集(之所以稱為小型,是因為還有大型的手寫數(shù)字數(shù)據(jù)集mnist),包含0-9共10種標簽,各類樣本均衡,與前面3個數(shù)據(jù)集最大不同在于特征也是離散數(shù)值0—16之間,例如在進行多項式樸素貝葉斯模型、ID3樹模型時,可用該數(shù)據(jù)集
load_boston:波士頓房價數(shù)據(jù)集,連續(xù)特征擬合房價,適用于回歸任務(wù)
值得指出,sklearn除了load系列經(jīng)典數(shù)據(jù)集外,還支持自定義數(shù)據(jù)集make系列和下載數(shù)據(jù)集fetch系列(load系列為安裝sklearn庫時自帶,而fetch則需額外下載),這為更多的學(xué)習(xí)任務(wù)場景提供了便利。
03 數(shù)據(jù)預(yù)處理

sklearn中的各模型均有規(guī)范的數(shù)據(jù)輸入輸出格式,一般以np.array和pd.dataframe為標準格式,所以一些字符串的離散標簽是不能直接用于模型訓(xùn)練的;
同時為了加快模型訓(xùn)練速度和保證訓(xùn)練精度,往往還需對數(shù)據(jù)進行預(yù)處理,例如在以距離作為度量進行訓(xùn)練時則必須考慮去量綱化的問題。
為此,sklearn提供了一些常用的數(shù)據(jù)預(yù)處理功能,常用的包括:
MinMaxScaler:歸一化去量綱處理,適用于數(shù)據(jù)有明顯的上下限,不會存在嚴重的異常值,例如考試得分0-100之間的數(shù)據(jù)可首選歸一化處理
StandardScaler:標準化去量綱處理,適用于可能存在極大或極小的異常值,此時用MinMaxScaler時,可能因單個異常點而將其他數(shù)值變換的過于集中,而用標準正態(tài)分布去量綱則可有效避免這一問題
Binarizer:二值化處理,適用于將連續(xù)變量離散化
OneHotEncoder:獨熱編碼,一種經(jīng)典的編碼方式,適用于離散標簽間不存在明確的大小相對關(guān)系時。
例如對于民族特征進行編碼時,若將其編碼為0-55的數(shù)值,則對于以距離作為度量的模型則意味著民族之間存在"大小"和"遠近"關(guān)系,而用獨熱編碼則將每個民族轉(zhuǎn)換為一個由1個"1"和55個"0"組成的向量。
弊端就是當(dāng)分類標簽過多時,容易帶來維度災(zāi)難,而特征又過于稀疏
Ordinary:數(shù)值編碼,適用于某些標簽編碼為數(shù)值后不影響模型理解和訓(xùn)練時。例如,當(dāng)民族為待分類標簽時,則可將其簡單編碼為0-55之間的數(shù)字
04 特征選擇

機器學(xué)習(xí)中有句經(jīng)典的臺詞是:
數(shù)據(jù)和特征決定學(xué)習(xí)上限,模型和算法只是逼近這個上限,可見特征工程在機器學(xué)習(xí)中的重要性。
一般而言,傳統(tǒng)機器學(xué)習(xí)中的特征工程主要包括兩方面需求:
特征維度過多時,為加快模型訓(xùn)練速度,進行特征選擇即過濾掉不重要的特征;
特征較少或模型訓(xùn)練性能不好時,可通過對問題的理解嘗試構(gòu)建特征提升維度。
這里簡單介紹幾種特征選擇的方式:
from_model:顧名思義,從模型選擇特征,這是因為很多模型在訓(xùn)練后都提供了特征的重要性結(jié)果feature_importance,據(jù)此可作為特征選擇的依據(jù)
VarianceThreshold:根據(jù)方差閾值做特征選擇,實際上當(dāng)某一特征的方差越大時意味著該特征越能帶來更好的分類區(qū)分度,否則由于特征取值比較集中,很難對應(yīng)不同的分類效果
SelectKBest:指定K個特征選擇結(jié)果,具體也需依賴選擇的標準
05 模型選擇

模型選擇是機器學(xué)習(xí)中的重要環(huán)節(jié),涉及到的操作包括數(shù)據(jù)集切分、參數(shù)調(diào)整和驗證等。對應(yīng)常用函數(shù)包括:
train_test_split:常用操作之一,切分數(shù)據(jù)集和測試集,可設(shè)置切分比例
cross_val_score:交叉驗證,默認K=5折,相當(dāng)于把數(shù)據(jù)集平均切分為5份,并逐一選擇其中一份作為測試集、其余作為訓(xùn)練集進行訓(xùn)練及評分,最后返回K個評分
GridSearchCV:調(diào)參常用方法,通過字典類型設(shè)置一組候選參數(shù),并制定度量標準,最后返回評分最高的參數(shù)
06 度量指標

不同的度量指標可以學(xué)到不同的最優(yōu)模型。對于不同類型任務(wù),sklearn提供了多種度量指標,包括:
分類任務(wù):
準確率,所有樣本中分類正確樣本所占比例;精準率和召回率,一對相互矛盾的指標,適用于分類樣本數(shù)量不均衡時,此時為了保證既定目標,可只選其中一個指標;調(diào)和平均數(shù)F1,相當(dāng)于兼顧了精準率和召回率兩項指標
回歸任務(wù):
常用的包括MSE、MAE,但R2_score實質(zhì)上是更為公允和直觀的評價指標,其意義是R2_Score = MSE / VAR,即預(yù)測分類和實際分類的均方差與實際分類方差的比值
聚類任務(wù):
聚類任務(wù)屬于無監(jiān)督學(xué)習(xí),所以根據(jù)是否有先驗標簽信息,聚類結(jié)果的度量指標包括輪廓系數(shù)(無需先驗標簽,用組內(nèi)距離與組外最近距離的比值度量)、調(diào)整蘭德指數(shù)(基于真實分簇標簽和聚類標簽計算)
07 降維
降維也屬于無監(jiān)督學(xué)習(xí)的一種,當(dāng)特征維度過多時可通過矩陣的QR分解實現(xiàn)在盡可能保留原有信息的情況下降低維度,一般用于圖像數(shù)據(jù)預(yù)處理,且降維后的特征與原特征沒有直接聯(lián)系,使得模型訓(xùn)練不再具有可解釋性。
08 聚類
聚類是一種典型的無監(jiān)督學(xué)習(xí)任務(wù),但也是實際應(yīng)用中較為常見的需求。在不提供樣本真實標簽的情況下,基于某些特征對樣本進行物以類聚。
根據(jù)聚類的原理,主要包括三種:
基于距離聚類,典型的就是K均值聚類,通過不斷迭代和重新尋找最小距離,對所有樣本劃分為K個簇,有一款小游戲《擁擠城市》應(yīng)該就是基于K均值聚類實現(xiàn)。
基于密度聚類,與距離聚類不同,基于密度聚類的思想是源于通過距離判斷樣本是否連通(需指定連通距離的閾值),從而完成樣本劃分。
由于劃分結(jié)果僅取決于連通距離的閾值,所以不可指定聚類的簇數(shù)。典型算法模型是DBSCAN。
基于層次聚類,具體又可細分為自頂向下和自底向上,以自底向上層次聚類為例:
首先將所有樣本劃分為一類,此時聚類簇數(shù)K=樣本個數(shù)N,遍歷尋找K個簇間最相近的兩個簇并完成合并,此時還有K-1個簇,如此循環(huán)直至劃分為指定的聚類簇數(shù)。
當(dāng)然,這里評價最相近的兩個簇的標準又可細分為最小距離、最大距離和平均距離。
09 基本學(xué)習(xí)模型

分類和回歸任務(wù)是機器學(xué)習(xí)中的經(jīng)典場景,同屬于有監(jiān)督學(xué)習(xí)。經(jīng)典的學(xué)習(xí)算法主要包括5種:
線性模型,回歸任務(wù)中對應(yīng)線性回歸,分類任務(wù)則對應(yīng)即邏輯回歸,或者叫對數(shù)幾率回歸,實質(zhì)是通過線性回歸擬合對數(shù)幾率的方式來實現(xiàn)二分類。
K近鄰,最簡單易懂的機器學(xué)習(xí)模型,無需訓(xùn)練(惰性模型),僅僅是通過判斷自己所處位置周邊的樣本判斷類比或者擬合結(jié)果
支持向量機,一個經(jīng)典的機器學(xué)習(xí)模型,最初也是源于線性分類,通過最大化間隔實現(xiàn)最可靠的分類邊界。
業(yè)界相傳:支持向量機有三寶、間隔對偶核函數(shù)。其中"間隔"由硬間隔升級為軟間隔解決了帶異常值的線性不可分場景,"對偶"是在優(yōu)化過程中求解拉格朗日問題的一個小技巧,而核函數(shù)才是支持向量機的核心,通過核實的核函數(shù)可以實現(xiàn)由線性可分向線性不可分的升級、同時避免了維度災(zāi)難。
樸素貝葉斯,源于概率論中貝葉斯全概率公式,模型訓(xùn)練的過程就是擬合各特征分布概率的過程,而預(yù)測的過程則是標出具有最大概率的類比,是一個純粹的依據(jù)概率完成分類任務(wù)的模型。
而像邏輯回歸、K近鄰、支持向量機以及決策樹,雖然也都可以預(yù)測出各類別概率,但并不是純粹意義上的概率
決策樹,這是一個直觀而又強大的機器學(xué)習(xí)模型,訓(xùn)練過程主要包括特征選擇-切分-剪枝,典型的3個決策樹是ID3、C4.5和CART,其中CART樹既可用于分類也可用于回歸。
更重要的是,決策樹不僅模型自身頗具研究價值,還是眾多集成學(xué)習(xí)模型的基學(xué)習(xí)器。
在以上5個經(jīng)典的基本學(xué)習(xí)模型中,除了樸素貝葉斯僅用于分類任務(wù)外,其他4個模型都是既可分類也可回歸的模型。
010?集成學(xué)習(xí)模型

當(dāng)基本學(xué)習(xí)模型性能難以滿足需求時,集成學(xué)習(xí)便應(yīng)運而生。集成學(xué)習(xí),顧名思義,就是將多個基學(xué)習(xí)器的結(jié)果集成起來匯聚出最終結(jié)果。
而根據(jù)匯聚的過程,集成學(xué)習(xí)主要包括3種流派:
bagging,即bootstrap aggregating,通過自助取樣(有放回取樣)實現(xiàn)并行訓(xùn)練多個差異化的基學(xué)習(xí)器,雖然每個學(xué)習(xí)器效果可能并不突出,但通過最后投票得到的最終結(jié)果性能卻會穩(wěn)步提升。
當(dāng)基學(xué)習(xí)器采取決策樹時,bagging思想的集成學(xué)習(xí)模型就是隨機森林。另外,與bagging對應(yīng)的另一種方式是無放回取樣,相應(yīng)的方法叫pasting,不過應(yīng)用較少。
boosting,即提升法:
與bagging模型并行獨立訓(xùn)練多個基學(xué)習(xí)器不同,boosting的思想是基于前面訓(xùn)練結(jié)果逐漸訓(xùn)練更好的模型,屬于串行的模式。
根據(jù)實現(xiàn)細節(jié)不同,又具體分為兩種boosting模型,分別是Adaboost和GBDT,二者的核心思想差異在于前者的提升聚焦于之前分錯的樣本、而后者的提升聚焦于之前漏學(xué)的殘差。另外一個大熱的XGBoost是對GBDT的一個改進,實質(zhì)思想是一致的。
stacking,即堆棧法,基本流程與bagging類似而又不同:
stacking也是并行獨立訓(xùn)練多個基學(xué)習(xí)器,而后又將這些訓(xùn)練的結(jié)果作為特征進行再次學(xué)習(xí)。有些類似于深度學(xué)習(xí)中的多層神經(jīng)網(wǎng)絡(luò)。
011?總結(jié)
以上,對sklearn中的常用子模塊進行了粗略簡介,基本涵蓋了常用的模型和輔助函數(shù),對于sklearn入門來說是足夠的。本文僅旨在建立對sklearn庫的宏觀框架,更為深入的學(xué)習(xí)當(dāng)然還是要查閱專項教程。
更多干貨知識可以關(guān)注學(xué)姐的微信公眾號
偶爾會把大佬們的思路給大家搬運過來

三連一下,給學(xué)姐多多支持!