聊聊機器學習之邏輯迴歸

一說到機器學習算法,相信很多人想到的第一個機器學習算法就是邏輯迴歸,那麼什麼是邏輯迴歸?怎麼用邏輯迴歸這一算法呢?這篇文章就跟大家來聊聊這個話題。不深入聊底層實現原理,純粹聊聊基於應用層面的一些知識。

1、什麼是邏輯迴歸

用一句話來解釋什麼是邏輯迴歸:邏輯迴歸假設數據服從伯努利分佈,通過極大化似然函數的方法,運用梯度下降來求解參數,來達到將數據二分類的目的。

這句話包含了五個重要信息點:

  • 邏輯迴歸的假設:數據服從伯努利分佈

  • 邏輯迴歸的損失函數:極大似然函數

  • 邏輯迴歸的求解方法:梯度下降

  • 邏輯迴歸的目的:將數據二分類

  • 邏輯迴歸的分類方式:劃定一個閾值,大於這個閾值的是一類,小於這個閾值的是另外一類

1.1 邏輯迴歸的假設

伯努利分佈又名兩點分佈0-1分佈,伯努利試驗是隻有兩種可能結果的單次隨機試驗,即對於一個隨機變量X而言:

 

 

伯努利試驗都可以表達爲“是或否”的問題。例如,拋一次硬幣問題,拋中爲正面的概率是p,拋中爲負面的概率是1−p.

1.2 邏輯迴歸的損失函數:極大似然函數

損失函數就是預測結果與實際值的差值的各種方式求和,作用是衡量模型預測的好壞,損失函數模型越小,模型越好。

損失函數一般有四種,平方損失函數,對數損失函數,HingeLoss0-1損失函數,絕對值損失函數。將極大似然函數取對數以後等同於對數損失函數。在邏輯迴歸這個模型下,對數損失函數的訓練求解參數的速度是比較快的。

極大似然函數是由極大似然得到的一種損失函數

極大似然估計的原理,用一張圖片來說明,如下圖所示:

總結起來,最大似然估計的目的就是:利用已知的樣本結果,反推最有可能(最大概率)導致這樣結果的參數值。

原理:極大似然估計是建立在極大似然原理的基礎上的一個統計方法,是概率論在統計學中的應用。極大似然估計提供了一種給定觀察數據來評估模型參數的方法,即:“模型已定,參數未知”。通過若干次試驗,觀察其結果,利用試驗結果得到某個參數值能夠使樣本出現的概率爲最大,則稱爲極大似然估計。

1.3 梯度下降

梯度下降包含:隨機梯度下降,批梯度下降,small batch 梯度下降三種方式。

批梯度下降會獲得全局最優解,缺點是在更新每個參數的時候需要遍歷所有的數據,計算量會很大,並且會有很多的冗餘計算,導致的結果是當數據量大的時候,每個參數的更新都會很慢。

隨機梯度下降是以高方差頻繁更新,優點是使得sgd會跳到新的和潛在更好的局部最優解,缺點是使得收斂到局部最優解的過程更加的複雜。

小批量梯度下降結合了sgd和batch gd的優點,每次更新的時候使用n個樣本。減少了參數更新的次數,可以達到更加穩定收斂結果,一般在深度學習當中我們採用這種方法。

由於極大似然函數無法直接求解,我們一般通過對該函數進行梯度下降來不斷逼急最優解,即求極大似然函數的最小值。

2 邏輯迴歸的應用案例(python sklearn庫)


import xlrd
import matplotlib.pyplot as plt
import numpy as np
from sklearn import model_selection
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
 
 
data = xlrd.open_workbook('gua.xlsx')
sheet = data.sheet_by_index(0)
Density = sheet.col_values(6)
Sugar = sheet.col_values(7)
Res = sheet.col_values(8)
 
# 讀取原始數據
X = np.array([Density, Sugar])
# y的尺寸爲(17,)
y = np.array(Res)
X = X.reshape(17,2)
 
# 繪製分類數據
f1 = plt.figure(1)
plt.title('watermelon_3a')
plt.xlabel('density')
plt.ylabel('ratio_sugar')
# 繪製散點圖(x軸爲密度,y軸爲含糖率)
plt.scatter(X[y == 0,0], X[y == 0,1], marker = 'o', color = 'k', s=100, label = 'bad')
plt.scatter(X[y == 1,0], X[y == 1,1], marker = 'o', color = 'g', s=100, label = 'good')
plt.legend(loc = 'upper right')
plt.show()
# 從原始數據中選取一半數據進行訓練,另一半數據進行測試
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.5, random_state=0)
 
# 邏輯迴歸模型
log_model = LogisticRegression()
# 訓練邏輯迴歸模型
log_model.fit(X_train, y_train)
 
# 預測y的值
y_pred = log_model.predict(X_test)
 
# 查看測試結果
print(metrics.confusion_matrix(y_test, y_pred))
print(metrics.classification_report(y_test, y_pred))

3 邏輯迴歸的優缺點

3.1 優點

形式簡單,模型的可解釋性非常好:從特徵的權重可以看到不同的特徵對最後結果的影響,某個特徵的權重值比較高,那麼這個特徵最後對結果的影響會比較大。

模型效果不錯:在工程上是可以接受的(作爲baseline),如果特徵工程做的好,效果不會太差,並且特徵工程可以大家並行開發,大大加快開發的速度。

訓練速度較快:分類的時候,計算量僅僅只和特徵的數目相關。並且邏輯迴歸的分佈式優化sgd發展比較成熟,訓練的速度可以通過堆機器進一步提高,這樣我們可以在短時間內迭代好幾個版本的模型。

資源佔用小,尤其是內存:因爲只需要存儲各個維度的特徵值。

方便輸出結果調整:邏輯迴歸可以很方便的得到最後的分類結果,因爲輸出的是每個樣本的概率分數,我們可以很容易的對這些概率分數進行cutoff,也就是劃分閾值(大於某個閾值的是一類,小於某個閾值的是一類)。

3.2 缺點:

準確率並不是很高:因爲形式非常的簡單(非常類似線性模型),很難去擬合數據的真實分佈。

很難處理數據不平衡的問題:舉個例子:如果我們對於一個正負樣本非常不平衡的問題比如正負樣本比 10000:1.我們把所有樣本都預測爲正也能使損失函數的值比較小。但是作爲一個分類器,它對正負樣本的區分能力不會很好。

處理非線性數據較麻煩:邏輯迴歸在不引入其他方法的情況下,只能處理線性可分的數據,或者進一步說,處理二分類的問題 。邏輯迴歸本身無法篩選特徵。有時候,我們會用gbdt(梯度提升決策樹)來篩選特徵,然後再上邏輯迴歸。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章