https://github.com/LiuChuang0059/100days-ML-code/blob/master/Day3_Multiple_Linear_regression/README.md
多元線性回歸
一個(gè)線性方程適配觀測(cè)數(shù)據(jù),建立特征和響應(yīng)之間的關(guān)系。可以用來(lái)找出預(yù)測(cè)結(jié)果在哪個(gè)因素影響最大 ,不同變量如何關(guān)聯(lián)。
y = b 0 + b 1 x 1 + b 2 x 2 + . . . + b n x n y = b_0+b_1x_1+b_2x_2+...+b_nx_n y=b0?+b1?x1?+b2?x2?+...+bn?xn?
前提:
- 線性:特征值和預(yù)測(cè)值線性相關(guān)
- 保持誤差項(xiàng)的方差齊性(常數(shù)方差):誤差項(xiàng)的分散(方差)必須等同(線性回歸的誤差項(xiàng)在不同的預(yù)測(cè)值范圍內(nèi)有同樣的方差,誤差項(xiàng)的方差在各個(gè)預(yù)測(cè)值下保持不變。即誤差項(xiàng)之間是獨(dú)立的,一個(gè)誤差不會(huì)影響其他誤差。)—齊性
- 多元正態(tài)分布:多元回歸假定殘差符合正態(tài)分布(殘差:實(shí)際觀測(cè)值與模型估計(jì)值之間的差)
- 缺少多重共線性:假設(shè)數(shù)據(jù)有極少甚至沒(méi)有多重特征。當(dāng)特征不是相互獨(dú)立的時(shí)候,會(huì)引發(fā)多重共線性?!?strong>獨(dú)立性
ps: 誤差(error):是觀察值與真實(shí)值之間的差,經(jīng)典測(cè)量理論基本假設(shè)是–觀察值等于真值加上誤差。任何一次測(cè)量都帶有誤差(每一次測(cè)量的這個(gè)誤差具體是多少是不清楚的,只有把所有測(cè)量結(jié)果進(jìn)行分析后才知道誤差有多大),經(jīng)典測(cè)驗(yàn)理論認(rèn)為誤差是隨機(jī)分布,且誤差均值為0。因此,經(jīng)過(guò)多次測(cè)驗(yàn)后,將觀測(cè)值求平均就可以看作為真值。也就是說(shuō),多次測(cè)量求得的平均數(shù)是真值的最佳估計(jì)。**殘差(residual)**是觀察值與模型估計(jì)值之間的差。以回歸分析為例,回歸方程y=b0+b1x,當(dāng)知道b0和b1時(shí)這就是一個(gè)真實(shí)的回歸模型。比如y=2+3x。取一個(gè)數(shù)值(1,2),則模型估計(jì)值為y=2+3×1=5。殘差為2-5=-3。因此,只要有一個(gè)確定的取值以及模型,則模型肯定有一個(gè)估計(jì)值,也就有一個(gè)殘差了
來(lái)源:https://zhuanlan.zhihu.com/p/98643701
方差齊性,也就是方差相等。兩組和多組比較中,方差齊性的意思很容易理解,無(wú)非就是比較各組的方差大小,看看各組的方差是不是差不多大小,如果差別太大,就認(rèn)為是方差不齊,或方差不等。如果差別不大,就認(rèn)為方差齊性或方差相等。這種所謂的差別大或小,需要統(tǒng)計(jì)學(xué)的檢驗(yàn),所以就有了方差齊性檢驗(yàn)。
在線性回歸中,有的人就不理解方差齊性是什么意思了。因?yàn)榫€性回歸中自變量x不是分類變量,x取值很多。通常情況下,每個(gè)x值只對(duì)應(yīng)1個(gè)y值。比如,分析身高對(duì)血壓值的影響,可能每個(gè)身高對(duì)應(yīng)的血壓值只有一個(gè)數(shù)值。盡管在一次抽樣中每個(gè)x取值上可能只有1個(gè)y值,但對(duì)于總體而言,理論上每個(gè)x取值上對(duì)應(yīng)的y值是有很多的。盡管在一次抽樣中每一身高值(如170cm)所對(duì)應(yīng)的血壓值可能只有1個(gè)值(如140mmHg),但從總體而言這一固定的身高(170cm)所對(duì)應(yīng)的血壓值應(yīng)該有很多,可能是140mmHg,也可能是150mmHg,只是在我們的抽樣中恰好抽中了這1個(gè)值而已。如果你重新抽樣,170cm所對(duì)應(yīng)的血壓值可能就不是140mmHg了,有可能就是145mmHg或138mmHg等。所以,線性回歸中,理論上也是有方差的。然而這種理論上的方差,除非你知道總體中每個(gè)x取值上的所有對(duì)應(yīng)的y值,否則你是沒(méi)有辦法真正去計(jì)算方差的。但這種情況幾乎是不可能發(fā)生的,因此在線性回歸中的方差齊性檢驗(yàn),很多情況下只是一種探測(cè)而已。
來(lái)源:https://zhuanlan.zhihu.com/p/93270816
注意:
過(guò)多變量可能降低模型的精確度,尤其是對(duì)結(jié)果無(wú)關(guān)的變量,或存在對(duì)其他變量造成很大影響的變量。有一些變量選擇方法:
- 向前選擇法(forward selection): 一個(gè)個(gè)加入feature
(1)選擇一個(gè)差異等級(jí)significance level,如SL=0.05表示有95%貢獻(xiàn)
(2)建立回歸模型,找到最小P值
(3)確立一個(gè)簡(jiǎn)單模型,將有最小P值的變量加入此模型
(4)如果P>SL,模型建立成功,否則轉(zhuǎn)回(3) - 向后選擇法Backward Elimination:首先包含了所有的feature,然后每個(gè)feature都嘗試去刪除,測(cè)試刪除的哪個(gè)feature對(duì)模型準(zhǔn)確性有最大的提升,最終刪掉對(duì)模型提升最高的一個(gè)特征。如此類推,直到刪除feature并不能提升模型為止。
- 向前向后法:結(jié)合1和2,先用1篩選一遍,在用2篩選一遍,知道最后無(wú)論怎么篩選模型變量都不再發(fā)生變化。當(dāng)一個(gè)feature新加入后,stepwise會(huì)嘗試刪去一個(gè)feature,直至達(dá)到某個(gè)預(yù)設(shè)的標(biāo)準(zhǔn)。這種方法的缺點(diǎn)是,預(yù)設(shè)的標(biāo)準(zhǔn)不好定,而且容易陷入到過(guò)擬合當(dāng)中
虛(擬)變量
數(shù)據(jù)集是非數(shù)值數(shù)據(jù)類型時(shí),使用分類數(shù)據(jù)時(shí)非常有效的。(分類數(shù)據(jù):反映事物類別,是離散數(shù)據(jù),分類屬性有限且無(wú)序。如男女用0,1表示)
虛擬變量陷阱
虛擬變量限制指兩個(gè)或兩個(gè)以上變量之間高度相關(guān),即存在一個(gè)能夠被其他變量預(yù)測(cè)出的變量。(如一個(gè)存在重復(fù)類別的例子,舍棄男性類別,該類型也可用女性類別定義,即女性值為0表示男性)。
解決方法:變量類別減1:假定m個(gè)類別,模型構(gòu)建取m-1個(gè)虛擬變量,減去的那個(gè)變量看作參照值。
D
2
=
1
?
D
1
D_2 = 1- D_1
D2?=1?D1?
y
=
b
0
+
b
1
x
1
+
b
2
x
2
+
b
3
D
1
y = b_0+b_1x_1+b_2x_2+b_3D_1
y=b0?+b1?x1?+b2?x2?+b3?D1?
步驟:
- 數(shù)據(jù)預(yù)處理:導(dǎo)入庫(kù)–導(dǎo)入數(shù)據(jù)集–檢查缺失數(shù)據(jù)–數(shù)據(jù)分類–有必要?jiǎng)t設(shè)置虛擬變量–特征縮放
## step1: 預(yù)處理
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
dataset = pd.read_csv('50_Startups.csv')
X = dataset.iloc[ : , :-1].values
Y = dataset.iloc[ : , 4 ].values
from sklearn.compose import ColumnTransformer #new
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder = LabelEncoder()
X[: , 3] = labelencoder.fit_transform(X[ : , 3])
ct = ColumnTransformer([('encoder', OneHotEncoder(), [0])], remainder='passthrough')#new
# 對(duì)第四列進(jìn)行One-Hot編碼轉(zhuǎn)為二進(jìn)制特征,[3]表示對(duì)第四列編碼,轉(zhuǎn)為數(shù)字標(biāo)簽
X = ct.fit_transform(X)#new
# onehotencoder = OneHotEncoder(categorical_features = [3]) #old
# X = onehotencoder.fit_transform(X).toarray() #old
X = X[: , 1:] #刪除第一列
### 避免虛擬變量陷阱 只選擇 兩個(gè)(3-1)虛擬變量
from sklearn.model_selection import train_test_split #new
#from sklearn.cross_validation import train_test_split ## 分割數(shù)據(jù)集#old
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.2, random_state = 0)
- 在訓(xùn)練集上訓(xùn)練模型:創(chuàng)建訓(xùn)練模型并用fit訓(xùn)練
## step2: 訓(xùn)練
from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(X_train, Y_train) ## 多重線性回歸模型應(yīng)用到訓(xùn)練集
- 預(yù)測(cè)結(jié)果:在測(cè)試集預(yù)測(cè)predict()
## step3: 預(yù)測(cè)
y_pred = regressor.predict(X_test)
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-525371.html
- 可視化
## step4:可視化
plt.scatter(np.arange(10),Y_test, color = 'red',label='y_test')
plt.scatter(np.arange(10),y_pred, color = 'blue',label='y_pred')
plt.legend(loc=2)
plt.show()
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-525371.html
到了這里,關(guān)于[github-100天機(jī)器學(xué)習(xí)]day3 multiple linear regression--代碼版本問(wèn)題已修正的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!