機器學習實戰——梯度下降求解邏輯迴歸(理論基礎)

機器學習實戰——梯度下降求解邏輯迴歸(理論基礎)

個人項目:https://github.com/miraitowa/Machine-Learning

邏輯迴歸是迴歸還是分類?
邏輯迴歸是分類,不要被名字所欺騙。因本篇文章僅討論二分類問題,故我們將邏輯迴歸最終得到的預測值看作兩個,即是或否(0或1)。
從線性迴歸開始
爲什麼從線性迴歸開始呢?因爲二分類問題解的得出與線性迴歸有很大關係,邏輯迴歸之所以叫回歸因爲其與線性迴歸有着千絲萬縷的關係。
有這樣一個例子:
我們用numpy包生成一百個隨機的x值,並且設定y值與x有一定的線性關係,最後把這樣的線性關係繪製出來:

import numpy as np

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
%matplotlib inline

# 使用numpy生成100個隨機點   樣本

x_data = np.random.rand(100)

y_data = x_data * 0.1 + 0.2

fig, ax = plt.subplots()

ax.scatter(x_data, y_data)

ax.set_xlabel('x')

ax.set_ylabel('y')

plt.show()

繪製出來的圖是這樣的:

線性迴歸的目標便是求得一條曲線,能最大程度擬合我們的數據點(X1、X2軸),而曲線的Y值便是我們的預測值。其實就是個立體的曲線,圖例如下:

即線性迴歸得出的是連續的結果,如果我們僅僅需要得到離散的結果,即是或否,由此便引出了二分類問題,也就是本文要討論的邏輯迴歸方法。

問題的提出

現要實現一個簡單的邏輯迴歸:

我們將建立一個邏輯迴歸模型來預測一個學生是否被大學錄取。假設你是一個大學系的管理員,你想根據兩次考試的結果來決定每個申請人的錄取機會。你有以前的申請人的歷史數據,你可以用它作爲邏輯迴歸的訓練集。對於每一個培訓例子,你有兩個考試的申請人的分數和錄取決定。爲了做到這一點,我們將建立一個分類模型,根據考試成績估計入學概率。

即要求我們通過一些數據集來訓練電腦,能實現輸入兩門考試成績從而得到是否錄取的結果。

設X1爲exam1的成績,X2爲exam2的成績,X1、X2就是我們的兩個特徵。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

import os
path = "data" + os.sep + "LogiReg_data.txt"
pdData = pd.read_csv(path, header=None, names=['Exam 1', 'Exam 2', 'Admitted'])
pdData.head()

可以看到學生有兩門成績,學校是通過兩門成績來決定是否錄取。

之後我們可以利用python的繪圖包通過散點圖的繪製來將數據更直接的表現出來。

positive = pdData[pdData['Admitted'] == 1]
negative = pdData[pdData['Admitted'] ==0 ]

fig, ax = plt.subplots(figsize=(10,5))
ax.scatter(positive['Exam 1'], positive['Exam 2'], s=30, c='b', marker='o', label='Admitted')
ax.scatter(negative['Exam 1'], negative['Exam 2'], s=30, c='r', marker='x', label='Not Admitted')
ax.legend()
ax.set_xlabel('Exam 1 Score')
ax.set_ylabel('Exam 2 Score')

初步求解

我們求解的線性關係一定是有參數的,因爲我們有兩個特徵值,而我們需要通過兩個特徵值求得預測值,但是兩個特徵值對結果的影響又不盡相同,

所以我們需要兩個參數來度量兩個特徵值對結果影響程度,以及一個參數來充當偏置項(曲線會上下浮動,且偏置項對結果作用較小):

所以我們的預測結果可以表示爲:

整合之後:

這便是我們構造的預測結果值,但是僅僅有結果值還是不夠的,我們需要將預測結果值轉化爲錄取的概率,我們規定:當概率大於0.5則Y可以取1表示錄用,小於0.5不錄用Y取0,所以我們又需要一個函數來轉化預測值爲概率,稱爲sigmoid函數,定義如下:

def sigmoid(z):
    return 1 / (1 + np.exp(-z))

nums = np.arange(-10, 10 ,step=1)
fig, ax = plt.subplots(figsize=(12,4))
ax.plot(nums, sigmoid(nums), 'r')

可以看到該函數符合我們的需求,其取值位於0到1,定義域爲實數集R,可以將我們的預測結果轉化爲概率!

而所謂的邏輯迴歸便是將任意的輸入值映射到[0,1]區間上,將我們通過線性迴歸得到的預測值轉化爲概率,完成分類任務。

初步求解

我們載入數據,大體明白了預測結果長什麼樣,以及值概率的轉化,但我們的模型還完全沒有建立起來!

我們知道所謂機器學習便是我們交給機器一堆數據,然後告訴它什麼樣的學習方式是對的(目標函數),叫它朝着這個方向走,然後還要規定每次走的步長(學習率)

如同這樣一個山谷,我們要達到山谷的最低點,利用梯度下降的方法,每經過一個數據點,便運行更新函數更新下一步的方向(梯度,求偏導)。
所以我們還要做損失函數(目標函數)、更新函數。

何爲損失函數?

我們通過X來估計Y的值,預測值可能符合真實值,也可能不符合真實值,所以我們引入損失函數來度量擬合的程度,損失函數越小代表擬合的越好。
在此處我們暫時將損失函數視爲目標函數。

關於梯度下降

梯度下降便是在凸函數中沿着梯度下降的方向不斷更新參數,一般情況下我們通過加負號實現。

梯度下降有三種方式實現:

1 批量梯度下降法(Batch Gradient Descent)

批量梯度下降法,是梯度下降法最常用的形式,具體做法也就是在更新參數時使用所有的樣本來進行更新

2 隨機梯度下降法(Stochastic Gradient Descent)

隨機梯度下降法,其實和批量梯度下降法原理類似,區別在與求梯度時沒有用所有的m個樣本的數據,而是僅僅選取一個樣本j來求梯度。

隨機梯度下降法,和批量梯度下降法是兩個極端,一個採用所有數據來梯度下降,一個用一個樣本來梯度下降。自然各自的優缺點都非常突出。

對於訓練速度來說,隨機梯度下降法由於每次僅僅採用一個樣本來迭代,訓練速度很快,而批量梯度下降法在樣本量很大的時候,

訓練速度不能讓人滿意。對於準確度來說,隨機梯度下降法用於僅僅用一個樣本決定梯度方向,導致解很有可能不是最優。對於收斂速度來說,

由於隨機梯度下降法一次迭代一個樣本,導致迭代方向變化很大,不能很快的收斂到局部最優解。那麼,有沒有一箇中庸的辦法能夠結合兩種方法的優點呢?有!這就是小批量梯度下降法。

3 小批量梯度下降法(Mini-batch Gradient Descent)

小批量梯度下降法是批量梯度下降法和隨機梯度下降法的折衷,也就是對於m個樣本,我們採用x個樣子來迭代。一般可以取x=10,當然根據樣本的數據,可以調整這個x的值。

預測函數(完成值到概率的轉化):

似然函數

常說的概率是指給定參數後,預測即將發生的事件的可能性。而似然概率正好與這個過程相反,我們關注的量不再是事件的發生概率,

而是已知發生了某些事件,我們希望知道參數應該是多少。我們的似然函數定義如下:

即表示我們預測的參數滿足所有樣本值這一事件的概率,接下來要做的就是極大似然估計,即令參數的取值無限擬合我們的真實數據。

我們取對數似然,此時應用梯度上升求最大值,再引入目標函數轉換爲梯度下降求最小值(加負號,除以樣本總數,考慮整體樣本),求偏導,令其等於零。目標函數如下:

求偏導的過程:

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