Python預測分析核心演算法——Day4、5、6
第三章 預測模型的構建:平衡性能、複雜性以及大數據
選擇並擬合一個預測演算法的最終目標是獲得最佳可能的效果。可能達到的性能取決於3方面因素:問題的複雜性、模型演算法的複雜性以及可用的數據豐富度(其中當大數據情況下演算法的影響不大)。
3.1基本問題:理解函數逼近
本書涵蓋的演算法解決一類特定的預測問題。這類預測問題包含2類變數:
- 嘗試要預測的變數
- 用來進行預測的變數
這類問題稱為函數逼近問題,目標是構建以第二類變數為輸入的函數來預測第一類變數。
在一個函數逼近問題中,模型設計者一般從帶有標記的歷史樣本集合開始研究;接著從中找到可以用來構建預測模型的特徵。
要預測的變數一般有多種名稱:目標、標籤、結果;用來預測的變數同樣:預測因子、回歸因子、特徵以及屬性。
特徵工程一般需要通過一個由人工參與的、迭代的過程來完成特徵選擇,決定可能最優的特徵,並嘗試不同的組合。
3.1.1使用訓練數據
數據集包括結果及數據科學家選擇的特徵集合。
- 要預測的結果
- 用於預測的特徵
預測因子可以用矩陣形式來表示。
預測目標和預測因子都可能是多種數據類型。
構建預測的基本公式:
3.1.2評估預測模型的性能
好的性能意味著使用屬性x來生成一個接近真實y的預測。
對於回歸問題,y是一個實數,性能使用均方誤差MSE或平均絕對誤差MAE來度量。
對於分類問題,需要使用不同的性能指標。最常用的指標是誤分類率,即計算函數預測錯誤的樣本比例。
對於預測函數,需要評估其在新樣本上的錯誤程度。
3.2影響演算法的選擇及性能的因素——複雜度及數據
3.2.1簡單問題和複雜問題的對比
對模型進行評估的最佳方式是預留部分數據。畢竟,只有在新樣本上得到的性能才算是模型的性能。
- 影響性能的一個因素是問題複雜度。決策邊界的複雜性。
圖中的點都是通過隨機抽樣得到的數據。
- 影響性能的另一個因素是數據集的大小。數據集數據點不足時,就不能很好地區分邊界。
如果問題複雜,一個擁有大量數據的複雜模型可以生成精確結果。如果真實模型不複雜或者沒有足夠多的數據,一個線性模型可能有最好的答案。
3.2.2一個簡單模型與複雜模型的對比
現代機器學習演算法往往生成模型族。集成方法可以產生比線性方法更多的複雜模型。
3.2.3影響預測演算法性能的因素
- 影響性能的再一個因素是數據的分布形狀。
(三者都是矩陣), 是屬性陣, 是要學習的係數的矩陣,係數的個數也稱為自由度。增加一列相當於新增一個要學習的參數。增加額外的自由度會使模型更複雜。
數據的行列比(長寬比)也是一個需要考慮的方面。
生物數據集及自然語言處理數據集一般包含大量列的數據集,這些數據集雖然有很多樣本,但往往不足以訓練出一個好的複雜模型。(因為屬性太多),所以線性模型給出等價甚至更好的結果。
3.2.4選擇一個演算法:線性和非線性
對於列比行多的數據集或者相對簡單的問題,傾向於使用線性模型。
對於行比列多的數據集或者相對複雜的問題,傾向於使用非線性模型。
另一個考慮因素是訓練時間(線性方法比非線性方法訓練時間短
3.3度量預測模型性能
本節介紹針對預測模型進行性能度量的兩個方面。第一方面是對不同問題使用不同指標;第二方面是在預留樣本上進行錯誤估計的技術。
3.3.1不同類型問題的性能評價指標
- 如果預測錯誤的MSE痛目標方差幾乎相等,則預測效果不佳,若RMSE能達到實際目標標準差的一半,則說明性能不錯。【除了計算錯誤的摘要統計量以外,查看錯誤的分布直方圖、長尾分布(使用分位數或是等分邊界)以及正態分布程度等都可以用來分析錯誤原因以及錯誤程度。】
- 分類問題需要不同對待。圍繞誤分類率展開。
混淆矩陣(confusion matrix)或列聯表(contingency table)
如果目標是最小化誤分類錯誤,那麼最佳決策閾值應該設在0.25。
根據代價不同,決策閾值有所變化(如:將岩石預測為水雷,花費¥100下水確認;將水雷預測為岩石,爆炸損失¥1000)
如果分類器為隨機分類,則ROC的樣子為圖中虛線。,一個完美分類器應該是(0,0)到(0,1)到(1,1)。分類器約接近左上角效果越好,如果落入對角線以下,則可能是把數據的符號弄反了。
3.3.2部署模型的性能模擬
- 預留數據的幾種方法
- 訓練集+測試機:一般測試集占所有數據的25%~35%,因為模型訓練性能隨著訓練集規模減小而下降,所以要限制測試集的規模。
- n折交叉驗證:數據集被等分為n份不相交的子集,訓練和測試需要多次遍曆數據(被掃描n次。它通過在多份樣本上估計錯誤來估計錯誤邊界,為訓練集分配更多樣本,生成的模型會產生更低的泛化錯誤。但代價是訓練時間加長。
另一個要注意的是測試樣本應該能代表整個數據集。要避免在採樣過程給訓練集和測試集引入偏差。
3.4模型與數據的均衡
過擬合:訓練數據和測試數據上的錯誤存在顯著差異。
使用最小二乘法(OLS)來說明幾個問題。
2種方法來調整普通最小二乘法的瓶頸,前向逐步回歸和嶺回歸。
3.4.1通過權衡問題複雜度、模型複雜度
- 向前逐步回歸法
過擬合是很可能出現的,其中此例中過擬合出現的原因可能是X中有太多列。解決方式可能是刪掉一些列,然而刪掉列又意味著去掉多少列和哪幾列應該去掉。這種蠻力的方式也稱為最佳子集選擇。
3.4.2使用前向逐步回歸來控制過擬合
nCol:基本想法是在列的個數上增加一個約束,從X的所有列中抽取特定個數的列構成數據集,並執行最小二乘法,遍歷所有列的組合(列數為nCol),找到在測試集上表現最佳的nCol值;增加nCol值,重複上述過程。以上過程產生的最佳一列子集、兩列子集直到所有列(對應矩陣X)。每個子集同樣有一個性能與之對應。後選擇錯誤率低的版本。最佳子集存在的一個問題是該演算法需要大量計算。
最佳子集選擇以及前向逐步回歸基本類似。它們訓練一系列的模型(列數為1訓練幾個,列數為2訓練幾個,等等)。這種方法產生來的參數化的模型族(所有線性回歸以列數作為參數)。這些模型在複雜度上存在差異,最後的模型通過在預留樣本上計算錯誤進行選擇。
3.4.3評估並理解你的預測模型
- 這一系列模型進行了參數化,通過線性模型中的屬性個數進行區分
- 用到的屬性要進行排序。早期機器學習任務大部分包括尋找(或者構建)用於預測的最佳屬性集。
- 挑選模型,在泛化和複雜間去平衡。
3.4.4通過懲罰回歸係數來控制過擬合——嶺回歸
最佳子集回歸以及前向逐步回歸通過限制使用的屬性個數來控制回歸的複雜度。
另外一種方法稱為懲罰係數回歸。懲罰係數回歸是使係數變小,而不是使得係數為0。
- 嶺回歸是其中一種懲罰係數回歸方法。
- 逐步回歸演算法生成一系列不同模型,第一個模型只包含一個屬性,第二個模型含兩個屬性,等等,直到最後的模型包含所有屬性。
- 嶺回歸也包含一系列模型,它通過不同的 值來控制模型數量,而不是通過屬性個數。 參數決定了對 的懲罰力度, 的一系列值按照10的倍數遞減。
ROC曲線的下面積AUC常用來量化性能,除它之外,還有其他量化性能的方法,如:誤分類錯誤、不同預測結果的經濟代價(前面有講:魚雷的FalseAlarm和Miss的例子)等。
AUC的值越接近於1則性能越好,接近於0.5則說明不好。
小結:
本章首先針對問題複雜性及模型複雜性給出可視化示例,討論這些因素以及數據集大小如何影響給定問題的分類性能。接著討論針對不同問題(回歸。分類以及多分類)度量預測性能的多個評價指標,這些指標也是函數逼近問題的一部分。
介紹了用於在新數據上評估性能的2種方法(在測試集上評估和n折交叉檢驗)。
補充:
我們先來看一下這兩個函數的API以及參數含義:
1、fit_transform()函數
即fit_transform()的作用就是先擬合數據,然後轉化它將其轉化為標準形式
2、transform()函數
即tranform()的作用是通過找中心和縮放等實現標準化
到了這裡,我們似乎知道了兩者的一些差別,就像名字上的不同,前者多了一個fit數據的步驟,那為什麼在標準化數據的時候不適用fit_transform()函數呢?
原因如下:
為了數據歸一化(使特徵數據方差為1,均值為0),我們需要計算特徵數據的均值μ和方差σ^2,再使用下面的公式進行歸一化:
我們在訓練集上調用fit_transform(),其實找到了均值μ和方差σ^2,即我們已經找到了轉換規則,我們把這個規則利用在訓練集上,同樣,我們可以直接將其運用到測試集上(甚至交叉驗證集),所以在測試集上的處理,我們只需要標準化數據而不需要再次擬合數據。用一幅圖展示如下:
3、clf.fit
應該是用python訓練了一個模型做預測的時候用的。舉一個例子。
在用scikit-learn包訓練機器學習模型時候,這裡舉一個訓練SVM的例子:
先要按照scikit-learn包,先安裝下面三個依賴包:
Python (>= 2.6 or >= 3.3),
NumPy (>= 1.6.1),
SciPy (>= 0.9).
然後在cmd命令行中輸入:
pip install -U scikit-learn
>>>import numpy as np
>>> X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]]) #數據特徵
>>> y = np.array([1, 1, 2, 2]) # 數據對應的標籤
from sklearn.svm import SVC # 導入svm的svc類(支持向量分類)
>>> clf = SVC() # 創建分類器對象
>>> clf.fit(X, y) # 用訓練數據擬合分類器模型
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape=None, degree=3, gamma=auto, kernel=rbf,
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)
>>> clf.predict([[-0.8, -1]]) # 用訓練好的分類器去預測[-0.8, -1]數據的標籤
4、numpy.select
推薦閱讀:
※2-3 Cost Function-Intuition I
※面壁者系列:線性回歸
※乾貨 | 機器學習數學、概念及模型思維導圖
※基於不平衡樣本的推薦演算法研究
※Python基礎_103.數據結構與演算法_查找