全面講解手推實戰之線性回歸

2021-10-07 20:09:09 字數 3275 閱讀 1273

這個主題是講解機器學習,會全面的講解理論,知識乾貨。

學了理論不會實踐怎麼辦?調了包不懂實現?

每個演算法都會配備實踐,手推和簡單實現,讓你知其然,還要知其所以然。

當然參考很多大佬的書,不舉例了,相信大家都知道。我可能不能完全的去講每乙個概念,一是我不想滿屏都是補充概念避免給剛學習的人第一反應知識體系太大,可以學到什麼補什麼;二也是篇幅限制或者疏忽。部分簡單的不贅述了,只是乙個簡單概念,比如回歸是什麼,回歸用於**輸入變數和輸出變數之間的關係,等價於函式擬合,如房價的**,電影票房預估等。

本人水平有限,錯誤之處敬請擔待。

理論知識

線性回歸是最簡單的機器學習,但是可以由它入門理解機器學習。

**函式:

向量形式:

所以只看這個形式,線性回歸模型簡單,可解釋性強,w表達了每個特徵的權重。

如何求解這個w呢,採用常用的均方誤差損失函式。

求解最優化w可以通過最小二乘法獲得解析解,推導後若

但是現實情況常為不滿秩,比如極端下樣本數量小於特徵數量,或者特徵之間線性相關,而且資料本身也有噪音,解析解意義不大。當特徵數量特別大的時候,受限於求逆的複雜度,計算非常緩慢,後面會介紹梯度下降演算法。

不滿秩則存在多個解,都能使誤差最小,如何選擇呢?常見的做法是引入正則化項。l1正則也叫lasso回歸,表示式為

l2正則也叫ridge回歸,表示式為

一般機器學習演算法求解引數不會有解析解,常使用最簡單通用的迭代計算方法梯度下降演算法,這個基礎知識不具體講了,包括學習率、初始位置的重要性,從比較慢的原始批量梯度下降到小批量梯度下降、隨機梯度下降其優缺點,以及使用梯度下降演算法之前,為了加快收斂資料需要進行標準化,可以自行理解下。

手推實戰

這裡展示核心部分**,讀取資料、評價視覺化部分不展示了

def

j_coss

(x, y, theta)

: m =

len(y)

j = np.dot(

(x*theta - y)

.t,(x*theta - y))/

(2*m)return j

def

gradientdescent

(x, y, theta, alpha, num_iters)

: m =

len(y)

# 樣本數量

j_history = np.zeros(

(num_iters,1)

)# 儲存每次迭代的損失

for i in

range

(num_iters)

:# 遍歷迭代次數

theta = theta -

((alpha / m)

*(np.dot(x.t, np.dot(x, theta)

- y)))

# 批量梯度的計算

j_history = j_coss(x, y, theta)

# 呼叫計算代價函式

return theta, j_history

def

standard_scaler

(x):

x = np.array(x)

mean_x = np.mean(x,0)

# 求每一列的平均值(0指定為列,1代表行)

std_x = np.std(x,0)

# 求每一列的標準差

for i in

range

(x.shape[1]

):# 遍歷列

x[:, i]

=(x[

:, i]

- mean_x[i]

)/ std_x[i]

# 標準化

return x

輸入資料後把整個流程串起來,接下去可以往表示式加l1、l2正則化項,不展示了。

from sklearn.linear_model.

from sklearn.preprocessing import standardscaler # 標準化

from sklearn.preprocessing import minmaxscaler # 歸一化

# 歸一化操作

scaler = standardscaler(

)scaler = minmaxscaler(

)scaler.fit(x_train)

x_train = scaler.transform(x_train)

x_test = scaler.transform(x_test)

# 線性模型擬合

lr_reg = linearregression(

)lr_reg.fit(x_train, y)

print

(lr_reg.coef_)

# coefficient of the features 特徵係數

print

(lr_reg.intercept_)

# 又名bias偏置

# **結果

result = lr_reg.predict(x_test)

帶正則化項的sklearn包可以這樣匯入

from sklearn.linear_model import ridge

from sklearn.linear_model import lasso

from sklearn.linear_model import elasticnet

使用非常相似,可以仔細看看官網詳細說明哦。

正則化是為了控制引數搜尋空間,防止過擬合。

對於線性回歸如何選取正則化有乙個總結:

只要資料線性相關,線性回歸擬合的不是很好,可以考慮使用嶺回歸(l2)。如果輸入特徵的維度很高,而且是稀疏線性關係的話,考慮使用lasso回歸。

l1正則化(lasso回歸)可以使得一些特徵的係數變小,甚至可以使一些絕對值較小的係數直接變為0,從而增強模型的泛化能力,要在一堆特徵裡面找出主要的特徵是首選。

在我們發現用lasso回歸太過(太多特徵被稀疏為0),而嶺回歸也正則化的不夠(回歸係數衰減太慢)的時候,可以考慮使用elasticnet回歸來綜合得到比較好的結果

機器學習實戰之線性回歸

之前我們學習的機器學習演算法都是屬於分類演算法,也就是 值是離散值。當 值為連續值時,就需要使用回歸演算法。本文將介紹線性回歸的原理和 實現。如圖所示,這時一組二維的資料,我們先想想如何通過一條直線較好的擬合這些散點了?直白的說 盡量讓擬合的直線穿過這些散點 這些點離擬合直線很近 目標函式 要使這些...

機器學習實戰之線性回歸

線性回歸原理與推導 如圖所示,這時一組二維的資料,我們先想想如何通過一條直線較好的擬合這些散點了?直白的說 盡量讓擬合的直線穿過這些散點 這些點離擬合直線很近 目標函式 要使這些點離擬合直線很近,我們需要用數學公式來表示。首先,我們要求的直線公式為 y xtw。我們這裡要求的就是這個w向量 類似於l...

深度學習實戰之線性回歸1

我理解的線性回歸就是,比較簡單的一維的線性回歸,所要求解的方程就是 你要做的就是不斷的學習資料集,不斷的更新w和b,讓損失函式越小越好。損失函式便是你程式求得的結果和標準結果之間的誤差,損失函式具體公式如下 w值梯度下降公式 w w 學習速率 斜率 b值梯度下降公式 b b 學習速率 斜率 繪製的資...