溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

機器學(xué)習(xí)筆記之 線性回歸技術(shù)

發(fā)布時間:2020-07-23 13:55:18 來源:網(wǎng)絡(luò) 閱讀:367 作者:nineteens 欄目:編程語言

  一、概念

  線性回歸是一種有監(jiān)督的回歸分析技術(shù),其是找出自變量與因變量之間的因果關(guān)系,本質(zhì)上是一個函數(shù)估計的問題?;貧w分析的因變量應(yīng)該是連續(xù)變量,若因變量為離散變量,則問題就轉(zhuǎn)化為分類問題?;貧w分析主要應(yīng)用場景為預(yù)測,常用的算法有如下:線性回歸、二項式回歸、嶺回歸、Lasso等。

  二、模型的表達式及推導(dǎo)

  

機器學(xué)習(xí)筆記之 線性回歸技術(shù)


  現(xiàn)有如下訓(xùn)練集:

  D={(X1,Y1),(X2,Y2),...,(Xn,Yn)}

  寫成矩陣形式:

  

機器學(xué)習(xí)筆記之 線性回歸技術(shù)


  現(xiàn)在目的是對于給定的X找出W的最優(yōu)解

  采用最小二乘法來求解:先假設(shè)這個線的方程成立,然后把樣本數(shù)據(jù)點代入假設(shè)的方程得到觀測值,求使得實際值與觀測值相減的平方和最小的參數(shù)。對變量求偏導(dǎo)聯(lián)立便可求。

  因此我們可以得到如下的損失函數(shù):

  推導(dǎo):

  目標是求的W使得損失函數(shù)的值最小,求解如下:

  

機器學(xué)習(xí)筆記之 線性回歸技術(shù)


  對W求偏導(dǎo),得出如下結(jié)果:

  

