[Quant 1.1] 嘗試只用Numpy實(shí)現(xiàn)邏輯回歸
之前關(guān)注了一個up主,看了兩個視頻之后感覺他講的非常好。因?yàn)楫?dāng)時還沒放假,所以就沒有仔細(xì)看,就想著放假之后一定好好修煉修煉技術(shù)。祝自己能堅(jiān)持下去,同時非常感謝大神的視頻。

從我的水平看,up調(diào)取了pytorch的包,把numpy array轉(zhuǎn)化成張量然后帶入到自己寫的邏輯回歸函數(shù)中循環(huán)。因?yàn)槲腋杏X短期可能沒法把pytorch學(xué)的那么扎實(shí),所以就想只用numpy試試能不能把邏輯回歸寫出來(我也不想做調(diào)包俠)。然后這個僅作為我看完原up視頻之后的一點(diǎn)小練習(xí)和記錄,所以我不會說的非常的細(xì)致。如果讀到這篇的朋友需要我在哪個地方詳細(xì)說明的話我會更新這篇。我會盡快附上代碼鏈接。感興趣的朋友可以私我一些意見/把我拉進(jìn)金工金數(shù)量化或者CFA2級備考的群,菜鳥不勝感激!
1. 模型
在開始講代碼之前,我們先整理一下邏輯,也相當(dāng)于復(fù)習(xí)一下邏輯回歸的框架了。
邏輯回歸模型是基于sigmoid激活函數(shù)的,也就是
模型是
左邊的條件概率相當(dāng)于一個關(guān)于x的函數(shù)。x是一個樣本的attributes向量,例如對你來說,你有一個x向量,是你的身高,
是你的體重...。同樣,對你來說,你還有一個性別y(不好意思我這里暫時不考慮trans),y=1說明你是女性,y=0說明你是男性。w是針對所有的人來說每一個attribute對判斷你性別的影響,例如w1就是一個人的身高在判斷這個人是男是女的時候的重要性。
在線性回歸里面,我們用的損失函數(shù)是MSE。而在邏輯回歸里面我們要用的損失函數(shù)是cross entropy。
y是你真實(shí)的性別,是之前預(yù)測的你的性別
這是因?yàn)樵谶壿嫽貧w模型下,損失函數(shù)MSE非凸,所以不能使用梯度下降法來求最小的loss。如果你在邏輯回歸中用了MSE,那么你要最小化的損失函數(shù)很可能長這個樣子。

但是如果你使用了cross entropy,損失函數(shù)基本就長這樣子。

Plot by Wolfram
多說一句,即使cross entropy損失函數(shù)是凸的,我們也沒辦法用first order condition來求解他的全局最小值,因?yàn)樗麤]有。我是愚蠢的用手推了很久才發(fā)現(xiàn)的。
所以之后要做的事情就是:我們先猜想一組??和?
,然后我們把a(bǔ)ttributes向量一個一個的代入到這個邏輯回歸模型里面。我們就會獲得1個預(yù)測值,然后用1個預(yù)測值和1個真實(shí)值來計(jì)算出1個對應(yīng)的loss。然后計(jì)算這個loss對各個attribute的偏導(dǎo)數(shù),就可以更新我們的
和
了。
這里因?yàn)樵谟?jì)算??的時候要用到?
?和?
?,所以g也是關(guān)于?
?和?
?的函數(shù)。
而實(shí)際上,我們可以選擇多個attributes向量一起代入,得到多個loss的平均值,然后求這個平均loss的對??和?
?的偏導(dǎo)數(shù),在用上面同樣的式子來更新參數(shù)。在這種情況下,向量乘法會變成矩陣乘法,大神在視頻2中有詳細(xì)講解。
2. 代碼
除了numpy之外,sklearn主要是導(dǎo)入和up同樣的數(shù)據(jù)庫來檢驗(yàn)我自己建立的邏輯回歸模型的表現(xiàn)。matplotlib拿來畫圖。
然后是定義sigmoid函數(shù)和cross entropy函數(shù),數(shù)學(xué)表達(dá)式就是上面寫到的激活函數(shù)和損失函數(shù)。
下一個函數(shù)是計(jì)算損失,大致就是先用?(把前面提到的?
?縱向堆疊到一起),?
?和?
?來求出?
?,再對應(yīng)實(shí)際的?
?計(jì)算出的多個樣本對應(yīng)損失的平均值。樣本個數(shù)就是矩陣
?的行數(shù)。
下面是用來求梯度的函數(shù),因?yàn)閚umpy本身的diff函數(shù)是計(jì)算離散數(shù)列鄰項(xiàng)的差的,因此不能用來求偏導(dǎo)。因此我來定義一個函數(shù),用來求解loss函數(shù)在?各個方向的梯度。
提取數(shù)據(jù),劃分訓(xùn)練集和測試集(和原up的代碼相同),把??和?
?都初始化為0向量。
下面是主函數(shù)。
我的代碼用了5000次迭代,最后的loss是0.20495,下面是最后得到的??和?
?的結(jié)果。
這個和原up的回歸結(jié)果有一些出入,但是還好。。

最后計(jì)算一下預(yù)測的準(zhǔn)確率
計(jì)算出來是92.647%