国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

機(jī)器學(xué)習(xí)10—多元線性回歸模型

這篇具有很好參考價(jià)值的文章主要介紹了機(jī)器學(xué)習(xí)10—多元線性回歸模型。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。


前言

什么是多元線性回歸分析預(yù)測(cè)法

在市場(chǎng)的經(jīng)濟(jì)活動(dòng)中,經(jīng)常會(huì)遇到某一市場(chǎng)現(xiàn)象的發(fā)展和變化取決于幾個(gè)影響因素的情況,也就是一個(gè)因變量和幾個(gè)自變量有依存關(guān)系的情況。而且有時(shí)幾個(gè)影響因素主次難以區(qū)分,或者有的因素雖屬次要,但也不能略去其作用。例如,某一商品的銷售量既與人口的增長變化有關(guān),也與商品價(jià)格變化有關(guān)。這時(shí)采用一元回歸分析預(yù)測(cè)法進(jìn)行預(yù)測(cè)是難以奏效的,需要采用多元回歸分析預(yù)測(cè)法。

多元回歸分析預(yù)測(cè)法,是指通過對(duì)兩個(gè)或兩個(gè)以上的自變量與一個(gè)因變量的相關(guān)分析,建立預(yù)測(cè)模型進(jìn)行預(yù)測(cè)的方法。當(dāng)自變量與因變量之間存在線性關(guān)系時(shí),稱為多元線性回歸分析。


一、多元線性回歸

一元線性回歸是一個(gè)主要影響因素作為自變量來解釋因變量的變化,但是在現(xiàn)實(shí)問題研究中,因變量的變化往往受幾個(gè)重要因素的影響,此時(shí)就需要用兩個(gè)或兩個(gè)以上的影響因素作為自變量來解釋因變量的變化,這就是多元回歸亦稱多重回歸。當(dāng)多個(gè)自變量與因變量之間是線性關(guān)系時(shí),所進(jìn)行的回歸分析就是多元線性回歸。

設(shè)y為因變量, 機(jī)器學(xué)習(xí)10—多元線性回歸模型為自變量,并且自變量與因變量之間為線性關(guān)系時(shí),則多元線性回歸模型為:
機(jī)器學(xué)習(xí)10—多元線性回歸模型
其中,b0為常數(shù)項(xiàng),機(jī)器學(xué)習(xí)10—多元線性回歸模型回歸系數(shù),b1為 機(jī)器學(xué)習(xí)10—多元線性回歸模型 固定時(shí),x1 每增加一個(gè)單位對(duì) y 的效應(yīng),即 x1 對(duì) y 的偏回歸系數(shù);同理 b2 為 x1, xk 固定時(shí),x2每增加一個(gè)單位對(duì)y的效應(yīng),故有 x2 對(duì) y 的偏回歸系數(shù)。如果兩個(gè)自變量 x1,x2 同一個(gè)因變量y呈線性相關(guān)時(shí),可用二元線性回歸模型描述為:
機(jī)器學(xué)習(xí)10—多元線性回歸模型
在建立多元性回歸模型時(shí),為了保證回歸模型具有優(yōu)秀的解釋能力和預(yù)測(cè)效果,應(yīng)首先注意自變量的選擇,其準(zhǔn)則是:

  • (1)自變量對(duì)因變量必須有顯著的影響,并呈密切的線性相關(guān)

  • (2)自變量與因變量之間的線性相關(guān)必須是真實(shí)的,而不是形式上的;

  • (3)自變量之間具有一定的互斥性,即自變量之間的相關(guān)程度不能高于自變量與因變量之間的相關(guān)程度;

  • (4)自變量應(yīng)具有完整的統(tǒng)計(jì)數(shù)據(jù),其預(yù)測(cè)值容易確定

多元性回歸模型的參數(shù)估計(jì),同一元線性回歸方程一樣,也是在要求誤差平方和機(jī)器學(xué)習(xí)10—多元線性回歸模型為最小的前提下,用最小二乘法求解參數(shù)。
用二元線性回歸模型來求解回歸參數(shù)的標(biāo)準(zhǔn)參數(shù)方程組為:
機(jī)器學(xué)習(xí)10—多元線性回歸模型

二、多元線性回歸模型求解

多元線性回歸模型的主要作用:(主要用于預(yù)測(cè))通過建模來擬合我們所提供的或是收集到的這些因變量和自變量的數(shù)據(jù),收集到的數(shù)據(jù)擬合之后來進(jìn)行參數(shù)估計(jì)。參數(shù)估計(jì)的目的主要是來估計(jì)出模型的偏回歸系數(shù)的值。估計(jì)出來之后就可以再去收集新的自變量的數(shù)據(jù)去進(jìn)行預(yù)測(cè),也稱為樣本量。

多元線性回歸模型:
機(jī)器學(xué)習(xí)10—多元線性回歸模型
回歸模型算法實(shí)現(xiàn):

import pandas as pd
import numpy as np
import statsmodels.api as sm# 實(shí)現(xiàn)了類似于二元中的統(tǒng)計(jì)模型,比如ols普通最小二乘法
import statsmodels.stats.api as sms#實(shí)現(xiàn)了統(tǒng)計(jì)工具,比如t檢驗(yàn)、F檢驗(yàn)...
import statsmodels.formula.api as smf
import scipy

np.random.seed(991)# 隨機(jī)數(shù)種子

