1. 程式人生 > >機器學習(一):快速入門線性分類器

機器學習(一):快速入門線性分類器

定義

假設特徵與分類結果存線上性關係的模型,這個模型通過累加計算每個維度的特徵各自權重的乘積來幫助類別決策。

這裡寫圖片描述

線性關係公式 :f(w,x,b)=w^tx+b

x=(x1,x2,…xn) 代表n維特徵列向量,w=(w1,w2,…wn)代表對應的權重(係數 coeffient),同時為了避免其過座標原點這種硬性假設,增加一個截距(intercept) b。

f取值範圍分佈在整個實數域中.

線性其實就是一系列一次特徵的線性組合,在二維空間中是一條直線,在三維空間中是一個平面。

logistic函式公式

要處理的最簡單的二分類問題希望 f取值為 0 或1值,因此引入logistic函式
這裡寫圖片描述

將 f(w,x,b) 代替 x ,當 x =0時, f(x)為0.5, 若 x<0, f(x) <0.5, 若 x>0,則 f(x)>0.5

當使用一組m個用於訓練的特徵向量X=(x1,x2,,…xm) 和其所對應的分類目標 y=(y1,y2,,…ym), 我們希望logistic模型可以在這組訓練集上取得最大似然估計的概率 L(w,b).利用已知的樣本結果,反推最有可能(最大概率)導致這樣結果的引數值(模型已知,引數未知)

常用的線性分類的API :LogisticRegression

sklearn.linear_model.LogisticRegression(penalty=’l2’, dual=False, tol=0.0001, C=1.0, fit_intercept=True, intercept_scaling=1, class_weight=None, random_state=None, solver=’liblinear’, max_iter=100, multi_class=’ovr’, verbose=0, warm_start=False, n_jobs=1)[source]

  1. penalty:懲罰項,str型別,可選引數為l1和l2,預設為l2。用於指定懲罰項中使用的規範。newton-cg、sag和lbfgs求解演算法只支援L2規範。L1G規範假設的是模型的引數滿足拉普拉斯分佈,L2假設的模型引數滿足高斯分佈,所謂的正規化就是加上對引數的約束,使得模型更不會過擬合(overfit),但是如果要說是不是加了約束就會好,這個沒有人能回答,只能說,加約束的情況下,理論上應該可以獲得泛化能力更強的結果。
  2. dual:對偶或原始方法,bool型別,預設為False。對偶方法只用在求解線性多核(liblinear)的L2懲罰項上。當樣本數量>樣本特徵的時候,dual通常設定為False。
  3. tol:停止求解的標準,float型別,預設為1e-4。就是求解到多少的時候,停止,認為已經求出最優解。
  4. c:正則化係數λ的倒數,float型別,預設為1.0。必須是正浮點型數。像SVM一樣,越小的數值表示越強的正則化。
  5. fit_intercept:是否存在截距或偏差,bool型別,預設為True。
  6. intercept_scaling:僅在正則化項為”liblinear”,且fit_intercept設定為True時有用。float型別,預設為1。
  7. class_weight:用於標示分類模型中各種型別的權重,可以是一個字典或者’balanced’字串,預設為不輸入,也就是不考慮權重,即為None。如果選擇輸入的話,可以選擇balanced讓類庫自己計算型別權重,或者自己輸入各個型別的權重。舉個例子,比如對於0,1的二元模型,我們可以定義class_weight={0:0.9,1:0.1},這樣型別0的權重為90%,而型別1的權重為10%。如果class_weight選擇balanced,那麼類庫會根據訓練樣本量來計算權重。某種型別樣本量越多,則權重越低,樣本量越少,則權重越高。當class_weight為balanced時,類權重計算方法如下:n_samples / (n_classes * np.bincount(y))。n_samples為樣本數,n_classes為類別數量,np.bincount(y)會輸出每個類的樣本數,例如y=[1,0,0,1,1],則np.bincount(y)=[2,3]。
    那麼class_weight有什麼作用呢?
    在分類模型中,我們經常會遇到兩類問題:
    第一種是誤分類的代價很高。比如對合法使用者和非法使用者進行分類,將非法使用者分類為合法使用者的代價很高,我們寧願將合法使用者分類為非法使用者,這時可以人工再甄別,但是卻不願將非法使用者分類為合法使用者。這時,我們可以適當提高非法使用者的權重。
    第二種是樣本是高度失衡的,比如我們有合法使用者和非法使用者的二元樣本資料10000條,裡面合法使用者有9995條,非法使用者只有5條,如果我們不考慮權重,則我們可以將所有的測試集都預測為合法使用者,這樣預測準確率理論上有99.95%,但是卻沒有任何意義。這時,我們可以選擇balanced,讓類庫自動提高非法使用者樣本的權重。提高了某種分類的權重,相比不考慮權重,會有更多的樣本分類劃分到高權重的類別,從而可以解決上面兩類問題。
  8. random_state:隨機數種子,int型別,可選引數,預設為無,僅在正則化優化演算法為sag,liblinear時有用。
  9. solver:優化演算法選擇引數,只有五個可選引數,即newton-cg,lbfgs,liblinear,sag,saga。預設為liblinear。solver引數決定了我們對邏輯迴歸損失函式的優化方法,有四種演算法可以選擇,分別是iblinear:使用了開源的liblinear庫實現,內部使用了座標軸下降法來迭代優化損失函式。lbfgs:擬牛頓法的一種,利用損失函式二階導數矩陣即海森矩陣來迭代優化損失函式。newton-cg:也是牛頓法家族的一種,利用損失函式二階導數矩陣即海森矩陣來迭代優化損失函式。sag:即隨機平均梯度下降,是梯度下降法的變種,和普通梯度下降法的區別是每次迭代僅僅用一部分的樣本來計算梯度,適合於樣本資料多的時候。saga:線性收斂的隨機優化演算法的的變重。
  10. max_iter:演算法收斂最大迭代次數,int型別,預設為10。僅在正則化優化演算法為newton-cg, sag和lbfgs才有用,演算法收斂的最大迭代次數。
  11. multi_class:分類方式選擇引數,str型別,可選引數為ovr和multinomial,預設為ovr。ovr即前面提到的one-vs-rest(OvR),而multinomial即前面提到的many-vs-many(MvM)。如果是二元邏輯迴歸,ovr和multinomial並沒有任何區別,區別主要在多元邏輯迴歸上
  12. verbose:日誌冗長度,int型別。預設為0。就是不輸出訓練過程,1的時候偶爾輸出結果,大於1,對於每個子模型都輸出
  13. warm_start:熱啟動引數,bool型別。預設為False。如果為True,則下一次訓練是以追加樹的形式進行(重新使用上一次的呼叫作為初始化)。
  14. n_jobs:並行數。int型別,預設為1。1的時候,用CPU的一個核心執行程式,2的時候,用CPU的2個核心執行程式。為-1的時候,用所有CPU的核心執行程式。

優點:實現簡單,易於理解和實現;計算代價不高,速度很快,儲存資源低。

缺點:容易欠擬合,分類精度可能不高。

特點

線性分類器可以說是最為基本和常用的機器學習模型。儘管其受限於資料特徵與分類目標之間的線性假設,我們仍然可以在科學研究與工程實踐中把線性分類器的表現效能作為基準。這裡所使用的模型包括logisticRegressionSGDClassifier.相比之下,前者對引數的計算採用精確解析的方式,計算時間長但是模型效能略高;後者採用隨機梯度上升演算法估計模型引數,計算時間短但是產出的模型效能略低。一般而言,對於訓練資料規模在10W以上的資料考慮到時間的耗用,我們更推薦使用隨機梯度演算法對模型引數進行估計