sklearn機器學習
機器學習典型步驟
過擬合 & 欠擬合
為什么需要交叉驗證數據集?
什么是學習曲線?
為什么需要查準率和召回率來評估模型的好壞?查準率和召回率適合哪些問題領域?
數據預處理 & 特征選擇
kNN
使用k-近鄰算法進行回歸擬合
實例:糖尿病預測
線性回歸
實例:波士頓房價預測
邏輯回歸
乳腺癌檢測(數據預處理)
樸素貝葉斯算法
實例:文檔自動分類
k-Means均值算法
實例:文檔聚類分析
決策樹
基本概念
決策樹的創建
算法分類
剪枝算法
實例:預測泰坦尼克號幸存者
集合算法
隨機森林(待補充)
ExtraTrees算法
支持向量機
核函數
實例:乳腺癌檢測
PCA算法
實例:人臉識別
機器學習典型步驟
數據采集和標記
數據清洗
特征選擇
模型選擇和構建
模型訓練和測試
模型性能評估和優化
模型保存&使用
過擬合 & 欠擬合
欠擬合(underfitting),也稱為高偏差(high bias),因為我們試圖用一條直線來擬合樣本數據。右邊是過擬合(overfitting),也稱為高方差(high variance),用了十階多項式來擬合數據,雖然模型對現有的數據集擬合得很好,但對新數據預測誤差卻很大。
過擬合:
獲取更多的訓練數據
減少輸入的特征數量
比如,針對書寫識別系統,原來使用200×200的圖片,總共40000個特征。優化后,我們可以把圖片等比例縮小為10×10的圖片,總共100個特征。這樣可以大大減少模型的計算量,同時也減少模型的復雜度,改善過擬合問題。
正則化
當每個特征xi對預測值y都有少量的貢獻時,這樣的模型可以良好地工作,這就是正則化的目的,可以用它來解決特征過多時的過擬合問題。
L1范數作為正則項,會讓模型參數θ稀疏化,即讓模型參數向量里為0的元素盡量多。而L2范數作為正則項,則是讓模型參數盡量小,但不會為0,即盡量讓每個特征對預測值都有一些小的貢獻。
欠擬合:
增加有價值的特征
增加多項式特征
為什么需要交叉驗證數據集?
我們在第1章介紹過的,要把數據集分成訓練數據集和測試數據集。一般原則是按照8∶2或7∶3來劃分,然后用訓練數據集來訓練模型,訓練出模型參數后再使用測試數據集來測試模型的準確性,根據模型的準確性來評價模型的性能。
另外一個更科學的方法是把數據集分成3份,分別是訓練數據集、交叉驗證數據集和測試數據集,推薦比例是6∶2∶2。
這個時候我們會用測試數據集算出針對測試數據集的成本Jtest(θ),看哪個模型的測試數據集成本最低,我們就選擇這個多項式來擬合數據,但實際上,這是有問題的。測試數據集的最主要功能是測試模型的準確性,需要確保模型“沒見過”這些數據。現在我們用測試數據集來選擇多項式的階數d,相當于把測試數據集提前讓模型“見過”了。這樣選擇出來的多項式階數d本身就是對訓練數據集最友好的一個,這樣模型的準確性測試就失去了意義。
當然,在實踐過程中,很多人直接把數據集分成訓練數據集和測試數據集,而沒有分出交叉驗證數據集。這是因為很多時候并不需要橫向去對比不同的模型。在工程上,大多數時候我們最主要的工作不是選擇模型,而是獲取更多數據、分析數據、挖掘數據。
什么是學習曲線?
為什么需要查準率和召回率來評估模型的好壞?查準率和召回率適合哪些問題領域?
有時候,模型準確性并不能評價一個算法的好壞。比如針對癌癥篩查算法,根據統計,普通腫瘤中癌癥的概率是0.5%。有個機器學習算法,測試得出的準確率是99.2%,錯誤率是0.8%。這個算法到底是好還是壞呢?如果努力改進算法,最終得出的準確率是99.5%,錯誤率是0.5%,模型到底是變好了還是變壞了呢?
坦白講,如果單純從模型準確性的指標上很難判斷到底是變好了還是變壞了。因為這個事情的先驗概率太低了,假如寫了一個超級簡單的預測函數,總是返回0,即總是認為不會得癌癥,那么我們這個超級簡單的預測函數的準確率是99.5%,錯誤率是0.5%。因為總體而言,只有那0.5%真正得癌癥的卻被我們誤判了。
數據預處理 & 特征選擇
歸一化處理:目的是讓算法收斂更快,提升模型擬合過程中的計算效率。進行歸一化處理后,當有個新的樣本需要計算預測值時,也需要先進行歸一化處理,再通過模型來計算預測值,計算出來的預測值要再乘以歸一化處理的系數,這樣得到的數據才是真實的預測數據。
特征選擇:
人工選擇
PCA算法
kNN
sklearn.neighbors.KNeighborsClassifier
使用k-近鄰算法進行回歸擬合
分類問題的預測值是離散的,我們也可以用k-近鄰算法在連續區間內對數值進行預測,進行回歸擬合。在scikit-learn里,使用k-近鄰算法進行回歸擬合的算法是sklearn.neighbors.KNeighborsRegressor類。
實例:糖尿病預測
k-近鄰算法有哪些變種?
普通的k-均值算法
帶權重的k-均值算法
指定半徑的k-均值算法: KNeighborsClassifier
線性回歸
線性回歸由類 sklearn.linear_model.LinearRegression 實現
多項式由類 sklearn.preprocessing.PolynomialFeatures 實現
那么要怎么添加多項式特征呢?我們需要用一個管道把兩個類串起來,即用 sklearn.pipeline.Pipeline 把兩個模型串起來。
實例:波士頓房價預測
邏輯回歸
邏輯回歸算法的名字里雖然帶有“回歸”二字,但實際上邏輯回歸算法是用來解決分類問題的算法。邏輯回歸算法的輸出是個離散值,這是與線性回歸算法的最大區別。
邏輯回歸算法為什么要選擇Sigmoid函數作為預測函數的模型呢?
嚴格地講,不一定非要選擇Sigmoid函數作為預測函數。但如果不選擇Sigmoid函數,就需要重新選擇性質接近的成本函數,這樣才能在數學上得到既方便表達、效率又高的成本函數。
乳腺癌檢測(數據預處理)
從特征指標里,可以看出,有些指標屬于“復合”指標,即由其他的指標經過運算得到的。比如密實度,是由周長和面積計算出來的。不要小看這種運算構建出來的新特征,這是事物內在邏輯關系的體現。
提取特征時,不妨從事物的內在邏輯關系入手,分析已有特征之間的關系,從而構造出新的特征。這一方法在實際工程應用中是常用的特征提取手段。
回到我們討論的乳腺癌數據集的特征問題中,實際上它只關注10個特征,然后又構造出了每個特征的標準差及最大值,這樣每個特征就又衍生出了兩個特征,所以總共就有了30個特征。可以通過 cancer.feature_names 變量來查看這些特征的名稱。
…
總共114個測試樣本,全部預測正確。這里有個疑問,為什么全部都預測正確,而test score卻只有0.973684,而不是1呢?答案是,scikit-learn不是使用這個數據來計算分數,因為這個數據不能完全反映誤差情況,而是使用預測概率數據來計算模型評分。
樸素貝葉斯算法
在scikit-learn里,樸素貝葉斯算法在sklearn.naive_bayes包里實現,包含了本章介紹的
幾種典型的概率分布算法。
GaussianNB實現了高斯分布的樸素貝葉斯算法
MultinomialNB實現了多項式分布的樸素貝葉斯算法
BernoulliNB實現了伯努利分布的樸素貝葉斯算法
樸素貝葉斯算法在自然語言領域有廣泛的應用,本節我們用 MultinomialNB 來實現文檔自動分類。
實例:文檔自動分類
k-Means均值算法
scikit-learn里的k-均值算法由sklearn.cluster.KMeans類實現。
典型的無監督式學習包括市場細分,即通過分析用戶數據,把一個產品的市場進行細分,找出細分人群。另外一個是社交網絡分析,分析社交網絡中參與人員的不同特點,根據特點區分出不同群體。這些都是無監督式學習里的聚類(Clustering)問題。
k-均值算法算法包含以下兩個步驟。
給聚類中心分配點。計算所有的訓練樣例,把每個訓練樣例分配到距離其最近的聚類中心所在的類別里;
移動聚類中心。新的聚類中心移動到這個聚類所有的點的平均值處。
一直重復做上面的動作,直到聚類中心不再移動為止,這時就探索出了數據集的結構了。
KMeans.score() 函數計算k-均值算法擬合后的成本,用負數表示,其絕對值越大,說明成本越高。前面介紹過,k-均值算法成本的物理意義為訓練樣例到其所屬的聚類中心點的距離的平均值,在scikit-learn里,其計算成本的方法略有不同,它是計算訓練樣例到其所屬的聚類中心點的距離的總和。
前面說過,k-均值算法的一個關鍵參數是k,即聚類個數。從技術角度來講,k值越大,算法成本越低,這個很容易理解。但從業務角度來看,不是k值越大越好。
實例:文檔聚類分析
假設有一個博客平臺,用戶在平臺上發布博客,我們如何對博客進行聚類分析,以方便展示不同類別下的熱門文章呢?
決策樹
基本概念
什么是信息熵?
我們天天在談論信息,那么信息要怎么樣來量化呢?1948年,香農在他著名的《通信的數學原理》中提出了信息熵(Entropy)的概念,從而解決了信息的量化問題。香農認為,一條信息的信息量和它的不確定性有直接關系。一個問題不確定性越大,要搞清楚這個問題,需要了解的信息就越多,其信息熵就越大。
什么是信息增益?
回到決策樹的構建問題上,當我們要構建一個決策樹時,應該優先選擇哪個特征來劃分數據集呢?答案是:遍歷所有的特征,分別計算,使用這個特征劃分數據集前后信息熵的變化值,然后選擇信息熵變化幅度最大的那個特征,來優先作為數據集劃分依據。即選擇信息增益最大的特征作為分裂節點。
決策樹的創建
計算數據集劃分前的信息熵。
遍歷所有未作為劃分條件的特征,分別計算根據每個特征劃分數據集后的信息熵
選擇信息增益最大的特征,并使用這個特征作為數據劃分節點來劃分數據
遞歸地處理被劃分后的所有子數據集,從未被選擇的特征里繼續選擇最優數據劃分特征來劃分子數據集。
問題來了,遞歸過程什么時候結束呢?一般來講,有兩個終止條件,一是所有的特征都用完了,即沒有新的特征可以用來進一步劃分數據集。二是劃分后的信息增益足夠小了,這個時候就可以停止遞歸劃分了。針對這個停止條件,需要事先選擇信息增益的門限值來作為結束遞歸的條件。
決策樹如何處理連續值的特征?
如果一個特征是連續值怎么辦呢?我們以本章開頭的圖7-1為例,假設我們有個精力測試儀器,測出來的是一個0~100的數字,這是個連續值,這個時候怎么用決策樹來建模呢?答案是:離散化。我們需要對數據進行離散化處理。例如,當精力指數小于等于40時標識為低,當大于40且小于等于70時標識為中,當大于70時標識為高。經過離散處理后,就可以用來構建決策樹了。要離散化成幾個類別,這個往往和具體的業務相關。
正則項處理
最大化信息增益來選擇特征,在決策樹的構建過程中,容易造成優先選擇類別最多的特征來進行分類。舉一個極端的例子,我們把某個產品的唯一標識符ID作為特征之一加入到數據集中,那么構建決策樹時,就會優先選擇產品ID來作為劃分特征,因為這樣劃分出來的數據,每個葉子節點只有一個樣本,劃分后的子數據集最“純凈”,其信息增益最大。
這不是我們希望看到的結果。解決辦法是,計算劃分后的子數據集的信息熵時,加上一個與類別個數成正比的正則項,來作為最后的信息熵。這樣,當算法選擇的某個類別較多的特征,使信息熵較小時,由于受到類別個數的正則項懲罰,導致最終的信息熵也比較大。這樣通過合適的參數,可以使算法訓練得到某種程度的平衡。
另外一個解決辦法是使用信息增益比來作為特征選擇的標準。具體可參閱本章的擴展閱讀。
算法分類
ID3算法
使用信息增益作為特征選擇指標的決策樹構建算法,稱為ID3算法
CART算法
使用基尼不純度來作為特征選擇標準
C4.5
作為ID3算法的改進
C5.0
它運算效率更高,使用內存更小,創建出來的決策樹更小,并且準確性更高,適合大數據集的決策樹構建。
剪枝算法
使用決策樹模型擬合數據時,容易造成過擬合。解決過擬合的方法是對決策樹進行剪枝處理。決策樹的剪枝有兩種思路:前剪枝(Pre-Pruning)和后剪枝(Post-Pruning)。
前剪枝是在構造決策樹的同時進行剪枝。在決策樹的構建過程中,如果無法進一步降低信息熵的情況下,就會停止創建分支。為了避免過擬合,可以設定一個閾值,信息熵減小的數量小于這個閾值,即使還可以繼續降低熵,也停止繼續創建分支。這種方法稱為前剪枝。還有一些簡單的前剪枝方法,如限制葉子節點的樣本個數,當樣本個數小于一定的閾值時,即不再繼續創建分支。
后剪枝是目前較普遍的做法。
后剪枝是指決策樹構造完成后進行剪枝。剪枝的過程是對擁有同樣父節點的一組節點進行檢查,判斷如果將其合并,信息熵的增加量是否小于某一閾值。如果小于閾值,則這一組節點可以合并一個節點。后剪枝的過程是刪除一些子樹,然后用子樹的根節點代替,來作為新的葉子節點。這個新葉子節點所標識的類別通過大多數原則來確定,即把這個葉子節點里樣本最多的類別,作為這個葉子節點的類別。
實例:預測泰坦尼克號幸存者
從輸出數據中可以看出,針對訓練樣本評分很高,但針對交叉驗證數據集評分比較低,兩者差距較大。很明顯,這是過擬合的特征。解決決策樹過擬合的方法是剪枝,包括前剪枝和后剪枝。
不幸的是,scikit-learn不支持后剪枝,但提供一系列的模型參數進行前剪枝。例如,我們通過max_depth參數限定決策樹的深度,當決策樹達到限定的深度時,就不再進行分裂了。這樣就可以在一定程度上避免過擬合。
接下來,就是:優化模型參數。
問題來了,難道我們要手動一個個地去試參數,然后找出最優的參數嗎?一個最直觀的解決辦法是選擇一系列參數的值,然后分別計算用指定參數訓練出來的模型的評分數據。還可以把兩者的關系畫出來,直觀地看到參數值與模型準確度的關系。
模型參數選擇工具包
細心的讀者會發現我們介紹的模型參數優化方法有兩個問題。其一,數據不穩定。讀者朋友們可以試著運行一下示例代碼,每次重新把數據集劃分成訓練數據集和交叉驗證數據集后,選擇出來的模型參數就不是最優的了。例如,原來選擇出來的決策樹深度為7是最優的,第二次計算出來的決策樹的最優深度可能變成了6。其二,不能一次選擇多個參數。例如,我們想要考察max_depth和min_samples_leaf兩個結合起來的最優參數就沒辦法實現。
解決這個問題的方法是多次計算,求平均值。具體來講,就是針對模型的某個特定參數值,多次劃分數據集,多次訓練模型,計算出這個參數值時的最低評分、最高評分及平均評分。在第3章介紹學習曲線時,我們使用過這個方法。
問題二的解決方法比較簡單,把代碼再優化一下,能處理多個參數組合即可。
所幸,我們不需要實現這些代碼。scikit-learn在sklearn.model_selection包里提供了大量的模型選擇和評估的工具供我們使用。針對以上問題,可以使用GridSearchCV類來解決。
集合算法
集合算法(Ensemble)是一種元算法(Meta-algorithm),它利用統計學采樣原理,訓練出成百上千個不同的算法模型。當需要預測一個新樣本時,使用這些模型分別對這個樣本進行預測,然后采用少數服從多數原則,決定新樣本的類別。集合算法可以有效地解決過擬合問題。在scikit-learn里,所有的集合算法都實現在 sklearn.ensemble 包里。
自助聚合算法Bagging
正向激勵算法boosting
隨機森林(待補充)
在前面的決策當中我們提到,一個標準的決策樹會根據每維特征對預測結果的影響程度進行排序,進而決定不同的特征從上至下構建分裂節點的順序,如此以來,所有在隨機森林中的決策樹都會受這一策略影響而構建的完全一致,從而喪失的多樣性。所以在隨機森林分類器的構建過程中,每一棵決策樹都會放棄這一固定的排序算法,轉而隨機選取特征。
在scikit-learn里,由RandomForestClassifier和RandomForestRegressor分別實現隨機森林的分類和回歸算法。
ExtraTrees算法
隨機森林在構建決策樹的過程中,會使用信息熵(或基尼不純度),然后選擇信息增益最大的特征來進行分裂。而ExtraTrees是直接從這些特征里隨機選擇一個特征來分裂,從而避免了過擬合問題。
在scikit-learn里,由ExtraTreesClassifier和ExtraTreesRegressor分別實現ExtraTrees分類和回歸算法。
支持向量機
一句話總結支持向量機算法的最大特點。
SVM的最大特點是能構造出最大間距的決策邊界,從而提高分類算法的魯棒性。
什么是松弛系數,它有什么作用?
引入松弛系數類似于邏輯回歸算法里的成本函數引入正則項,目的都是為了糾正過擬合問題,讓支持向量機對噪聲數據有更強的適應性。當出現一些違反大間距規則的噪聲樣本時,仍然希望我們的分隔超平面是原來的樣子,這就是松弛系數的作用。
一句話總結什么是核函數?什么是相似性函數?兩者有什么關系?
常用的核函數有哪些?分別有什么特點?
核函數
實例:乳腺癌檢測
從圖中可以看出,二階多項式核函數的擬合效果更好。平均交叉驗證數據集評分可達0.950,最高時達到0.975。運行段示例代碼的讀者需要注意,二階多項式核函數計算代價很高,在筆者的Macbook Pro上,運行了數分鐘之久。
在第6章中,我們使用邏輯回歸算法來處理乳腺癌檢測問題時,使用二隊多項式增加特征,同時使用L1范數作為正則項,其擬合效果比這里的支持向量機效果好。更重要的是,邏輯回歸算法的運算效率遠遠高于二階多項式核函數的支持向量機算法。當然,這里的支持向量機算法的效果還是比使用L2范數作為正則項的邏輯回歸算法好的。由此可見,模型選擇和模型參數調優,在工程實踐中有著非常重要的作用的。
PCA算法
主成分分析法,它是一種維數約減(Dimensionality Reduction)算法,即把高維度數據在損失最小的情況下轉換為低維度數據的算法。顯然,PCA可以用來對數據進行壓縮,可以在可控的失真范圍內提高運算速度。
是否可以用PCA算法來解決過擬合問題?為什么?
怎么樣確定PCA算法時的k參數?
實例:人臉識別
想想看,我們總共有4096個特征,可是數據集大小才400個,比特征個數還少,而且我們還需要把數據集分出20%來作為測試數據集,這樣訓練數據集就更小了。這樣的狀況下,模型根本無法進行準確地訓練和預測。
解決上述問題的一個辦法是使用PCA來給數據降維,只選擇前k個最重要的特征。問題來了,選擇多少個特征合適呢?即怎么確定k的值?
在scikit-learn里,可以從PCA模型的explained_variance_ratio_變量里獲取經PCA處理后的數據還原率。這是一個數組,所有元素求和即可知道我們選擇的k值的數據還原率,數值越大說明失真越小,隨著k值的增大,數值會無限接近于1。
利用這一特性,可以讓k取值10~300之間,每隔30進行一次取樣。在所有的k值樣本下,計算經過PCA算法處理后的數據還原率。然后根據數據還原率要求,來確定合理的k值。針對我們的情況,選擇失真度小于5%,即PCA處理后能保留95%的原數據信息。
機器學習 線性回歸
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。