# np.random.normal(loc=0.0, scale=1.0, size=None)
# loc:float  此概率分布的均值(對(duì)應(yīng)著整個(gè)分布的中心),loc=0說明這一個(gè)以Y軸為對(duì)稱軸的正態(tài)分布,
# scale:float 此概率分布的標(biāo)準(zhǔn)差(對(duì)應(yīng)于分布的寬度,scale越大越矮胖,scale越小,越瘦高)
# size:int or tuple of ints  輸出的shape,默認(rèn)為None,只輸出一個(gè)值
# 數(shù)據(jù)生成
x1 = np.random.normal(0,0.4,100)# 生成符合正態(tài)分布的隨機(jī)數(shù)(均值為0,標(biāo)準(zhǔn)差0.4,所生成隨機(jī)數(shù)的個(gè)數(shù)為100)
x2 = np.random.normal(0,0.6,100)
x3 = np.random.normal(0,0.2,100)
eps = np.random.normal(0,0.05,100)# 生成噪聲數(shù)據(jù),保證后面模擬所生成的因變量的數(shù)據(jù)比較接近實(shí)際的環(huán)境

X = np.c_[x1,x2,x3]# 調(diào)用c_函數(shù)來生成自變量的數(shù)據(jù)的矩陣,按照列進(jìn)行生成的;100×3的矩陣
beta = [0.1,0.2,0.7]# 生成模擬數(shù)據(jù)時(shí)候的系數(shù)的值
y = np.dot(X,beta) + eps# 點(diǎn)積+噪聲(dot是表示乘)
X_model = sm.add_constant(X)# add_constant給矩陣加上一列常量1,便于估計(jì)多元線性回歸模型的截距,也是便于后面進(jìn)行參數(shù)估計(jì)時(shí)的計(jì)算
model = sm.OLS(y,X_model)# 調(diào)用OLS普通最小二乘法來求解
# 下面是進(jìn)行參數(shù)估計(jì),參數(shù)估計(jì)的主要目的是估計(jì)出回歸系數(shù),根據(jù)參數(shù)估計(jì)結(jié)果來計(jì)算統(tǒng)計(jì)量,
# 這些統(tǒng)計(jì)量主要的目的就是對(duì)我們模型的有效性或是顯著性水平來進(jìn)行驗(yàn)證。
results = model.fit()# fit擬合
results.summary()# summary方法主要是為了顯示擬合的結(jié)果

OLS 回歸結(jié)果:
機(jī)器學(xué)習(xí)10—多元線性回歸模型

2.1最小二乘法實(shí)現(xiàn)參數(shù)估計(jì)—估計(jì)自變量X的系數(shù)

回歸系數(shù)的計(jì)算:X轉(zhuǎn)置(T)乘以X,對(duì)點(diǎn)積求逆后,再點(diǎn)乘X轉(zhuǎn)置,最后點(diǎn)乘y 。

beta_hat = np.dot(np.dot(np.linalg.inv(np.dot(X_model.T,X_model)),X_model.T),y)# 回歸系數(shù)
print('回歸系數(shù):',np.round(beta_hat,4))# 四舍五入取小數(shù)點(diǎn)后4位
print('回歸方程:Y_hat=%0.4f+%0.4f*X1+%0.4f*X2+%0.4f*X3' % (beta_hat[0],beta_hat[1],beta_hat[2],beta_hat[3]))

輸出為:

回歸系數(shù): [-0.0097  0.0746  0.2032  0.7461]
回歸方程:Y_hat=-0.0097+0.0746*X1+0.2032*X2+0.7461*X3

代碼講解:
機(jī)器學(xué)習(xí)10—多元線性回歸模型

2.2決定系數(shù):R2 與調(diào)整后 R2

決定系數(shù)R2 主要作用是:檢驗(yàn)回歸模型的顯著性

# 因變量的回歸值=np.dot(X_model,系數(shù)向量)
y_hat = np.dot(X_model,beta_hat)# 回歸值(擬合值)的計(jì)算
y_mean = np.mean(y)          # 求因變量的平均值

sst = sum((y-y_mean)**2)     # 總平方和:即y減去y均值后差的平方和
ssr = sum((y_hat-y_mean)**2) # 回歸平方和: y回歸值減去y均值后差的平方和
sse = sum((y-y_hat)**2)      # 殘差平方和: y值減去y回歸值之差的平方和
# sse = sum(results.resid**2) # 結(jié)果和上面注釋了的式子一樣,或許有小數(shù)點(diǎn)的誤差,但基本上可忽略不計(jì)

R_squared =1 - sse/sst # R2:1減去殘差平方和除以總平方和商的差;求解方法二:R2=ssr/sst
# 按照線性回歸模型原理來說:[殘差平方和+回歸平方和=總平方和]→[R2=ssr/sst]
print('R2:',round(R_squared,3)) 
# 調(diào)整后平方和:100表示樣本數(shù)據(jù)總數(shù)(n),3表示自變量個(gè)數(shù)(p)
adjR_squared =1- (sse/(100-3-1))/(sst/(100-1)) # 1-(殘差的平方和/殘差的自由度)/(總平方和/無偏估計(jì)),式子開頭為常數(shù)-1
# 殘差的自由度也是殘差方差的無偏估計(jì)
print('調(diào)整后R2:',round(adjR_squared,3))

輸出為:

R2: 0.931
調(diào)整后R2: 0.929

說明:
機(jī)器學(xué)習(xí)10—多元線性回歸模型

2.3F檢驗(yàn)參數(shù)

F顯著性檢驗(yàn):
機(jī)器學(xué)習(xí)10—多元線性回歸模型

F = (ssr/3)/(sse/(100-3-1));
print('F統(tǒng)計(jì)量:',round(F,1))
# 累積分布函數(shù)叫cdf(),調(diào)用方法和下面殘差函數(shù)調(diào)用方法一樣;注意:cdf+sf算出來的值為1
F_p = scipy.stats.f.sf(F,3,96)# 使用F分布的殘存函數(shù)計(jì)算P值;sf是殘存函數(shù)英語單詞的縮寫;3和96分別是兩個(gè)自由度
print('F統(tǒng)計(jì)量的P值:', F_p)

輸出為:

F統(tǒng)計(jì)量: 432.6
F統(tǒng)計(jì)量的P值: 1.2862966484214766e-55

說明:

  • 若假設(shè)的檢驗(yàn)的P值越小,表示的顯著性水平就越高。也就是說拒絕原假設(shè)H0,接受備選假設(shè)H1。

2.4對(duì)數(shù)似然、AIC與BIC

# 對(duì)數(shù)似然值計(jì)算公式: L=-(n/2)*ln(2*pi)-(n/2)*ln(sse/n)-n/2;sse/n就是方差
res = results.resid# 殘差(sse = sum(results.resid**2) 慘差平方和)
# 可以寫成res = y-y_hat
sigma_res = np.std(res)  # 殘差標(biāo)準(zhǔn)差
var_res = np.var(res)   # 殘差方差

L = -(100/2)*np.log(2*np.pi)-(100/2)*np.log(var_res)-100/2
print('對(duì)數(shù)似然為:', round(ll,2))# 保留兩位小數(shù)
# 赤池信息準(zhǔn)則:-2乘以對(duì)數(shù)似然比+2*(參數(shù)個(gè)數(shù)+1)。
# ?2ln(L)+2(p+1)(赤池弘次),其中p為參數(shù)個(gè)數(shù),ln(L)即L
AIC  = -2*L + 2*(3+1)
print('AIC為:',round(AIC,1))
# 貝葉斯信息準(zhǔn)則:?2ln(L)+ln(n)?(p+1),其中l(wèi)n(L)即Lr
BIC = -2*L+np.log(100)*(3+1) 
print('BIC為:',round(BIC,1))

輸出為:

對(duì)數(shù)似然為: 152.69
AIC為: -297.4
BIC為: -287.0
  • AIC和BIC越小越好。

2.5回歸系數(shù)標(biāo)準(zhǔn)差

回歸系數(shù)標(biāo)準(zhǔn)差為:
機(jī)器學(xué)習(xí)10—多元線性回歸模型

from  scipy.stats import t,f

C = np.linalg.inv(np.dot(X_model.T,X_model))# X倒置點(diǎn)乘X,然后對(duì)點(diǎn)集求逆
C_diag = np.diag(C)# 取出C矩陣對(duì)角線的值
sigma_unb= (sse/(100-3-1))**(1/2)# 殘差標(biāo)準(zhǔn)差的無偏估計(jì):殘差平方和/(樣本數(shù)減參數(shù)個(gè)數(shù)減1)
'''
回歸系數(shù)標(biāo)準(zhǔn)差std err的計(jì)算:
計(jì)算方式:殘差標(biāo)準(zhǔn)差(無偏估計(jì))乘以(C矩陣對(duì)角線上對(duì)應(yīng)值的平方根)
'''
# 標(biāo)準(zhǔn)差
stdderr_const = sigma_unb*(C_diag[0]**(1/2))# 常數(shù)項(xiàng)(截距)的標(biāo)準(zhǔn)差,對(duì)應(yīng)C_diag[0]
print('常數(shù)項(xiàng)(截距)的標(biāo)準(zhǔn)差:',round(stdderr_const,3))
stderr_x1 = sigma_unb*(C_diag[1]**(1/2))# 第一個(gè)系數(shù)對(duì)應(yīng)C_diag[1]
print('beta1的標(biāo)準(zhǔn)差:',round(stderr_x1,3))
stderr_x2 = sigma_unb*(C_diag[2]**(1/2))# 第二個(gè)系數(shù)對(duì)應(yīng)C_diag[2]
print('beta2的標(biāo)準(zhǔn)差:',round(stderr_x2,3))
stderr_x3 = sigma_unb*(C_diag[3]**(1/2))# 第三個(gè)系數(shù)對(duì)應(yīng)C_diag[3]
print('beta3的標(biāo)準(zhǔn)差:',round(stderr_x3,3))
# 矩陣
print('C矩陣:\n', C)
print('\nC矩陣的對(duì)角線元素:',C_diag)

輸出標(biāo)準(zhǔn)差為:

常數(shù)項(xiàng)(截距)的標(biāo)準(zhǔn)差: 0.005
beta1的標(biāo)準(zhǔn)差: 0.015
beta2的標(biāo)準(zhǔn)差: 0.009
beta3的標(biāo)準(zhǔn)差: 0.03

輸出矩陣為:

C矩陣:
 [[ 1.02054345e-02  1.95714789e-03 -8.54037508e-05 -6.90581790e-03]
 [ 1.95714789e-03  7.92625905e-02 -3.13550686e-03 -3.64832485e-04]
 [-8.54037508e-05 -3.13550686e-03  2.84951362e-02 -8.72645509e-03]
 [-6.90581790e-03 -3.64832485e-04 -8.72645509e-03  3.05673367e-01]]

C矩陣的對(duì)角線元素: [0.01020543 0.07926259 0.02849514 0.30567337]

2.6回歸系數(shù)的顯著性t檢驗(yàn)

回歸系數(shù)顯著性檢驗(yàn):
機(jī)器學(xué)習(xí)10—多元線性回歸模型

t_const = beta_hat[0]/stdderr_const
print('截距項(xiàng)的t值:',round(t_const,3))
p_const = 2*t.sf(t_const,96)
print("P>|t|:",round(p_const,3))
t_x1 = beta_hat[1]/stderr_x1
print('x1系數(shù)的t值:',round(t_x1,3))
p_t1 = 2*t.sf(t_x1,96)
print("P>|t|:",round(p_t1,3))
# t_x2 = beta_h

輸出為:

截距項(xiàng)的t值: -1.798
P>|t|: 1.925
x1系數(shù)的t值: 4.941
P>|t|: 0.0
  • t值足夠小就可以認(rèn)為回歸方程的系數(shù)是具有顯著性的,顯著性水平是比較高的,否則就可以認(rèn)為這個(gè)回歸系數(shù)的顯著性不高。

三、多元線性回歸問題TensorFlow實(shí)踐(波士頓房?jī)r(jià)預(yù)測(cè))

數(shù)據(jù)下載方法:

  1. 波士頓房?jī)r(jià)數(shù)據(jù)
  2. 使用從sklearn庫中導(dǎo)出數(shù)據(jù)集

首先需要用到sklearn里面的數(shù)據(jù)集以及調(diào)用pandas庫

from sklearn import datasets 
import pandas as pd 
boston = datasets.load_boston()

再用pandas庫中的DataFrame函數(shù),這個(gè)函數(shù)可以指定data,columns,index等,若不指明columns,則每列數(shù)據(jù)的標(biāo)簽會(huì)以1、2、3等標(biāo)記,這里我們每列數(shù)據(jù)的標(biāo)簽用數(shù)據(jù)集里面的。

data =pd.DataFrame(data=boston.data,columns=boston.feature_names)
print(data)

最后把數(shù)據(jù)導(dǎo)入csv文件中。

data.to_csv('./boston.csv', index=None)
  • 原數(shù)據(jù)中有14列數(shù)據(jù),由于data=pd.DataFrame(data=boston.data,columns=boston.feature_names) 這里的feature_names指的是特征的名字,也就是13個(gè)自變量,至于MEDV,你再用target即可(把boston.feature_names改成boston.target),而且運(yùn)行boston.keys() 你也可以看到關(guān)于這個(gè)數(shù)據(jù)集的介紹(包括目標(biāo)、特征、描述)

波士頓房?jī)r(jià)數(shù)據(jù):
波士頓房?jī)r(jià)數(shù)據(jù)集包括506個(gè)樣本,每個(gè)樣本包括12個(gè)特征變量和該地區(qū)的平均房?jī)r(jià)。房?jī)r(jià)(單價(jià))顯然和多個(gè)特征變量相關(guān),不是單變量線性回歸(- 元線性回歸)問題。選擇多個(gè)特征變量來建立線性方程,這就是多變量線性回歸(多 元線性回歸)問題。

字段 字段說明
CRIM 城鎮(zhèn)人均犯罪率
ZN 占地面積超過25,000平方英尺的住宅用地比例。
INDUS 每個(gè)城鎮(zhèn)非零售業(yè)務(wù)的比例。
CHAS Charles River虛擬變量(如果是河道,則為1;否則為0)
NOX 一氧化氮濃度(每千萬份)
RM 每間住宅的平均房間數(shù)
AGE 1940年以前建造的自住單位比例
DIS 加權(quán)距離波士頓的五個(gè)就業(yè)中心
RAD 徑向高速公路的可達(dá)性指數(shù)
TAX 每10,000美元的全額物業(yè)稅率
PTRATIO 城鎮(zhèn)的學(xué)生與教師比例
B 1000(Bk - 0.63)^ 2其中Bk是城鎮(zhèn)黑人的比例
LSTAT 人口狀況下降%
MEDV 自有住房的中位數(shù)報(bào)價(jià), 單位1000美元
  1. 對(duì)波士頓房?jī)r(jià)數(shù)據(jù)用pandas來處理:
# import tensorflow as tf   #導(dǎo)入Tensorflow
import tensorflow.compat.v1 as tf # 由于tensorflow對(duì)placeholder無法使用,所以引入tensorflow.compat.v1
import matplotlib.pyplot as plt
import numpy as np                            
import pandas as pd                       # 能快速讀取常規(guī)大小的文件。Pandas能提供高性能、易用的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)分析工具
from sklearn.utils import shuffle         # 隨機(jī)打亂工具,將原有序列打亂,返回一個(gè)全新的順序錯(cuò)亂的值
#讀取數(shù)據(jù)文件,結(jié)果為DataFrame格式
df_data = pd.read_csv('boston.csv')
df_data

機(jī)器學(xué)習(xí)10—多元線性回歸模型
對(duì)于下載tensorflow 可以參考這篇文章:Win10下用Anaconda安裝TensorFlow 按照里面所有步驟完成后還是用不了tensorflow 的話,就在Anaconda Prompt中啟動(dòng)tensorflow環(huán)境并進(jìn)入ipython環(huán)境中,再次下載:

# pip install tf
pip install tensorflow 

就可以使用了。

df_data.head(3)  # 顯示前3條數(shù)據(jù)

機(jī)器學(xué)習(xí)10—多元線性回歸模型

  1. 數(shù)據(jù)準(zhǔn)備(相關(guān)操作)
# 獲取數(shù)據(jù)集的值
ds=df_data.values   # d f.values以np.array形式返回?cái)?shù)據(jù)集的值
print(ds.shape)   # 查看數(shù)據(jù)的形狀
輸出為:(506, 13)
print(ds)    # 查看數(shù)據(jù)集的值

輸出為:
機(jī)器學(xué)習(xí)10—多元線性回歸模型

  1. 劃分特征數(shù)據(jù)和標(biāo)簽數(shù)據(jù)
# x_data 為歸一化前的前12列特征數(shù)據(jù)
x_data = ds[:,:12]
# y_data 為最后1列標(biāo)簽數(shù)據(jù)
y_data = ds[:,12]
print('x_data shape=',x_data.shape)
print('y_data shape=',y_data.shape)

輸出為:
機(jī)器學(xué)習(xí)10—多元線性回歸模型

  1. 特征數(shù)據(jù)歸一化
#對(duì)特征數(shù)據(jù){0到11}列 做(0-1)歸一化
for i in range(12):
    df[:,i] = (df[:,i]-df[:,i].min())/(df[:,i].max()-df[:,i].min())
df

機(jī)器學(xué)習(xí)10—多元線性回歸模型

  1. 模型定義

5.1 定義特征數(shù)據(jù)和標(biāo)簽數(shù)據(jù)的占位符

#shape中None表示行的數(shù)量未知,在實(shí)際訓(xùn)練時(shí)決定一次帶入多少行樣本,從一個(gè)樣本的隨機(jī)SDG到批量SDG都可以
x = tf.placeholder(tf.float32,[None,12],name = "X")          #12個(gè)特征數(shù)據(jù)(12列)
y = tf.placeholder(tf.float32,[None,1],name = "Y")           #1個(gè)標(biāo)簽數(shù)據(jù)(1列)

5.2 定義模型函數(shù)

#定義了一個(gè)命名空間.
#命名空間name_scope,Tensoflow計(jì)算圖模型中常有數(shù)以千計(jì)節(jié)點(diǎn),在可視化過程中很難一下子全部展示出來
# 因此可用name_scope為變量劃分范圍,在可視化中,這表示在計(jì)算圖中的一個(gè)層級(jí)
with tf.name_scope("Model"):
    
    # w 初始化值為shape=(12,1)的隨機(jī)數(shù)
    w = tf.Variable(tf.random_normal([12,1],stddev=0.01),name="W")
    
    # b 初始化值為1.0
    b = tf.Variable(1.0,name="b")
    
    # w和x是矩陣相乘,用matmul,不能用mutiply或者*
    def model(x,w,b):
        return tf.matmul(x,w) + b
    
    #預(yù)測(cè)計(jì)算操作,前向計(jì)算節(jié)點(diǎn)
    pred = model(x,w,b)  
  1. 模型訓(xùn)練

6.1 設(shè)置訓(xùn)練超參數(shù)

#迭代輪次
train_epochs = 50

#學(xué)習(xí)率
learning_rate = 0.01

6.2 定義均方差損失函數(shù)

#定義損失函數(shù)
with tf.name_scope("LossFunction"):
    loss_function = tf.reduce_mean(tf.pow(y-pred,2))    #均方誤差

6.3 創(chuàng)建優(yōu)化器

optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function)

6.4 會(huì)話

#聲明會(huì)話
sess = tf.Session()

#定義初始化變量的操作
init = tf.global_variables_initializer()

#啟動(dòng)會(huì)話
sess.run(init)

6.5 訓(xùn)練

#迭代訓(xùn)練
for epoch in range(train_epochs):
    loss_sum = 0.0
    for xs,ys in zip(x_data,y_data):
        
        xs = xs.reshape(1,12)
        ys = ys.reshape(1,1)
        #feed數(shù)據(jù)必須和Placeholder的shape一致
        _,loss = sess.run([optimizer,loss_function],feed_dict={x:xs,y:ys})
        
        loss_sum = loss_sum + loss
    #打亂數(shù)據(jù)順序,防止按原次序假性訓(xùn)練輸出
    x_data,y_data = shuffle(x_data,y_data)
    
    b0temp = b.eval(session=sess)            #訓(xùn)練中當(dāng)前變量b值
    w0temp = w.eval(session=sess)            #訓(xùn)練中當(dāng)前權(quán)重w值
    loss_average = loss_sum/len(y_data)      #當(dāng)前訓(xùn)練中的平均損失
    
    print("epoch=",epoch+1,"loss=",loss_average,"b=",b0temp,"w=",w0temp)

輸出為:

epoch= 1 loss= 28.082918898316105 b= 3.952297 w= [[ 0.51253736]
 [-0.9672818 ]
 [ 2.1312068 ]
 [-0.21723996]
 [ 1.6660578 ]
 [-1.8813397 ]
 [ 4.6080937 ]
 [ 0.3415178 ]
 [ 0.8034863 ]
 [ 1.5301441 ]
 [ 2.754847  ]
 [ 1.4393961 ]]
epoch= 2 loss= 26.376526752740993 b= 4.887504 w= [[ 1.5641255 ]
 [-1.1011099 ]
 [ 3.9318624 ]
 [-0.53754747]
 [ 3.4213843 ]
 [-4.5665426 ]
 [ 7.1060243 ]
 [ 0.17595242]
 [ 1.6169361 ]
 [ 2.7584982 ]
 [ 3.626495  ]
 [ 0.01978375]]
epoch= 3 loss= 24.173813558376537 b= 5.395661 w= [[ 2.1237833 ]
 [-0.54208773]
 [ 3.853566  ]
 [-1.1139921 ]
 [ 3.4763796 ]
 [-6.7673526 ]
 [ 7.363592  ]
 [ 0.9175515 ]
 [ 0.79786545]
 [ 2.145488  ]
 [ 3.542476  ]
 [-0.7713235 ]]
 ... ...后面還有47條數(shù)據(jù)就不展示。
  1. 模型應(yīng)用
n = np.random.randint(506)       # 隨機(jī)確定一條來看看效果
print(n)
x_test = x_data[n]

x_test = x_test.reshape(1,12)
predict = sess.run(pred,feed_dict={x:x_test})
print("預(yù)測(cè)值:%f"%predict)

target = y_data[n]
print("標(biāo)簽值:%f"%target)

輸出為:
機(jī)器學(xué)習(xí)10—多元線性回歸模型
進(jìn)一步可視化:

  1. 根據(jù)波士頓房?jī)r(jià)信息進(jìn)行預(yù)測(cè),多元線性回歸+特征數(shù)據(jù)歸一化+可視化
    添加loos_list值列表,并且輸出可視化plt.plot(loss_list)
    機(jī)器學(xué)習(xí)10—多元線性回歸模型
    輸出為:
    機(jī)器學(xué)習(xí)10—多元線性回歸模型

  2. 根據(jù)波士頓房?jī)r(jià)信息進(jìn)行預(yù)測(cè),多元線性回歸+特征數(shù)據(jù)歸一化+可視化+TensorBoard可視化
    TensorBoard可視化準(zhǔn)備數(shù)據(jù)

#設(shè)置日志存儲(chǔ)目錄
logdir='d:/log'
#創(chuàng)建一個(gè)操作,用于記錄損失值loss,后面在TensorBoard中SCALARS欄可見
sum_loss_op = tf.summary.scalar("loss",loss_function)

#把所有需要記錄摘要日志文件的合并,方便一次性寫入
merged = tf.summary.merge_all()

輸出為:
機(jī)器學(xué)習(xí)10—多元線性回歸模型


總結(jié)

對(duì)于數(shù)據(jù)集劃分還可以繼續(xù)優(yōu)化:

劃分?jǐn)?shù)據(jù)集的方法:
一種方法是將數(shù)據(jù)集分成兩個(gè)子集:

  • 訓(xùn)練集 - 用于訓(xùn)練模型的子集
  • 測(cè)試集 - 用于測(cè)試模型的子集

通常,在測(cè)試集上表現(xiàn)是否良好是衡量能否在新數(shù)據(jù)上表現(xiàn)良好的有用指標(biāo),前提是:
測(cè)試集足夠大,不會(huì)反復(fù)使用相同的測(cè)試集來作假。
拆分?jǐn)?shù)據(jù):將單個(gè)數(shù)據(jù)集拆分為一個(gè)訓(xùn)練集和一個(gè)測(cè)試集
確保測(cè)試集滿足以下兩個(gè)條件:

  • (1)規(guī)模足夠大,可產(chǎn)生具有統(tǒng)計(jì)意義的結(jié)果
  • (2)能代表整個(gè)數(shù)據(jù)集,測(cè)試集的特征應(yīng)該與訓(xùn)練集的特征相同

但是在每次迭代時(shí),都會(huì)對(duì)訓(xùn)練數(shù)據(jù)進(jìn)行訓(xùn)練并評(píng)估測(cè)試數(shù)據(jù),并以基于測(cè)試數(shù)據(jù)的評(píng)估結(jié)果為指導(dǎo)來選擇和更改各種模型超參數(shù),例如學(xué)習(xí)速率和特征。所以在新數(shù)據(jù)基礎(chǔ)上將數(shù)據(jù)集劃分為三個(gè)子集,可以大幅降低過擬合的發(fā)生幾率:劃分訓(xùn)練集、驗(yàn)證集和測(cè)試集
機(jī)器學(xué)習(xí)10—多元線性回歸模型

  • 在模型“通過”驗(yàn)證集之后,使用測(cè)試集再次檢查評(píng)估結(jié)果。
train_num = 300    # 訓(xùn)練集的數(shù)目
valid_num = 100    # 驗(yàn)證集的數(shù)目
test_num = len(x_data) - train_num - valid_num # 測(cè)試集的數(shù)日 = 506-訓(xùn)練集的數(shù)日–驗(yàn)證集的數(shù)月

# 訓(xùn)練集劃分
x_train = x_data[:train_num]
y_train = y_data[:train_num]

# 驗(yàn)證集劃分
x_valid = x_data[train_num:train_num+valid_num]
y_valid = y_data[train_num:train_num+valid_num]

# 測(cè)試集劃分
x_test = x_data[train_num+valid_num:train_num+valid_num+test_num]
y_test = y_data[train_num+valid_num:train_num+valid_num+test_num]
  • 數(shù)據(jù)類型的轉(zhuǎn)換
# 轉(zhuǎn)換為tf.float32數(shù)據(jù)類型,后面求損失時(shí)要和變量W執(zhí)行tf.matmul操作
x_train = tf.cast(x_train,dtype=tf.float32)
x_valid = tf.cast(x_valid,dtype=tf.float32)
x_test = tf.cast(x_test,dtype=tf.float32)
  • 構(gòu)建模型
def model(x,w,b):
    return tf.matmul(x,w)+b
  • 優(yōu)化變量的創(chuàng)建
W = tf.Variable(tf.random.normal([12,1],mean=0.0,stddev=1.0,dtype=tf.float32))
B= tf.Variable(tf.zeros(1),dtype = tf.float32)
print(W)
print(B)

輸出為:
機(jī)器學(xué)習(xí)10—多元線性回歸模型

  • 模型訓(xùn)練
# 設(shè)置超參數(shù)
training_epochs = 50  #迭代次數(shù)
learning_rate = 0.001  #學(xué)習(xí)率
batch_size = 10  #批量訓(xùn)練一次的樣本數(shù)

# 定義損失函數(shù)

# 采用均方差作為損失函數(shù)
def loss(x,y,w,b):
    err = model(x, w,b) - y       # 計(jì)算模型預(yù)測(cè)值和標(biāo)簽值的差異
    squared_err = tf.square(err)  # 求平方,得出方差
    return tf.reduce_mean(squared_err) # 求均值,得出均方差.

# 定義梯度函數(shù)

#計(jì)算樣本數(shù)據(jù)[x,y]在參數(shù)[w, b]點(diǎn)上的梯度

def grad(x,y,w,b):
    with tf.GradientTape() as tape:
        loss_= loss(x,y,w,b)
    return tape.gradient(loss_,[w,b]) #返回梯度向量

# 選擇優(yōu)化器
optimizer = tf.keras.optimizers.SGD(learning_rate) #創(chuàng)建優(yōu)化器,指定學(xué)習(xí)率

# 迭代訓(xùn)練
loss_list_train = []  # 用于保存訓(xùn)練集1oss值的列表
loss_list_valid = []  # 用于保存驗(yàn)證集loss值的列表
total_step = int(train_num/batch_size)# 轉(zhuǎn)換為整型

