[机器学习]回归--(Simple LR and Multiple LR)
線性回歸是最貼近生活的數(shù)據(jù)模型之一
簡單的線性回歸
簡單的線性回歸公式如下:
從公式中我們可以看出,簡單線性回歸只有一個(gè)自變量x1,b1是自變量的系數(shù),y是因變量。x1可能是連續(xù)型或者離散型的數(shù)據(jù),所以我們需要通過x1找出最合適的系數(shù)b1從而得到關(guān)于因變量y的曲線。
我們下面用一個(gè)例子來說明,這是一個(gè)關(guān)于工作經(jīng)驗(yàn)與薪水之間關(guān)系的表格。分布如下圖所示
我們很容易看出這是符合一個(gè)線性回歸的模型,下面我們就要做出回歸的函數(shù)并且對未來數(shù)據(jù)進(jìn)行預(yù)測。
# Importing the libraries import numpy as np import matplotlib.pyplot as plt import pandas as pd# Importing the dataset dataset = pd.read_csv('Salary_Data.csv') X = dataset.iloc[:, :-1].values #除了最后一列的其他列 y = dataset.iloc[:, 1].values #第二列# Splitting the dataset into the Training set and Test set from sklearn.cross_validation import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 1/3, random_state = 0)下面我們需要做的是通過訓(xùn)練集的X_train與y_train 計(jì)算出符合訓(xùn)練集的曲線,然后將測試集的X_test 帶入得到的曲線中,得到預(yù)測的結(jié)果y_pred,最后將預(yù)測結(jié)果y_pred與測試集中的y_test進(jìn)行比較,看看是否符合分布,從而確定預(yù)測是否準(zhǔn)確。
# Fitting Simple LinearRegression to the training set from sklearn.linear_model import LinearRegression regressor = LinearRegression() regressor.fit(X_train,y_train) # 通過train集找到曲線# 對測試集進(jìn)行預(yù)測 y_pred = regressor.predict(X_test)# visualising the Traning set results plt.scatter(X_train, y_train, color = 'red') plt.plot(X_train, regressor.predict(X_train), color = 'blue') plt.title('Salary vs Experience(Traning set)') plt.xlabel('Year of Experience') plt.ylabel('Salary') plt.show()通過學(xué)習(xí)我們可以得到訓(xùn)練曲線
下面我們導(dǎo)入測試數(shù)據(jù)
plt.scatter(X_test, y_test, color = 'red') plt.plot(X_train, regressor.predict(X_train), color = 'blue') plt.title('Salary vs Experience(Traning set)') plt.xlabel('Year of Experience') plt.ylabel('Salary') plt.show()這里需要注意兩點(diǎn)
第一,在導(dǎo)入測試集時(shí)我們依然使用訓(xùn)練集得到的曲線,所以我們的plot函數(shù)中參數(shù)不便,當(dāng)然如果你用測試集的數(shù)據(jù)應(yīng)該也會得到相同的曲線。
第二有的人覺得既然需要預(yù)測數(shù)據(jù)應(yīng)該將y_test 替換成 y_pred。 其實(shí)不需要這樣的。因?yàn)槲覀儁_pred 上的點(diǎn)應(yīng)該都是和曲線高度重合的
多重線性回歸(Multiple Linear Regression)
多重線性回歸將會不只有一個(gè)自變量,并且每個(gè)自變量擁有自己的系數(shù)且符合線性回歸。
在建立多重線性回歸之前,有這么幾個(gè)前提必須要注意一下,這些有助于你判斷數(shù)據(jù)是否適合使用多重線性回歸:
1, 線性(linearity)
2, 同方差(Homoscedasticity)
3, 多元正態(tài)性(Multivariate normality)??
????? 多因素共同影響分布結(jié)果
4, 錯(cuò)誤的獨(dú)立性(independence of errors)
????? 每一個(gè)變量產(chǎn)生的錯(cuò)誤將會獨(dú)立的影響預(yù)測結(jié)果,不會對其他變量產(chǎn)生影響
5, 多重共線性的缺乏(lack of multicollinearity)
????? 變量之間存在高度相關(guān)關(guān)系而使得回歸估算不準(zhǔn)確,如接下來要提到的虛擬變量陷阱(dummy variable trap)有可能觸發(fā)多重共線性的問題虛擬變量陷阱(Dummy variable trap)
在回歸預(yù)測中我們需要所有的數(shù)據(jù)都是numeric的,但是會有一些非numeric的數(shù)據(jù),比如國家,省,部門,性別。這時(shí)候我們需要設(shè)置虛擬變量(Dummy variable)。做法是將此變量中的每一個(gè)值,衍生成為新的變量,是設(shè)為1,否設(shè)為0.舉個(gè)例子,“性別"這個(gè)變量,我們可以虛擬出“男”和"女"兩虛擬變量,男性的話“男”值為1,"女"值為,;女性的話“男”值為0,"女"值為1。
但是要注意,這時(shí)候虛擬變量陷阱就出現(xiàn)了。就拿性別來說,其實(shí)一個(gè)虛擬變量就夠了,比如 1 的時(shí)候是“男”, 0 的時(shí)候是"非男",即為女。如果設(shè)置兩個(gè)虛擬變量“男”和“女”,語義上來說沒有問題,可以理解,但是在回歸預(yù)測中會多出一個(gè)變量,多出的這個(gè)變量將會對回歸預(yù)測結(jié)果產(chǎn)生影響。一般來說,如果虛擬變量要比實(shí)際變量的種類少一個(gè)。
所以在多重線性回歸中,變量不是越多越好,而是選擇適合的變量。這樣才會對結(jié)果準(zhǔn)確預(yù)測。
建立模型
我們可以通過以下五個(gè)步驟建立回歸模型:(stepwise Regression)
1, 確立所有的可能(變量all in)
建立所有的個(gè)模型包含所有可能的變量
2, 逆向消除(backward elimination)
(1)選擇一個(gè)差異等級(significance level)比如SL=0.05, 0.05 意味著此變量對結(jié)果有95%的貢獻(xiàn)。 P(A|B) = 0.05
(2)將所有的變量放進(jìn)你的模型中。
(3)選擇P值最高的變量,如果P>SL。到第四步,否則結(jié)束,完成建模。關(guān)于變量P值,統(tǒng)計(jì)軟件可以計(jì)算出并選擇最高P值的變量
(4)移除此變量,并重新進(jìn)行第三步。
有關(guān)逆向消除和逐步回歸的方法,可以參考一下兩個(gè)鏈接:
Backward elimination and stepwise regression
Variable Selection
3, 正向選擇(forward selection)
(1)選擇一個(gè)差異等級(significance level)比如SL=0.05
(2)建立所有的簡單回歸的模型,并找到最小的P值
(3)確立一個(gè)簡單模型,并將擁有最小P值的變量加入此模型
(4)如果P>SL,模型建立成功,否則在進(jìn)行第三步
4,雙向消除(bidirectionnal elimination)
同時(shí)進(jìn)行逆向消除和正向選擇。
*所有可能的模型:意思是所有變量排列組合成的模型,如果有N個(gè)變量,那么一共會有2的N次方個(gè)模型(2^N-1)
在R語言中,每一個(gè)變量后面會用星號表示此變量對回歸模型的影響,星號越多越重要。
Stepwise Regression 這是賓夕法尼亞州立大學(xué)的講解。我覺得挺不錯(cuò)的
另外,其實(shí)這幾步不是很難,關(guān)鍵的一點(diǎn)是SL值的確定。還有就是P值的生成。
如何計(jì)算P值(p-value)
假定有兩組人群,一組x=0,另一組x=1。從兩組中各隨機(jī)抽取2個(gè)個(gè)體,測量Y
的值,如圖所示,看看這兩組的Y是否相同?
現(xiàn)在各組再多抽取若干個(gè)體,數(shù)據(jù)如圖所示,可以計(jì)算各組的均數(shù),這兩個(gè)均
數(shù)不在同一條線上,這是從所抽取的樣本中估計(jì)出來的。從樣本中得到的兩個(gè)
均數(shù)不等于兩組總體的均數(shù),從樣本中得到的兩均數(shù)距離不等于兩個(gè)總體均數(shù)
的差,t 檢驗(yàn)是根據(jù)兩樣本均數(shù)及兩樣本的標(biāo)準(zhǔn)差,計(jì)算如果兩總體均數(shù)相同的
話,抽樣得到兩樣本均數(shù)差達(dá)如此之大或更大的可能性多大,就是p 值,p值
<0.05,表示兩者之間的距離顯著。
現(xiàn)在看回歸分析,建立回歸方程如上所示。從方程中看,當(dāng)x=0時(shí),Y=β0;當(dāng)x=1
時(shí),Y=β0 + β1。因此,β0表示X=0組Y的均數(shù),β1表示X=1組Y的均數(shù)與X=0組Y的均
數(shù)的差,ei是每個(gè)個(gè)體與其所在組均數(shù)的差。因此回歸方程對β1= 0 的檢驗(yàn)等同
于t檢驗(yàn)兩組均數(shù)的比較。
用Python進(jìn)行操作
我們可以使用之前建立的模板,將數(shù)據(jù)導(dǎo)入。
今天我們使用一個(gè)多變量對商業(yè)profit影響的數(shù)據(jù)集。
在此數(shù)據(jù)集中,我們確定前四個(gè)變量 X(R&D Speed, Administration, Marketing Speed, State)為自變量。
最后一個(gè)profit為因變量 y。
import numpy as np import matplotlib.pyplot as plt import pandas as pd# Importing the dataset dataset = pd.read_csv('50_Startups.csv') X = dataset.iloc[:, :-1].values y = dataset.iloc[:, 4].values由于數(shù)據(jù)中包含state變量,我們用虛擬變量代替
from sklearn.preprocessing import LabelEncoder, OneHotEncoder labelencoder = LabelEncoder() X[:, 3] = labelencoder.fit_transform(X[:, 3]) onehotencoder = OneHotEncoder(categorical_features = [3]) X = onehotencoder.fit_transform(X).toarray()#為了避免虛擬變量陷阱 X = X[:, 1:] #從1 開始,并非0
將數(shù)據(jù)集分為訓(xùn)練集和測試集,我們選擇test size為0.2(4:1)
from sklearn.cross_validation import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)多重線性回歸:
from sklearn.linear_model import LinearRegression regressor = LinearRegression() regressor.fit(X_train, y_train)得到預(yù)測結(jié)果:
y_pred = regressor.predict(X_test)我們比較一下預(yù)測結(jié)果(y_pred)和實(shí)際結(jié)果(y_test)中的差異
其實(shí)很多結(jié)果還是很接近的。
這樣我們就完成了多元線性回歸的建模過程。其實(shí)我們與簡單線性回歸比較一下,代碼完全相同.
所以在sklearn的線性回歸庫中沒有簡單或者多元的區(qū)分。但是多元線性回歸很難用圖像表示,因?yàn)榘鄠€(gè)自變量。
總結(jié)
以上是生活随笔為你收集整理的[机器学习]回归--(Simple LR and Multiple LR)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win10怎么安装sql2005数据库
- 下一篇: [机器学习]回归--Polinomial