機器學(xué)習(xí)筆記之 線性回歸技術(shù)


  本文主要介紹線性回歸的一般推導(dǎo),后續(xù)會推出采用梯度下降法求上述解的過程。

  代碼實例

  本文在實現(xiàn)線性回歸的技術(shù)時,為了作為對比,采用了多種回歸算法技術(shù),如普通線性回歸,貝葉斯回歸,SVM,集成算法等,這樣對于算法的選擇有一個比較。下面來看具體代碼實現(xiàn):

  import numpy as np

  import pandas as pd

  import matplotlib.pyplot as plt #導(dǎo)入圖形展示庫

  from sklearn.linear_model import BayesianRidge,LinearRegression,ElasticNet #批量導(dǎo)入要實現(xiàn)的回歸算法

  from sklearn.svm import SVR #SVM中的回歸算法

  from sklearn.ensemble.gradient_boosting import GradientBoostingRegressor #集成算法

  from sklearn.model_selection import cross_val_score #交叉檢驗

  from sklearn.metrics import explained_variance_score,mean_absolute_error,mean_squared_error,r2_score #批量導(dǎo)入指標算法

  raw_data=np.loadtxt('D:\\data\\regression.txt')

  x=raw_data[:,:-1] #分隔自變量

  y=raw_data[:,-1] #分隔因變量

  #訓(xùn)練回歸模型無錫婦科檢查醫(yī)院 http://www.87554006.com/

  n_folds=6 #設(shè)置交叉檢驗的次數(shù)

  model_br=BayesianRidge() #建立貝葉斯嶺回歸模型對象

  model_lr=LinearRegression() #建立普通線性回歸模型對象

  model_etc=ElasticNet() #建立彈性網(wǎng)絡(luò)回歸模型

  model_svr=SVR() #建立支持向量機回歸模型

  model_gbr=GradientBoostingRegressor() #建立梯度增強回歸模型對象

  model_names=['BayesianRidge','LinearRegression','ElasticNet','SVR','GBR'] #不同模型的名稱列表

  model_dic=[model_br,model_lr,model_etc,model_svr,model_gbr] #不同模型對象名稱的列表

  cv_score_list=[] #交叉驗證結(jié)果列表

  pre_y_list=[] #各個回歸模型預(yù)測的y值列表

  for model in model_dic: #讀出每個回歸模型對象

  scores=cross_val_score(model,x,y,cv=n_folds) #將每個回歸模型導(dǎo)入交叉檢驗?zāi)P椭凶鲇?xùn)練檢驗

  cv_score_list.append(scores) #將交叉驗證結(jié)果存入到結(jié)果列表

  pre_y_list.append(model.fit(x,y).predict(x)) #將回歸訓(xùn)練中得到的預(yù)測y存入到列表

  #模型效果指標評估

  n_samples,n_features=x.shape #總樣本量,總特征數(shù)

  model_metrics_name=[explained_variance_score,mean_absolute_error,mean_squared_error,r2_score] #回歸評估指標對象集

  model_metrics_list=[] #回歸評估指標列表

  for i in range(5): #循環(huán)每個模型索引

  tmp_list=[] #每個內(nèi)循環(huán)的臨時結(jié)果列表

  for m in model_metrics_name: #循環(huán)每個指標對象

  tmp_score=m(y,pre_y_list[i]) #計算每個回歸指標結(jié)果

  tmp_list.append(tmp_score) #將結(jié)果存入每個內(nèi)循環(huán)的臨時結(jié)果列表

  model_metrics_list.append(tmp_list) #將結(jié)果存入到回歸評估指標列表

  df1=pd.DataFrame(cv_score_list,index=model_names) #建立交叉驗證的數(shù)據(jù)框

  df2=pd.DataFrame(model_metrics_list,index=model_names,columns=['ev','mae','mse','r2']) #建立回歸指標的數(shù)據(jù)框

  print ('samples:%d\t features:%d' % (n_samples,n_features)) #打印輸出樣本量和特征數(shù)量

  print (90*'-') #打印分隔線

  print ('cross validation result:') #打印輸出標題

  print (df1) #打印輸出交叉檢驗的數(shù)據(jù)框

  print (90*'-') #打印輸出分隔線

  print ('regression metrics:') #打印輸出標題

  print (df2) #打印輸出回歸指標的數(shù)據(jù)框

  print (90*'-') #打印輸出分隔線

  print ('short name \t full name') #打印輸出縮寫和全名標題

  print ('ev \t explained_variance')

  print ('mae \t mean_absolute_error')

  print ('mse \t mean_squared_error')

  print ('r2 \t r2')

  print (90*'-') #打印輸出分隔線

  運行結(jié)果

  ------------------------------------------------------------------------------------------

  指標解釋:

  從上圖中可以看出:增強梯度(GBR)回歸效果是所有模型中回歸效果最好的,從回歸矩陣(regression metrics)中看出其方差解釋ev達到了0.975,并且其平均絕對誤差和均方差都是最低的,分別為1.152、2.100。從交叉驗證的結(jié)果可以看出,GBR在交叉驗證的6次驗證中,其結(jié)果的穩(wěn)定性相對較高,這證明該算法在應(yīng)對不同的數(shù)據(jù)時穩(wěn)定效果較好。

  模型效果的可視化

  模型擬合好以后,可以將幾種回歸效果借助matplotlib進行展示。代碼如下:

  #模型效果的可視化

  plt.figure #創(chuàng)建畫布

  plt.plot(np.arange(x.shape[0]),y,color='k',label='true y') #畫出原始值得曲線

  color_list=['r','b','g','y','c'] #顏色列表

  linesytle_list=['-','.','o','v','*'] #樣式列表

  for i,pre_y in enumerate(pre_y_list):

  plt.plot(np.arange(x.shape[0]),pre_y_list[i],color_list[i],label=model_names[i]) #畫出每條預(yù)測結(jié)果線

  plt.title('regression result comparison') #標題

  plt.legend(loc='upper right') #圖例位置

  plt.ylabel('real and predicted value') #y軸標題

  plt.show() #展示圖像


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI