【導讀】本文是一篇專門介紹線性回歸的技術文章,討論了機器學習中線性回歸的技術細節。線性回歸核心思想是獲得最能夠擬合數據的直線。文中將線性回歸的兩種類型:一元線性回歸和多元線性回歸,本文主要介紹了一元線性回歸的技術細節:誤差最小化、標準方程係數、使用梯度下降進行優化、殘差分析、模型評估等。在文末給出了相關的GitHub地址。
Linear Regression — Detailed View
詳細解釋線性回歸
線性回歸用於發現目標與一個或多個預測變量之間的線性關係。 有兩種類型的線性回歸 – 一元線性回歸(Simple)和多元線性回歸(Multiple)。
一元線性回歸
一元線性回歸對於尋找兩個連續變量之間的關係很有用。一個是預測變量或自變量,另一個是響應或因變量。它尋找統計關係而不是確定性關係。如果一個變量可以被另一個變量精確地表達,那麼兩個變量之間的關係被認為是確定性的。例如,使用攝氏度的溫度,可以準確地預測華氏溫度。統計關係在確定兩個變量之間的關係時並不準確,例如,身高和體重之間的關係。
線性回歸核心思想是獲得最能夠擬合數據的直線。擬合度最高的直線是總預測誤差(所有數據點)儘可能小的直線。誤差是用在原始點以及預測點之間的距離來衡量。
完整代碼:
https://github.com/SSaishruthi/Linear_Regression_Detailed_Implementation
▌實例
我們有一個數據集,其中包含有關「學習小時數」與「獲得的分數」之間關係的信息。已經觀察到許多學生,並記錄他們的學習時間和成績。這將是我們的訓練數據。目標是設計一個模型,給定學習時間,可以預測成績。使用訓練數據,獲得將會給出最小誤差的回歸線。然後這個線性方程可以用於任何新的數據。也就是說,如果我們將學習時間作為輸入,我們的模型應該以最小誤差預測它們的分數。
Y(pred)= alpha + beta * x
為了使誤差最小化,必須確定alpha和beta。如果平方誤差和被用作評估模型的度量,目標是獲得最小化這個誤差的直線。
如果我們不對這個錯誤進行平方,那么正面和負面的樣本誤差就會相互抵消。
為了估計模型的參數alpha和beta,我們已知一組樣本(yi, xi)(其中i=1,2,…,n),其計算的目標為最小化殘差平方和:
使用微分法求極值:將上式分別對alpha 和 beta 做一階偏微分,並令其等於0:
此二元一次線性方程組可用克萊姆法則求解,得解和:
探索:
• 如果> 0,則x(預測變量)和y(目標)具有正相關關係,y隨x的增加而增加。
• 如果 <0,則x(自變量)和y(目標)具有負相關關係,y隨x的增加而減少。
探索:
• 如果沒有這個項,那麼擬合線將超過原點。 回歸係數和預測都會有偏差。偏置補償了目標值y的平均值(在訓練集)與自變量x平均值和的乘積之間的偏差。
標準方程係數(Co-efficient from Normal equations)
除了上述方程外,模型的係數也可以用標準方程計算。
Theta包含所有預測因子的係數,包括常數項。 標準方程通過對輸入矩陣取逆來執行計算。 隨著函數數量的增加,計算的複雜性將會增加。 當樣本特徵維數變大時,求逆會比較耗時。
下面是方程的python實現。
def theta_calc(x_train, y_train):
#Initializing all variables
n_data = x_train.shape[0]
bias = np.ones((n_data,1))
x_train_b = np.append(bias, x_train, axis=1)
#
theta_1 = np.linalg.inv(np.dot(x_train_b.T,x_train_b))
theta_2 = np.dot(theta_1, x_train_b.T)
theta = np.dot(theta_2,y_train)
#
return theta
使用梯度下降進行優化
標準方程的複雜性使其難以使用,可以使用梯度下降進行優化。 對損失函數求偏導數,並給出參數的最優係數值。
梯度下降的Python代碼
#gradient descent
def grad_descent(s_slope, s_intercept, l_rate, iter_val, x_train, y_train):
for i in range(iter_val):
int_slope = 0
int_intercept = 0
n_pt = float(len(x_train))
for i in range(len(x_train)):
int_intercept = - (2/n_pt) * (y_train[i] - ((s_slope * x_train[i]) +
s_intercept))
int_slope = - (2/n_pt) * x_train[i] * (y_train[i] - ((s_slope * x_train[i]) +
s_intercept))
final_slope = s_slope - (l_rate * int_slope)
final_intercept = s_intercept - (l_rate * int_intercept)
s_slope = final_slope
s_intercept = final_intercept
return s_slope, s_intercept
殘差分析
隨機性和不可預測性是回歸模型的兩個主要組成部分。
預測=確定性+統計(Prediction = Deterministic + Statistic)
確定性部分由模型中的預測變量覆蓋。隨機部分揭示了預期和觀測值不可預測的事實。總會有一些信息被忽略。這些信息可以從殘差信息中獲得。
我們通過一個例子來解釋殘差的概念。考慮一下,我們有一個數據集,可以預測給定當天氣溫,其果汁的銷售量。從回歸方程預測的值總會與實際值有一些差異。銷售額與實際產出值不完全匹配。這種差異稱為residue。
殘差示意圖有助於使用殘差值分析模型。它在預測值和residue之間進行繪製。它們的值是標準化的,該點與0的距離指定了該值的預測有多糟糕。如果該值為正值,則預測值較低。如果該值是負值,那麼預測值很高。 0值表示完美的預測。檢測殘差模式可以改善模型。
殘差的特徵
• 殘差不代表任何模式
• 相鄰的殘差不應該是相同的,因為它們表明系統漏掉了一些信息。
殘差示意圖的實現和細節
#Residual plot
plt.scatter(prediction, prediction - y_test, c='g', s = 40)
plt.hlines(y=0, xmin=0, xmax=100)
plt.title('Residual plot')
plt.ylabel('Residual')
模型評估
該值的範圍從0到1。值「1」表示預測變量完全考慮了Y中的所有變化。值「0」表示預測變量「x」在「y」中沒有變化。
總平方和SST (sum of squares for total) 是:
其中
2,回歸平方和SSR (sum of squares for regression)
3,殘差平方和SSE (sum of squares for error) 是:
4,總平方和SST又可寫做SSReg和SSE的和:
Python 實現
def rsq(prediction, y_test):
#
total_data = len(prediction)
#Average of total prediction
y_avg = np.sum(y_test)/total_data
#total sum of square error
tot_err = np.sum((y_test-y_avg)**2)
#total sum of squared error of residuals
res_err = np.sum((y_test-prediction)**2)
#
r2 = 1 - (res_err / tot_err)
return r2
#defining slope and intercept value as 0
learning_rate = 0.001
start_slope = 0
start_intercept = 0
iteration = 102
#intial run
grad_slope, grad_intercept = grad_descent(start_slope, start_intercept, learning_rate,
iteration, x_train, y_train)
final_e_value, prediction = mse_calc(grad_slope, grad_intercept, x_test, y_test)
#
print('Slope of the model', grad_slope)
print('Intercept of the model', grad_intercept)
print('Error value of the model', final_e_value)
r2_val = rsq(prediction, y_test)
print('R squared value', r2_val)
#Graph
plt.scatter(x_test, y_test)
plt.plot(x_test, prediction, color='blue', linewidth = 3)
plt.xlabel("Input")
plt.ylabel("Output")
plt.show()
獲得回歸線:
完整代碼:
https://github.com/SSaishruthi/Linear_Regression_Detailed_Implementation
參考連結:https://towardsdatascience.com/linear-regression-detailed-view-ea73175f6e86
人工智慧領域主題知識資料查看獲取:【專知薈萃】人工智慧領域26個主題知識資料全集(入門/進階/論文/綜述/視頻/專家等)
同時歡迎各位用戶進行專知投稿,詳情請點擊:
【誠邀】專知誠摯邀請各位專業者加入AI創作者計劃!了解使用專知!
請PC登錄www.zhuanzhi.ai或者點擊閱讀原文,註冊登錄專知,獲取更多AI知識資料!
請掃一掃如下二維碼關注我們的公眾號,獲取人工智慧的專業知識!
請加專知小助手微信(Rancho_Fang),加入專知主題人工智慧群交流!