邏輯回歸算法
邏輯回歸算法的概念不咋敘述
邏輯回歸算法看上去是解決回歸問題的算法,但是其實是解決的分類問題,那么回歸算法是如何解決分類問題呢?邏輯回歸的原理是將樣本的特征和樣本發生的概率聯系起來,即預測這個樣本的發生概率是多少,而這個概率是一個數,因此可稱這個為回歸問題
對於機器算法來說,其本質就是求解一個函數,將樣本代入,經過函數計算以后可以得到一個預測的值,在線性回歸和多項式回歸中,預測的值和問題具有很強的關聯性,但是在邏輯回歸中,預測的值其本質就是概率值,也就是說,將樣本代入函數計算以后,可以得到一個概率值,之后根據這個概率值進行分類,如果有一半的概率發生的話,就等於1,反之等於0(1和0的意義看問題)
從上面的敘述中可以發現,邏輯回歸算法既可以看做是一個回歸算法,又可以看作是一個分類算法,如果沒有最后的分類的話,其就是一個回歸算法,算出來的是根據樣本特征來擬合一個事件發生的概率,不過通常拿來用於作為分類算法,注意的是,其只能解決二分類的問題,對於多分類問題,其本身是不支持的
邏輯回歸的計算方式
一個樣本包含若干特征,經過函數的計算,就得到了對應的y值,對於線性回歸來說,其就是
這樣得到的y值,其值域是正無窮到負無窮的,即通過線性回歸的方式可以得到任意的值,對於概率來講,只能在0和1之間取值,因此直接使用線性回顧的方式得到的結果沒有值域的限制,這就讓最后擬合出來的函數可信程度不高
解決方案很簡單,使用線性回歸的方式得到的結果,將這結果作為特征值送到新的函數中
經過轉換以后就可以得到一個在0到1之間的值,這就得到了xb中發生某一個特定事件的概率是多少了
新的函數一般使用sigmoid函數,其表達式為
具體實現的操作
(在notebook中)
加載好包以后,定義sigmoid函數,設置繪制的x和y的范圍,然后繪制
import numpy as np
import matplotlib.pyplot as plt
def sigmoid(t):
return 1 / (1 + np.exp(-t))
x = np.linspace(-10,10,500)
y = sigmoid(x)
plt.plot(x,y)
圖像為
對於這根曲線來說,左端和右端都趨向於0和1,也就是說值域是在0和1之間,可以發現,在t>0的時候,p>0.5,t<0時,p<0.5,使用函數,將求出來的結果進行sigmoid函數計算,之后根據得到的值來分類
這就有了問題,對於給定的樣本數據集,我們如何才能找到參數theta,使用這種方式可以最大程度的獲得樣本數據集對應的分類輸出呢?
邏輯回歸的損失函數
邏輯回歸的整體框架如下
那么應該怎么建模來求出theta?
在線性回歸中,在theta乘上xb之后就是估計值,讓估計值減去真值,用這個差來度量估計的好壞,對這個差進行平方和以后再平均(MSE),作為損失函數,然后找到使損失函數最小的theta就行了
對於邏輯回歸,整體方向是一樣的,只不過比較麻煩,由於邏輯回歸解決的是個分類問題,所以得出的數據,要不是1,要不是0,需要根據先前計算出的概率來估計是1還是0,那么損失函數也可以分成兩類,如果真值為1,p越小,cost越大,如果真值等於0,p越大,cost越大(cost為損失)
也就是說首先根據分類的不同制定出了損失的大致趨勢,根據真值的不同,分為兩種情況
根據log函數的圖像的特性,可以使用log函數來設計損失函數
在p取0的時候,此時函數趨近於正無窮,p取1的時候,函數為1,通過前面的分析和圖像的理解,可以很清楚的明白其代表的意義
很顯然,這個函數用起來是不太方便的,那么就在兩個式子前加上一個系數,用來表示y的狀態,這樣就合為了一個函數
如果有m個樣本,則就將這些損失加在一起
其中的預測結果為
那么整體的數學解函數就為(凸函數,只存在全局最優解)
接下來就是找到一組theta,使上式得到最小值,這個函數沒有公式解,只能使用梯度下降法來求解
經過一系列的操作計算,最后可以得到對於邏輯回歸的損失函數來說的相應的梯度為
這樣只用使用公式以及梯度下降法就可以解除邏輯回歸算法的問題