for epoch in range(training_epochs):
    for step in range(total_step):
        xs = x_train[step*batch_size:(step+1)*batch_size,:]
        ys = y_train[step*batch_size:(step+1)*batch_size]
        
        grads = grad(xs,ys,W,B)   # 計(jì)算梯度
        optimizer.apply_gradients(zip(grads,[W,B]))# 優(yōu)化器根據(jù)梯度自動(dòng)調(diào)整變量w和b
        
    loss_train = loss(x_train,y_train,W,B).numpy() # 計(jì)算當(dāng)前輪訓(xùn)練損失
    loss_valid = loss(x_valid,y_valid,W,B).numpy() # 計(jì)算當(dāng)前輪驗(yàn)證損失
    loss_list_train.append(loss_train)
    loss_list_valid.append(loss_valid)
    print("epoch={:3d},train_loss={:.4f},valid_loss={:.4f}".format(epoch+1,loss_train,loss_valid))

輸出為:迭代50次,但是由于訓(xùn)練集和驗(yàn)證集損失都為nan就沒有繼續(xù)下去了。
可以參考一下:https://itcn.blog/p/1026265732.html文章來源地址http://www.zghlxwxcb.cn/news/detail-423597.html

epoch=  1,train_loss=nan,valid_loss=nan
epoch=  2,train_loss=nan,valid_loss=nan
epoch=  3,train_loss=nan,valid_loss=nan
epoch=  4,train_loss=nan,valid_loss=nan
epoch=  5,train_loss=nan,valid_loss=nan
epoch=  6,train_loss=nan,valid_loss=nan
epoch=  7,train_loss=nan,valid_loss=nan
epoch=  8,train_loss=nan,valid_loss=nan
epoch=  9,train_loss=nan,valid_loss=nan
epoch= 10,train_loss=nan,valid_loss=nan
epoch= 11,train_loss=nan,valid_loss=nan
epoch= 12,train_loss=nan,valid_loss=nan
epoch= 13,train_loss=nan,valid_loss=nan
epoch= 14,train_loss=nan,valid_loss=nan
epoch= 15,train_loss=nan,valid_loss=nan
epoch= 16,train_loss=nan,valid_loss=nan
epoch= 17,train_loss=nan,valid_loss=nan
epoch= 18,train_loss=nan,valid_loss=nan
epoch= 19,train_loss=nan,valid_loss=nan
epoch= 20,train_loss=nan,valid_loss=nan
epoch= 21,train_loss=nan,valid_loss=nan
epoch= 22,train_loss=nan,valid_loss=nan
epoch= 23,train_loss=nan,valid_loss=nan
epoch= 24,train_loss=nan,valid_loss=nan
epoch= 25,train_loss=nan,valid_loss=nan
epoch= 26,train_loss=nan,valid_loss=nan
epoch= 27,train_loss=nan,valid_loss=nan
epoch= 28,train_loss=nan,valid_loss=nan
epoch= 29,train_loss=nan,valid_loss=nan
epoch= 30,train_loss=nan,valid_loss=nan
epoch= 31,train_loss=nan,valid_loss=nan
epoch= 32,train_loss=nan,valid_loss=nan
epoch= 33,train_loss=nan,valid_loss=nan
epoch= 34,train_loss=nan,valid_loss=nan
epoch= 35,train_loss=nan,valid_loss=nan
epoch= 36,train_loss=nan,valid_loss=nan
epoch= 37,train_loss=nan,valid_loss=nan
epoch= 38,train_loss=nan,valid_loss=nan
epoch= 39,train_loss=nan,valid_loss=nan
epoch= 40,train_loss=nan,valid_loss=nan
epoch= 41,train_loss=nan,valid_loss=nan
epoch= 42,train_loss=nan,valid_loss=nan
epoch= 43,train_loss=nan,valid_loss=nan
epoch= 44,train_loss=nan,valid_loss=nan
epoch= 45,train_loss=nan,valid_loss=nan
epoch= 46,train_loss=nan,valid_loss=nan
epoch= 47,train_loss=nan,valid_loss=nan
epoch= 48,train_loss=nan,valid_loss=nan
epoch= 49,train_loss=nan,valid_loss=nan
epoch= 50,train_loss=nan,valid_loss=nan

