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

2021-09-20 10:14:01 字數 3991 閱讀 7216

個人專案:

邏輯回歸是回歸還是分類?

邏輯回歸是分類,不要被名字所欺騙。因本篇文章僅討論二分類問題,故我們將邏輯回歸最終得到的**值看作兩個,即是或否(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的值。

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

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

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

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

求偏導的過程:

機器學習 梯度下降

參照 機器學習 這本書的第4.4.3節。一.解決目標及情景假設 當給定一些資料,輸入x向量已知,輸出y也已知,設計乙個線性函式y h x 去擬合這些資料。既然是線性函式,在此不妨設為h x w0 x0 w1 x1。此時我們遇到的問題就是如何確定w0和w1這兩個引數,即w w0,w1 這個向量。既然是...

機器學習 梯度下降

梯度下降法 如果讀者對方向導數和梯度的定義不太了解,請先閱讀上篇文章 方向導數與梯度 前些時間接觸了機器學習,發現梯度下降法是機器學習裡比較基礎又比較重要的乙個求最小值的演算法。梯度下降演算法過程如下 1 隨機初始值 2 迭代 在這裡,簡單談一下自己對梯度下降法的理解。首先,要明確梯度是乙個向量,是...

機器學習 梯度下降

1.引數要同時更新 2.初始化不同,獲得的最小值也不同,即得到的引數也不同,演算法收斂到不同的區域性最優解。凸函式只有全域性最優解,無論如何初始化,不必擔心陷入區域性最優解 3.越接近最小值時,收斂的速度最逐漸減慢,在學習率不變的情況下,越接近最小值 最優解 偏導數的絕對值會越來越小,所以演算法收斂...