1、基本概念
要進(jìn)行機(jī)器學(xué)習(xí),首先要有數(shù)據(jù)。從數(shù)據(jù)中學(xué)得模型的過程稱為“學(xué)習(xí)”或“訓(xùn)練”。其對應(yīng)的過程中有幾個(gè)基本術(shù)語需要知道。
(1)訓(xùn)練集:模型訓(xùn)練過程中使用的數(shù)據(jù)稱為訓(xùn)練集,其中每個(gè)樣本稱為訓(xùn)練樣本。如:D={X1,X2,X3,…,Xm}。
(2)特征向量:對于每個(gè)樣本如Xi = (xi1, xi2,…xin)是一個(gè)n維列向量,表示樣本Xi有n個(gè)屬性。
2、理論
給定由n個(gè)屬性描述而成的m個(gè)數(shù)據(jù)集為:D={X1,X2,X3,…,Xm},其中Xi = (xi1, xi2,…xin)。
線性模型是試圖學(xué)得一個(gè)通過屬性的線性組合來進(jìn)行預(yù)測的函數(shù),即:
其中,其中。當(dāng)Θ和b確定之后,模型就得以確認(rèn)。
2.1 線性回歸
2.1.1 什么是回歸
若我們欲預(yù)測的是連續(xù)值,如:房價(jià),則此類學(xué)習(xí)任務(wù)稱為“回歸”。同理機(jī)器學(xué)習(xí)中還有“分類”任務(wù),即我們欲預(yù)測的是離散值,如:“合格”、“不合格”。其中對于二分類任務(wù),稱為“正類”、“負(fù)類”;涉及多個(gè)類別時(shí),則稱為“多分類”任務(wù)。
在線性模型中,我們分為線性回歸與邏輯回歸兩種模型,下面我們對兩種模型分別進(jìn)行講解分析。
圖1 線性回歸
圖2 邏輯回歸
2.1.2 線性回歸推導(dǎo)
1、線性回歸試圖學(xué)得:
2、參數(shù)估計(jì)
(1)首先衡量f(X)與Y之間的差別,我們使用均方誤差來衡量。
均方誤差的推導(dǎo)過程如下:
擬合函數(shù)為:
矩陣形式為:
真實(shí)值和預(yù)測值之間通常情況下是會存在誤差的,我們用ε來表示誤差,對于每個(gè)樣本都有:
通常我們假設(shè)樣本空間中全體樣本中服從一個(gè)未知“分布”,我們獲得的每個(gè)樣本都是獨(dú)立地從這個(gè)分布上采樣獲得的,即“獨(dú)立同分布”(iid)。
在這里誤差ε是獨(dú)立并且具有相同的分布,并且服從均值為0,方差為的正態(tài)分布。
由于誤差服從正態(tài)分布,那么有:
將(5)代入到(6)可得:
用似然函數(shù)進(jìn)行估計(jì),即求出什么樣的參數(shù)跟我們給出的數(shù)據(jù)組合后能更好的預(yù)測真實(shí)值,有:
對式8取對數(shù),將連乘轉(zhuǎn)化為加法為:
對式9展開化簡為:
由上式可以看出,右邊第一項(xiàng)為一個(gè)常量,似然函數(shù)要取最大值,因而第二項(xiàng)越小越好,有:
上述公式相當(dāng)于最小二乘法的式子,即為均方誤差的式子。
(2)求解Θ:閉式解。
我們試圖讓均方誤差最小化,即
基于均方誤差最小化來進(jìn)行模型求解的方法稱為“最小二乘法”。在線性回歸中,最小二乘法就是試圖找到一條直線,使所有樣本到直線上的歐式距離之和最小。求解方法為對Θ求偏導(dǎo)。
接下來需要對矩陣求偏導(dǎo),過程如下:
最后令可得:
s.t.為滿秩矩陣時(shí)。
在現(xiàn)實(shí)中往往不是滿秩矩陣,在許多變量中會遇到大量的變量,其數(shù)目超過樣本數(shù)目,會導(dǎo)致解出多個(gè)Θ,常見的做法是引入正則化或者進(jìn)行降維。
(3)求解Θ:梯度下降法。
沿著函數(shù)梯度方向下降最快的就能找到極小值:
沿著梯度方向更新參數(shù)Θ的值:
批量梯度下降是用了訓(xùn)練集中的所有樣本。因此在數(shù)據(jù)量很大的時(shí)候,每次迭代都要遍歷訓(xùn)練集一遍,開銷會很大,所以在數(shù)據(jù)量大的時(shí)候,可以采用隨機(jī)梯度下降法或者批量梯度下降法。
2.2 邏輯回歸
對于分類任務(wù),用線性回歸無法直接進(jìn)行回歸學(xué)習(xí)。對于二分類任務(wù),其輸出標(biāo)記,而線性回歸模型產(chǎn)生的預(yù)測值是實(shí)值。
2.2.1 對數(shù)幾率
一個(gè)事件的幾率是指該事件發(fā)生的概率與該事件不發(fā)生的概率的比值。p(Y=1|X)是指事件發(fā)生的條件概率,p(Y=0|X)是指事件不發(fā)生的條件概率,則該事件的對數(shù)幾率或logit函數(shù)是:
對數(shù)幾率范圍為[0,+∞),當(dāng)p=1時(shí)候,logit(p)=+∞,當(dāng)p=0時(shí)候,logit(p)=0。
對于邏輯回歸而言,有:
將其Θ*X轉(zhuǎn)換為概率有:
其中
也稱為sigmoid函數(shù),函數(shù)圖如下所示:
圖3 Sigmoid函數(shù)圖
2.2.2 參數(shù)估計(jì)
在邏輯回歸進(jìn)行模型學(xué)習(xí)時(shí),應(yīng)用極大似然估計(jì)來估計(jì)模型參數(shù):
對式22取對數(shù),將連乘轉(zhuǎn)化為加法為:
上述公式為求解邏輯回歸的損失函數(shù):交叉熵?fù)p失函數(shù)。
然后對J(Θ)進(jìn)行求偏導(dǎo),求最小值,得到Θ的估計(jì)值。沿著函數(shù)梯度方向下降就能最快的找到極小值:
沿著梯度方向更新參數(shù)Θ的值:
3、實(shí)戰(zhàn)
3.1 線性回歸實(shí)戰(zhàn)
3.1.1 從零開始實(shí)現(xiàn)
1、首先生成數(shù)據(jù)集
num_inputs = 2 # 數(shù)據(jù)集的屬性 n : 2num_examples = 1000 # 數(shù)據(jù)集的樹木 m : 1000true_w = [2, -3.4]true_b = 4.2 features = torch.randn(num_examples, num_inputs, dtype=torch.float32) # 輸入labels = true_w[0]*features[:, 0] + true_w[1]*features[:, 1] + true_b # 標(biāo)簽labels+=torch.tensor(np.random.normal(0,0.01,size=labels.size()),dtype=torch.float32)#加上一些隨機(jī)噪聲
進(jìn)行可視化后,如下圖所示:
圖4 數(shù)據(jù)集
2、數(shù)據(jù)讀取
def data_iter(batch_size, features, labels): num_examples = len(features) indices = list(range(num_examples)) random.shuffle(indices) for i in range(0, num_examples, batch_size): j = torch.LongTensor(indices[i : min(i + batch_size, num_examples)])yieldfeatures.index_select(0,j),labels.index_select(0,j)
如:當(dāng)batch_size=10時(shí),我們的輸出結(jié)果如下所示:
第一個(gè)為輸入x(size=[10, 2]),第二個(gè)為標(biāo)簽y(size=[10])。
3、定義線性回歸模型
def LinReg(X, w, b):returntorch.mm(X,w)+b#torch.mm表示兩個(gè)矩陣相乘,[batch_size,num_inputs]*[num_inputs,1]=[batch_size,1]
4、定義損失函數(shù)
# 線性回歸模型的損失函數(shù)為均方差損失函數(shù)def squared_loss(y_hat, y):return(y_hat-y.view(y_hat.size()))**2/2
5、定義優(yōu)化算法
# 這里我們使用梯度下降算法:sdgdef sgd(params, lr, batch_size): for param in params:param.data-=lr*param.grad/batch_size
6、進(jìn)行訓(xùn)練
訓(xùn)練步驟如下:
(1)首先讀取一個(gè)batch_size的數(shù)據(jù)和標(biāo)簽
(2)然后進(jìn)行模型計(jì)算;
(3)然后計(jì)算損失函數(shù);
(4)然后反向求導(dǎo)優(yōu)化參數(shù);
lr = 0.03num_epochs = 3net = LinRegloss = squared_loss for epoch in range(num_epochs): # 訓(xùn)練模型一共需要num_epochs個(gè)迭代周期 # 在每一個(gè)迭代周期中,會使用訓(xùn)練數(shù)據(jù)集中所有樣本一次(假設(shè)樣本數(shù)能夠被批量大小整除)。X # 和y分別是小批量樣本的特征和標(biāo)簽 for X, y in data_iter(batch_size, features, labels): l = loss(net(X, w, b), y).sum() # l是有關(guān)小批量X和y的損失 l.backward() # 小批量的損失對模型參數(shù)求梯度 sgd([w, b], lr, batch_size) # 使用小批量隨機(jī)梯度下降迭代模型參數(shù) # 不要忘了梯度清零 w.grad.data.zero_() b.grad.data.zero_() train_l = loss(net(features, w, b), labels)print('epoch%d,loss%f'%(epoch+1,train_l.mean().item()))
最后輸出結(jié)果如下所示:
epoch 1, loss 0.044750epoch 2, loss 0.000172epoch3,loss0.000049
3.2 邏輯回歸實(shí)戰(zhàn)
邏輯回歸相比線性回歸中,改變的地方為第3步:模型函數(shù) 和 第4步:損失函數(shù)。
3.2.1 從零實(shí)現(xiàn)邏輯回歸
3、定義邏輯回歸模型
def sigmoid(X, w, b): ''' 定義sigmoid函數(shù) :param x: 參數(shù)x 返回計(jì)算后的值 ''' z = torch.mm(X, w) + breturn1.0/(1+np.exp(-z))
4、定義損失函數(shù)
# 在邏輯回歸中,我們使用的是對數(shù)損失函數(shù)(交叉熵?fù)p失函數(shù))def BCE_loss(y_hat, y): ''' 損失函數(shù) :param y_hat: 預(yù)測值 :param y: 實(shí)際值 loss ''' m = np.shape(y_hat)[0] loss = 0.0 for i in range(m): if y_hat[i, 0] > 0 and (1 - y_hat[i, 0]) > 0: loss-= (y[i, 0] * np.log(y_hat[i, 0]) + (1 - y[i, 0]) * np.log(1 - y_hat[i, 0])) else: loss-= 0.0returnloss/m
責(zé)任編輯:xj
原文標(biāo)題:【機(jī)器學(xué)習(xí)】線性回歸與邏輯回歸的理論與實(shí)戰(zhàn)
文章出處:【微信公眾號:深度學(xué)習(xí)自然語言處理】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8353瀏覽量
132315 -
線性回歸
+關(guān)注
關(guān)注
0文章
41瀏覽量
4292
原文標(biāo)題:【機(jī)器學(xué)習(xí)】線性回歸與邏輯回歸的理論與實(shí)戰(zhàn)
文章出處:【微信號:zenRRan,微信公眾號:深度學(xué)習(xí)自然語言處理】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論