到了這里,關(guān)于機(jī)器學(xué)習(xí)10—多元線性回歸模型的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 人工智能基礎(chǔ)_機(jī)器學(xué)習(xí)001_線性回歸_多元線性回歸_最優(yōu)解_基本概念_有監(jiān)督機(jī)器學(xué)習(xí)_jupyter notebook---人工智能工作筆記0040

    人工智能基礎(chǔ)_機(jī)器學(xué)習(xí)001_線性回歸_多元線性回歸_最優(yōu)解_基本概念_有監(jiān)督機(jī)器學(xué)習(xí)_jupyter notebook---人工智能工作筆記0040

    ? ?線性和回歸,就是自然規(guī)律,比如人類是身高趨于某個(gè)值的概率最大,回歸就是通過數(shù)學(xué)方法找到事物的規(guī)律. 機(jī)器學(xué)習(xí)作用: 該專業(yè)實(shí)際應(yīng)用于機(jī)器視覺、指紋識(shí)別、人臉識(shí)別、視網(wǎng)膜識(shí)別、虹膜識(shí)別、掌紋識(shí)別、專家系統(tǒng)、自動(dòng)規(guī)劃、智能搜索、定理證明、博弈、自動(dòng)程序

    2024年02月06日
    瀏覽(27)
  • 機(jī)器學(xué)習(xí)(10) 邏輯回歸:多元分類(Multi-class classification)

    機(jī)器學(xué)習(xí)(10) 邏輯回歸:多元分類(Multi-class classification)

    對(duì)于數(shù)據(jù)集中存在多個(gè)類別的分類問題,我們可以采用一種叫做 One-vs-rest 的方法,將其轉(zhuǎn)化成二元分類的問題,然后再進(jìn)行解決。 前面的是對(duì)于二元分類問題,應(yīng)該如何去處理其預(yù)測(cè)函數(shù)、代價(jià)函數(shù)和梯度下降算法。 但是多元的分類才是生活常見的情況。 例如對(duì)于郵件,我

    2024年02月02日
    瀏覽(29)
  • 多元線性回歸模型

    多元線性回歸模型

    目錄 一、一元線性回歸之舊轎車價(jià)格案例 二、多元線性回歸之洞庭湖污染物案例實(shí)測(cè) 三、說一說plot函數(shù)的用法 四、感想 直接上例題 一、一元線性回歸之舊轎車價(jià)格案 以x表示使用年數(shù),y表示相應(yīng)平均價(jià)格。根據(jù)表中x、y的數(shù)據(jù),建立一個(gè)數(shù)據(jù)模型,分析舊轎車平均價(jià)格與

    2024年02月05日
    瀏覽(13)
  • 基于Python多元線性回歸模型

    基于Python多元線性回歸模型

    提示:基于Python的多元線性回歸模型 文章目錄 前言 一、讀取數(shù)據(jù) 二、建立模型 ?三、預(yù)測(cè)新值 ?四、去截距模型 總結(jié) 本文主要是基于多元回歸線性模型,然后建立模型和分析,解決多元線性回歸模型存在的問題和優(yōu)化多元線性回歸模型,原理就不多講了,可查看《應(yīng)用回

    2024年02月07日
    瀏覽(25)
  • 如何對(duì)多元線性回歸模型調(diào)參?

    多元線性回歸模型通常不像復(fù)雜的機(jī)器學(xué)習(xí)模型那樣擁有許多可調(diào)節(jié)的超參數(shù)。然而,仍有一些關(guān)鍵步驟和技巧可以用于優(yōu)化多元線性回歸模型的性能: 特征選擇 移除無關(guān)特征:通過分析特征與目標(biāo)變量的關(guān)聯(lián)度,移除與目標(biāo)變量關(guān)聯(lián)度低的特征。 使用特征選擇方法:可以

    2024年01月23日
    瀏覽(33)
  • 【機(jī)器學(xué)習(xí)】線性回歸模型詳解

    【機(jī)器學(xué)習(xí)】線性回歸模型詳解

    PS:本文有一定閱讀門檻,如果有不明白的地方歡迎評(píng)論詢問! 接下來我們將要學(xué)習(xí)我們的第一個(gè)模型——線性回歸。比如說我需要根據(jù)數(shù)據(jù)預(yù)測(cè)某個(gè)面積的房子可以賣多少錢 接下來我們會(huì)用到以下符號(hào): m:訓(xùn)練樣本數(shù)量 x:輸入值,又稱為屬性值 y:輸出值,是我們需要的結(jié)果

    2024年02月03日
    瀏覽(21)
  • Python多元線性回歸預(yù)測(cè)模型實(shí)驗(yàn)完整版

    Python多元線性回歸預(yù)測(cè)模型實(shí)驗(yàn)完整版

    實(shí)驗(yàn)?zāi)康?通過多元線性回歸預(yù)測(cè)模型,掌握預(yù)測(cè)模型的建立和應(yīng)用方法,了解線性回歸模型的基本原理 實(shí)驗(yàn)內(nèi)容 多元線性回歸預(yù)測(cè)模型 實(shí)驗(yàn)步驟和過程 (1)第一步:學(xué)習(xí)多元線性回歸預(yù)測(cè)模型相關(guān)知識(shí)。 一元線性回歸模型反映的是單個(gè)自變量對(duì)因變量的影響,然而實(shí)際情況

    2024年02月09日
    瀏覽(19)
  • 【AI】機(jī)器學(xué)習(xí)——線性模型(邏輯斯蒂回歸)

    【AI】機(jī)器學(xué)習(xí)——線性模型(邏輯斯蒂回歸)

    邏輯回歸輸出的是實(shí)例屬于每個(gè)類別的似然概率,似然概率最大的類別就是分類結(jié)果 在一定條件下,邏輯回歸模型與樸素貝葉斯分類器等價(jià) 多分類問題可以通過多次二分類或者Softmax回歸解決 3. 線性回歸模型 4.4 線性分類模型——感知器 目標(biāo):用判別模型解決分類問題 4.1.

    2024年02月09日
    瀏覽(21)
  • 機(jī)器學(xué)習(xí)與深度學(xué)習(xí)——自定義函數(shù)進(jìn)行線性回歸模型

    機(jī)器學(xué)習(xí)與深度學(xué)習(xí)——自定義函數(shù)進(jìn)行線性回歸模型

    目的與要求 1、通過自定義函數(shù)進(jìn)行線性回歸模型對(duì)boston數(shù)據(jù)集前兩個(gè)維度的數(shù)據(jù)進(jìn)行模型訓(xùn)練并畫出SSE和Epoch曲線圖,畫出真實(shí)值和預(yù)測(cè)值的散點(diǎn)圖,最后進(jìn)行二維和三維度可視化展示數(shù)據(jù)區(qū)域。 2、通過自定義函數(shù)進(jìn)行線性回歸模型對(duì)boston數(shù)據(jù)集前四個(gè)維度的數(shù)據(jù)進(jìn)行模型

    2024年02月13日
    瀏覽(21)
  • 【人工智能】多元線性回歸模型舉例及python實(shí)現(xiàn)方式

    【人工智能】多元線性回歸模型舉例及python實(shí)現(xiàn)方式

    比如你做了一個(gè)企業(yè)想要招人,但是不知道月薪應(yīng)該定在多少,你做了一個(gè)月薪和收入的調(diào)研,包括年限、學(xué)歷、地區(qū)和月薪 做一個(gè)月薪=w1 年限+w2 學(xué)歷+w3*城市+…+b的工作年限和薪資的多元線性模型,然后找出最適合線性模型的直線-成本函數(shù)、梯度下降方式,來預(yù)估你可以

    2024年02月19日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包