天天看點

邏輯回歸及梯度下降法1 邏輯回歸2 梯度下降法3 更新過程向量化4 邏輯回歸的代碼實作5 sklearn中邏輯回歸的參數介紹

1 邏輯回歸

1.1 原理過程

邏輯回歸是一種二分類方法。

  • 找到預測函數,一般表示為h函數,用來預測輸入資料的判斷結果:

    分類邊界為線性邊界時,預測函數為

    邏輯回歸及梯度下降法1 邏輯回歸2 梯度下降法3 更新過程向量化4 邏輯回歸的代碼實作5 sklearn中邏輯回歸的參數介紹
    h θ ( x ) h_θ(x) hθ​(x)函數的值表示結果取1的機率。
  • 找到損失函數,記為J(θ)函數,表示所有訓練資料預測值和實際類别的偏差:

    基于最大似然估計,得到損失函數

    邏輯回歸及梯度下降法1 邏輯回歸2 梯度下降法3 更新過程向量化4 邏輯回歸的代碼實作5 sklearn中邏輯回歸的參數介紹
    邏輯回歸及梯度下降法1 邏輯回歸2 梯度下降法3 更新過程向量化4 邏輯回歸的代碼實作5 sklearn中邏輯回歸的參數介紹
  • 找到J(θ)函數的最小值:

    根據梯度下降的公式,得到疊代公式

    邏輯回歸及梯度下降法1 邏輯回歸2 梯度下降法3 更新過程向量化4 邏輯回歸的代碼實作5 sklearn中邏輯回歸的參數介紹
    因為式中α為一常量,是以1/m一般省略,是以最終的θ更新過程為:
    邏輯回歸及梯度下降法1 邏輯回歸2 梯度下降法3 更新過程向量化4 邏輯回歸的代碼實作5 sklearn中邏輯回歸的參數介紹

2 梯度下降法

梯度下降法(gradient descent)是一種常用的一階優化方法,是求解無限制優化問題最簡單、最經典的方法之一。

求解目标函數J(θ)的最小值,梯度下降法公式:

邏輯回歸及梯度下降法1 邏輯回歸2 梯度下降法3 更新過程向量化4 邏輯回歸的代碼實作5 sklearn中邏輯回歸的參數介紹

梯度下降法包括批量梯度下降法和随機梯度下降法。批量梯度下降:每疊代一步,要用到訓練集的所有樣本。随機梯度下降:每疊代一步,用到訓練集中的部分樣本。

牛頓法是典型的二階方法,其疊代輪數遠小于梯度下降法,但其每輪疊代中涉及到海森矩陣的求逆,計算複雜度相當高。拟牛頓法是以較低的計算代價尋找海森矩陣的近似逆矩陣。

牛頓法疊代公式:

邏輯回歸及梯度下降法1 邏輯回歸2 梯度下降法3 更新過程向量化4 邏輯回歸的代碼實作5 sklearn中邏輯回歸的參數介紹

H k H_k Hk​是海森矩陣(二階導數矩陣), g k g_k gk​是一階導數。

3 更新過程向量化

vectorization後θ更新的步驟如下:

(1)求A=x·θ;

(2)求E=g(A)-y;

(3)求θ:=θ-α.x’.E,x’表示矩陣x的轉置。

4 邏輯回歸的代碼實作

# 加載庫
import numpy as np
from sklearn import datasets

# 定義 sigmoid 函數
def sigmoid(x):
    return 1.0 / (1.0 + np.exp(-x))

# 定義梯度下降的過程
def gradDescent(dataMatIn,classLabels):
    dataMatrix = np.mat(dataMatIn)
    labelMat = np.mat(classLabels).transpose()
    m = dataMatrix.shape[0]
    n = dataMatrix.shape[1]
    alpha = 0.001
    maxCycles = 500
    weights = np.ones((n,1))   # 參數初始化
    for k in range(maxCycles):
        h = sigmoid(dataMatrix * weights)
        error = h -labelMat
        weights -= alpha * dataMatrix.transpose() * error
    return weights

#加載資料
irisData = datasets.load_iris()  
data = irisData.data  # 資料的樣本及特征,n維數組
labels = irisData.target  # 資料的标簽,1維數組

# 得到疊代完成的模型參數
gradDescent(data,labels)
           

模型結果:

array([[ 40.55002842],

[-10.34998117],

[103.2500085 ],

[ 45.50000138]])

5 sklearn中邏輯回歸的參數介紹

5.1 LogisticRegression 函數的參數

penalty 正則化選擇 可選“l1”和“l2”,預設“l2”。l1 正則化時,solver 隻能選擇 liblinear。
dual 用來指明是否将原問題改成他的對偶問題,預設是False。隻适用于libnear的L2正則化。樣本數量大于特征數量時選False。
tol 殘差收斂條件,預設是0.0001,隻需要收斂的時候兩步隻差<0.0001就停止。
C 正則化系數的倒數,c越小,表示正則化強度越大。預設1.0
fit_intercept 是否将截距加入到決策模型中,預設為True。
intercept_scaling 預設為1。隻有當 solver 是 liblinear 且 fit_intercept 為 true 時才有用,即在矩陣中添加一列1。
class_weight 類型權重 用于标示分類模型中各種類型的權重,預設是None,即不考慮權重,或者說所有類型的權重一樣。可以選擇balanced讓類庫自己計算類型權重,或者自己輸入各個類型的權重,比如對于0,1的二進制模型,我們可以定義class_weight={0:0.9, 1:0.1},這樣類型0的權重為90%,而類型1的權重為10%。如果選擇balanced,那麼類庫會根據訓練樣本量來計算權重。某種類型樣本量越多,則權重越低,樣本量越少,則權重越高。那麼class_weight有什麼作用呢?在分類模型中,我們經常會遇到兩類問題:第一種是誤分類的代價很高。第二種是樣本高度失衡。
random_state 随機種子的設定,預設是None。如果設定了随機種子,那麼每次使用的訓練集和測試集都是一樣的,這樣不管你運作多少次,最後的準确率都是一樣的;如果沒有設定,那麼每次都是不同的訓練集和測試集,最後得出的準确率也是不一樣的。隻有當solver選擇‘sag’ 或者是‘liblinear’時使用。
solver 優化算法選擇 預設是 ** lbfgs**。 a) liblinear:适用于小資料集+L1,内部使用了坐标軸下降法來疊代優化損失函數。b) lbfgs:L2,拟牛頓法的一種,利用損失函數二階導數矩陣即海森矩陣來疊代優化損失函數。c) newton-cg:L2,牛頓法家族的一種,利用損失函數二階導數矩陣即海森矩陣來疊代優化損失函數。d) sag:L2,即随機平均梯度下降,是梯度下降法的變種,和普通梯度下降法的差別是每次疊代僅僅用一部分的樣本來計算梯度,适合于大資料集。e) saga:‘multinomial’ + L1,适用于大資料集。 liblinear隻支援OvR,不支援MvM。‘sag’和**‘saga’要求資料有相同的量綱**。
max_iter 算法收斂的最大疊代次數預設是100。僅适用于solver選擇newton-cg,sag和lbfgs
multi_class 分類參數選擇 可選ovr、multinomial和auto,預設是 auto。ovr即one-vs-rest(OvR),而multinomial即many-vs-many(MvM)。差別主要在多元邏輯回歸上。OvR:對于第K類的分類決策,我們把所有第K類的樣本作為正例,除了第K類樣本以外的所有樣本都作為負例,然後在上面做二分類,得到第K類的分類模型。其他類的分類模型獲得以此類推。而MvM則相對複雜,舉MvM的特例one-vs-one(OvO)作講解。如果模型有T類,我們每次在所有的T類樣本裡面選擇兩類樣本出來,不妨記為T1類和T2類,把所有的輸出為T1和T2的樣本放在一起,把T1作為正例,T2作為負例,進行二分類,得到模型參數。我們一共需要T(T-1)/2次分類。OvR相對簡單,但分類效果相對略差(這裡指大多數樣本分布情況,某些樣本分布下OvR可能更好)。而MvM分類相對精确,但是分類速度沒有OvR快。auto:當資料是二分類或者優化算法是liblinear時選擇ovr,其他情況選擇multinomial。
verbose “備援”,會輸出一些模型運算過程中的東西(任務程序)。整數型,預設值為0,适用于solver選擇liblinear或lbfgs時,将verbose設定為任何正數以表示冗長度。
warm_start 是否使用上次的模型結果作為初始化,預設是False,表示不使用。
n_jobs 并行運算數量(核的數量),預設為1,如果設定為-1,則表示将電腦的cpu全部用上。

在 fit 函數中可以使用sample_weight,來自己調節每個樣本權重。

# 調用
from sklearn.linear_model import LogisticRegression
clf = LogisticRegression()
model = clf.fit(data,labels)
           

模型對象:

coef_:傳回各特征的系數,絕對值大小可以了解成特征重要性
intercept_:傳回模型的截距
n_iter_:模型疊代次數
classes_:類别标簽清單
           

模型方法:

predict_proba(X):傳回每個類别的機率值(有幾類就傳回幾列值)
predict_log_proba(X):傳回機率值的log值(即将機率取對數)
predict(X):傳回預測結果值(0/1)
score(X, y=None):傳回函數
get_params(deep=True):傳回估計器的參數
set_params(**params):為估計器設定參數
           

5.2 LogisticRegressionCV 的參數

Cs 正則項系數的倒數組成的浮點數清單或者一個整數。
cv 交叉驗證。預設5。
scoring 模型評估标準,預設是 accuracy。

繼續閱讀