基本形式

創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供羅田網(wǎng)站建設(shè)、羅田做網(wǎng)站、羅田網(wǎng)站設(shè)計(jì)、羅田網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、羅田企業(yè)網(wǎng)站模板建站服務(wù),10多年羅田做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
線性模型(linear model)就是試圖通過屬性的線性組合來進(jìn)行預(yù)測(cè)的函數(shù),基本形式如下:
f(x)=wTx+b
許多非線性模型可在線性模型的基礎(chǔ)上通過引入層結(jié)構(gòu)或者高維映射(比如核方法)來解決。線性模型有很好的解釋性。
線性回歸
線性回歸要求均方誤差最小:
(w?,b?)=argmin∑i=1m(f(xi)?yi)2
均方誤差有很好的幾何意義,它對(duì)應(yīng)了常用的歐式距離(Euclidean distance)。基于均方誤差最小化來進(jìn)行模型求解稱為最小二乘法(least square method),線性回歸中,最小二乘發(fā)就是試圖找到一條直線,使得所有樣本到直線的歐式距離之和最小。
我們把上式寫成矩陣的形式:
w?=argmin(y?Xw)T(y?Xw)
這里我們把b融合到w中,X中最后再加一列1。為了求最小值,我們對(duì)w求導(dǎo)并令其為0:
2XT(Xw?y)=0
當(dāng)XTX為滿秩矩陣(full-rank matrix)時(shí)是可逆的。此時(shí):
w=(XTX)?1XTy
令xi=(xi,1),可以得到線性回歸模型:
f(xi)=xTi(XTX)?1XTy
1、什么是多元線性回歸模型?
當(dāng)y值的影響因素不唯一時(shí),采用多元線性回歸模型。
y =y=β0+β1x1+β2x2+...+βnxn
例如商品的銷售額可能不電視廣告投入,收音機(jī)廣告投入,報(bào)紙廣告投入有關(guān)系,可以有 sales =β0+β1*TV+β2* radio+β3*newspaper.
2、使用pandas來讀取數(shù)據(jù)
pandas 是一個(gè)用于數(shù)據(jù)探索、數(shù)據(jù)分析和數(shù)據(jù)處理的python庫(kù)
[python]?view plain?copy
import?pandas?as?pd
[html]?view plain?copy
pre?name="code"?class="python"#?read?csv?file?directly?from?a?URL?and?save?the?results
data?=?pd.read_csv('/home/lulei/Advertising.csv')
#?display?the?first?5?rows
data.head()
上面代碼的運(yùn)行結(jié)果:
TV ?Radio ?Newspaper ?Sales
0 ?230.1 ? 37.8 ? ? ? 69.2 ? 22.1
1 ? 44.5 ? 39.3 ? ? ? 45.1 ? 10.4
2 ? 17.2 ? 45.9 ? ? ? 69.3 ? ?9.3
3 ?151.5 ? 41.3 ? ? ? 58.5 ? 18.5
4 ?180.8 ? 10.8 ? ? ? 58.4 ? 12.9
上面顯示的結(jié)果類似一個(gè)電子表格,這個(gè)結(jié)構(gòu)稱為Pandas的數(shù)據(jù)幀(data frame),類型全稱:pandas.core.frame.DataFrame.
pandas的兩個(gè)主要數(shù)據(jù)結(jié)構(gòu):Series和DataFrame:
Series類似于一維數(shù)組,它有一組數(shù)據(jù)以及一組與之相關(guān)的數(shù)據(jù)標(biāo)簽(即索引)組成。
DataFrame是一個(gè)表格型的數(shù)據(jù)結(jié)構(gòu),它含有一組有序的列,每列可以是不同的值類型。DataFrame既有行索引也有列索引,它可以被看做由Series組成的字典。
[python]?view plain?copy
#?display?the?last?5?rows
data.tail()
只顯示結(jié)果的末尾5行
?TV ?Radio ?Newspaper ?Sales
195 ? 38.2 ? ?3.7 ? ? ? 13.8 ? ?7.6
196 ? 94.2 ? ?4.9 ? ? ? ?8.1 ? ?9.7
197 ?177.0 ? ?9.3 ? ? ? ?6.4 ? 12.8
198 ?283.6 ? 42.0 ? ? ? 66.2 ? 25.5
199 ?232.1 ? ?8.6 ? ? ? ?8.7 ? 13.4
[html]?view plain?copy
#?check?the?shape?of?the?DataFrame(rows,?colums)
data.shape
查看DataFrame的形狀,注意第一列的叫索引,和數(shù)據(jù)庫(kù)某個(gè)表中的第一列類似。
(200,4)?
3、分析數(shù)據(jù)
特征:
TV:對(duì)于一個(gè)給定市場(chǎng)中單一產(chǎn)品,用于電視上的廣告費(fèi)用(以千為單位)
Radio:在廣播媒體上投資的廣告費(fèi)用
Newspaper:用于報(bào)紙媒體的廣告費(fèi)用
響應(yīng):
Sales:對(duì)應(yīng)產(chǎn)品的銷量
在這個(gè)案例中,我們通過不同的廣告投入,預(yù)測(cè)產(chǎn)品銷量。因?yàn)轫憫?yīng)變量是一個(gè)連續(xù)的值,所以這個(gè)問題是一個(gè)回歸問題。數(shù)據(jù)集一共有200個(gè)觀測(cè)值,每一組觀測(cè)對(duì)應(yīng)一個(gè)市場(chǎng)的情況。
注意:這里推薦使用的是seaborn包。網(wǎng)上說這個(gè)包的數(shù)據(jù)可視化效果比較好看。其實(shí)seaborn也應(yīng)該屬于matplotlib的內(nèi)部包。只是需要再次的單獨(dú)安裝。
[python]?view plain?copy
import?seaborn?as?sns
import?matplotlib.pyplot?as?plt
#?visualize?the?relationship?between?the?features?and?the?response?using?scatterplots
sns.pairplot(data,?x_vars=['TV','Radio','Newspaper'],?y_vars='Sales',?size=7,?aspect=0.8)
plt.show()#注意必須加上這一句,否則無法顯示。
[html]?view plain?copy
這里選擇TV、Radio、Newspaper?作為特征,Sales作為觀測(cè)值
[html]?view plain?copy
返回的結(jié)果:
seaborn的pairplot函數(shù)繪制X的每一維度和對(duì)應(yīng)Y的散點(diǎn)圖。通過設(shè)置size和aspect參數(shù)來調(diào)節(jié)顯示的大小和比例。可以從圖中看出,TV特征和銷量是有比較強(qiáng)的線性關(guān)系的,而Radio和Sales線性關(guān)系弱一些,Newspaper和Sales線性關(guān)系更弱。通過加入一個(gè)參數(shù)kind='reg',seaborn可以添加一條最佳擬合直線和95%的置信帶。
[python]?view plain?copy
sns.pairplot(data,?x_vars=['TV','Radio','Newspaper'],?y_vars='Sales',?size=7,?aspect=0.8,?kind='reg')
plt.show()
結(jié)果顯示如下:
4、線性回歸模型
優(yōu)點(diǎn):快速;沒有調(diào)節(jié)參數(shù);可輕易解釋;可理解。
缺點(diǎn):相比其他復(fù)雜一些的模型,其預(yù)測(cè)準(zhǔn)確率不是太高,因?yàn)樗僭O(shè)特征和響應(yīng)之間存在確定的線性關(guān)系,這種假設(shè)對(duì)于非線性的關(guān)系,線性回歸模型顯然不能很好的對(duì)這種數(shù)據(jù)建模。
線性模型表達(dá)式:?y=β0+β1x1+β2x2+...+βnxn?其中
y是響應(yīng)
β0是截距
β1是x1的系數(shù),以此類推
在這個(gè)案例中:?y=β0+β1?TV+β2?Radio+...+βn?Newspaper
(1)、使用pandas來構(gòu)建X(特征向量)和y(標(biāo)簽列)
scikit-learn要求X是一個(gè)特征矩陣,y是一個(gè)NumPy向量。
pandas構(gòu)建在NumPy之上。
因此,X可以是pandas的DataFrame,y可以是pandas的Series,scikit-learn可以理解這種結(jié)構(gòu)。
[python]?view plain?copy
#create?a?python?list?of?feature?names
feature_cols?=?['TV',?'Radio',?'Newspaper']
#?use?the?list?to?select?a?subset?of?the?original?DataFrame
X?=?data[feature_cols]
#?equivalent?command?to?do?this?in?one?line
X?=?data[['TV',?'Radio',?'Newspaper']]
#?print?the?first?5?rows
print?X.head()
#?check?the?type?and?shape?of?X
print?type(X)
print?X.shape
輸出結(jié)果如下:
TV ?Radio ?Newspaper
0 ?230.1 ? 37.8 ? ? ? 69.2
1 ? 44.5 ? 39.3 ? ? ? 45.1
2 ? 17.2 ? 45.9 ? ? ? 69.3
3 ?151.5 ? 41.3 ? ? ? 58.5
4 ?180.8 ? 10.8 ? ? ? 58.4
class 'pandas.core.frame.DataFrame'
(200, 3)
[python]?view plain?copy
#?select?a?Series?from?the?DataFrame
y?=?data['Sales']
#?equivalent?command?that?works?if?there?are?no?spaces?in?the?column?name
y?=?data.Sales
#?print?the?first?5?values
print?y.head()
輸出的結(jié)果如下:
0 ? ?22.1
1 ? ?10.4
2 ? ? 9.3
3 ? ?18.5
4 ? ?12.9
Name: Sales
(2)、構(gòu)建訓(xùn)練集與測(cè)試集
[html]?view plain?copy
pre?name="code"?class="python"span?style="font-size:14px;"##構(gòu)造訓(xùn)練集和測(cè)試集
from?sklearn.cross_validation?import?train_test_split??#這里是引用了交叉驗(yàn)證
X_train,X_test,?y_train,?y_test?=?train_test_split(X,?y,?random_state=1)
#default split is 75% for training and 25% for testing
[html]?view plain?copy
print?X_train.shape
print?y_train.shape
print?X_test.shape
print?y_test.shape
輸出結(jié)果如下:
(150, 3)
(150,)
(50, 3)
(50,)
注:上面的結(jié)果是由train_test_spilit()得到的,但是我不知道為什么我的版本的sklearn包中居然報(bào)錯(cuò):
ImportError ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Traceback (most recent call last)ipython-input-182-3eee51fcba5a in module() ? ? ?1 ###構(gòu)造訓(xùn)練集和測(cè)試集---- 2 from sklearn.cross_validation import train_test_split ? ? ?3 #import sklearn.cross_validation ? ? ?4 X_train,X_test, y_train, y_test = train_test_split(X, y, random_state=1) ? ? ?5 # default split is 75% for training and 25% for testingImportError: cannot import name train_test_split
處理方法:1、我后來重新安裝sklearn包。再一次調(diào)用時(shí)就沒有錯(cuò)誤了。
2、自己寫函數(shù)來認(rèn)為的隨機(jī)構(gòu)造訓(xùn)練集和測(cè)試集。(這個(gè)代碼我會(huì)在最后附上。)
(3)sklearn的線性回歸
[html]?view plain?copy
from?sklearn.linear_model?import?LinearRegression
linreg?=?LinearRegression()
model=linreg.fit(X_train,?y_train)
print?model
print?linreg.intercept_
print?linreg.coef_
輸出的結(jié)果如下:
LinearRegression(copy_X=True, fit_intercept=True, normalize=False)
2.66816623043
[ 0.04641001 ?0.19272538 -0.00349015]
[html]?view plain?copy
#?pair?the?feature?names?with?the?coefficients
zip(feature_cols,?linreg.coef_)
輸出如下:
[('TV', 0.046410010869663267),
('Radio', 0.19272538367491721),
('Newspaper', -0.0034901506098328305)]
y=2.668+0.0464?TV+0.192?Radio-0.00349?Newspaper
如何解釋各個(gè)特征對(duì)應(yīng)的系數(shù)的意義?
對(duì)于給定了Radio和Newspaper的廣告投入,如果在TV廣告上每多投入1個(gè)單位,對(duì)應(yīng)銷量將增加0.0466個(gè)單位。就是加入其它兩個(gè)媒體投入固定,在TV廣告上每增加1000美元(因?yàn)閱挝皇?000美元),銷量將增加46.6(因?yàn)閱挝皇?000)。但是大家注意這里的newspaper的系數(shù)居然是負(fù)數(shù),所以我們可以考慮不使用newspaper這個(gè)特征。這是后話,后面會(huì)提到的。
(4)、預(yù)測(cè)
[python]?view plain?copy
y_pred?=?linreg.predict(X_test)
print?y_pred
[python]?view plain?copy
print?type(y_pred)
輸出結(jié)果如下:
[ 14.58678373 ? 7.92397999 ?16.9497993 ? 19.35791038 ? 7.36360284
7.35359269 ?16.08342325 ? 9.16533046 ?20.35507374 ?12.63160058
22.83356472 ? 9.66291461 ? 4.18055603 ?13.70368584 ?11.4533557
4.16940565 ?10.31271413 ?23.06786868 ?17.80464565 ?14.53070132
15.19656684 ?14.22969609 ? 7.54691167 ?13.47210324 ?15.00625898
19.28532444 ?20.7319878 ? 19.70408833 ?18.21640853 ? 8.50112687
9.8493781 ? ?9.51425763 ? 9.73270043 ?18.13782015 ?15.41731544
5.07416787 ?12.20575251 ?14.05507493 ?10.6699926 ? ?7.16006245
11.80728836 ?24.79748121 ?10.40809168 ?24.05228404 ?18.44737314
20.80572631 ? 9.45424805 ?17.00481708 ? 5.78634105 ? 5.10594849]
type 'numpy.ndarray'
5、回歸問題的評(píng)價(jià)測(cè)度
(1) 評(píng)價(jià)測(cè)度
對(duì)于分類問題,評(píng)價(jià)測(cè)度是準(zhǔn)確率,但這種方法不適用于回歸問題。我們使用針對(duì)連續(xù)數(shù)值的評(píng)價(jià)測(cè)度(evaluation metrics)。
這里介紹3種常用的針對(duì)線性回歸的測(cè)度。
1)平均絕對(duì)誤差(Mean Absolute Error, MAE)
(2)均方誤差(Mean Squared Error, MSE)
(3)均方根誤差(Root Mean Squared Error, RMSE)
這里我使用RMES。
[python]?view plain?copy
pre?name="code"?class="python"#計(jì)算Sales預(yù)測(cè)的RMSE
print?type(y_pred),type(y_test)
print?len(y_pred),len(y_test)
print?y_pred.shape,y_test.shape
from?sklearn?import?metrics
import?numpy?as?np
sum_mean=0
for?i?in?range(len(y_pred)):
sum_mean+=(y_pred[i]-y_test.values[i])**2
sum_erro=np.sqrt(sum_mean/50)
#?calculate?RMSE?by?hand
print?"RMSE?by?hand:",sum_erro
最后的結(jié)果如下:
type 'numpy.ndarray' class 'pandas.core.series.Series'
50 50
(50,) (50,)
RMSE by hand: 1.42998147691
(2)做ROC曲線
[python]?view plain?copy
import?matplotlib.pyplot?as?plt
plt.figure()
plt.plot(range(len(y_pred)),y_pred,'b',label="predict")
plt.plot(range(len(y_pred)),y_test,'r',label="test")
plt.legend(loc="upper?right")?#顯示圖中的標(biāo)簽
plt.xlabel("the?number?of?sales")
plt.ylabel('value?of?sales')
plt.show()
顯示結(jié)果如下:(紅色的線是真實(shí)的值曲線,藍(lán)色的是預(yù)測(cè)值曲線)
直到這里整個(gè)的一次多元線性回歸的預(yù)測(cè)就結(jié)束了。
6、改進(jìn)特征的選擇
在之前展示的數(shù)據(jù)中,我們看到Newspaper和銷量之間的線性關(guān)系竟是負(fù)關(guān)系(不用驚訝,這是隨機(jī)特征抽樣的結(jié)果。換一批抽樣的數(shù)據(jù)就可能為正了),現(xiàn)在我們移除這個(gè)特征,看看線性回歸預(yù)測(cè)的結(jié)果的RMSE如何?
依然使用我上面的代碼,但只需修改下面代碼中的一句即可:
[python]?view plain?copy
#create?a?python?list?of?feature?names
feature_cols?=?['TV',?'Radio',?'Newspaper']
#?use?the?list?to?select?a?subset?of?the?original?DataFrame
X?=?data[feature_cols]
#?equivalent?command?to?do?this?in?one?line
#X?=?data[['TV',?'Radio',?'Newspaper']]#只需修改這里即可pre?name="code"?class="python"?style="font-size:?15px;?line-height:?35px;"X?=?data[['TV',?'Radio']]??#去掉newspaper其他的代碼不變
# print the first 5 rowsprint X.head()# check the type and shape of Xprint type(X)print X.shape
最后的到的系數(shù)與測(cè)度如下:
LinearRegression(copy_X=True, fit_intercept=True, normalize=False)
2.81843904823
[ 0.04588771 ?0.18721008]
RMSE by hand: 1.28208957507
然后再次使用ROC曲線來觀測(cè)曲線的整體情況。我們?cè)趯ewspaper這個(gè)特征移除之后,得到RMSE變小了,說明Newspaper特征可能不適合作為預(yù)測(cè)銷量的特征,于是,我們得到了新的模型。我們還可以通過不同的特征組合得到新的模型,看看最終的誤差是如何的。
備注:
之前我提到了這種錯(cuò)誤:
注:上面的結(jié)果是由train_test_spilit()得到的,但是我不知道為什么我的版本的sklearn包中居然報(bào)錯(cuò):
ImportError ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Traceback (most recent call last)ipython-input-182-3eee51fcba5a in module() ? ? ?1 ###構(gòu)造訓(xùn)練集和測(cè)試集---- 2 from sklearn.cross_validation import train_test_split ? ? ?3 #import sklearn.cross_validation ? ? ?4 X_train,X_test, y_train, y_test = train_test_split(X, y, random_state=1) ? ? ?5 # default split is 75% for training and 25% for testingImportError: cannot import name train_test_split
處理方法:1、我后來重新安裝sklearn包。再一次調(diào)用時(shí)就沒有錯(cuò)誤了。
2、自己寫函數(shù)來認(rèn)為的隨機(jī)構(gòu)造訓(xùn)練集和測(cè)試集。(這個(gè)代碼我會(huì)在最后附上。)
這里我給出我自己寫的函數(shù):
所求參數(shù)是alpha的函數(shù),比如記為f(alpha),?f(alpha)隨alpha的改變的軌跡就是嶺跡。
實(shí)際計(jì)算中可選非常多的alpha值,做出一個(gè)嶺跡圖,看看這個(gè)圖在取哪個(gè)值的時(shí)候變穩(wěn)定了,
那就確定alpha值了,從而確定參數(shù)。
Ridge(alpha=1.0,?fit_intercept=False)
model.fit(x,y)
這樣就等于你算的,因?yàn)槟鉵umpy是用增廣矩陣算的,所以應(yīng)該將set?fit_intercept=False
model.coef_
array([[?1.06059732,??0.48614918,??0.44596739]])
線性回歸:
設(shè)x,y分別為一組數(shù)據(jù),代碼如下
import matplotlib.pyplot as plt
import numpy as np
ro=np.polyfit(x,y,deg=1) #deg為擬合的多項(xiàng)式的次數(shù)(線性回歸就選1)
ry=np.polyval(ro,x) #忘記x和ro哪個(gè)在前哪個(gè)在后了。。。
print ro #輸出的第一個(gè)數(shù)是斜率k,第二個(gè)數(shù)是縱截距b
plt.scatter(x,y)
plt.plot(x,ry)
線性回歸是機(jī)器學(xué)習(xí)算法中最簡(jiǎn)單的算法之一,它是監(jiān)督學(xué)習(xí)的一種算法,主要思想是在給定訓(xùn)練集上學(xué)習(xí)得到一個(gè)線性函數(shù),在損失函數(shù)的約束下,求解相關(guān)系數(shù),最終在測(cè)試集上測(cè)試模型的回歸效果。
也就是說 LinearRegression 模型會(huì)構(gòu)造一個(gè)線性回歸公式
y' = w^T x + b
,其中 w 和 x 均為向量,w 就是系數(shù),截距是 b,得分是根據(jù)真實(shí)的 y 值和預(yù)測(cè)值 y' 計(jì)算得到的。
利用python進(jìn)行線性回歸
理解什么是線性回歸
線性回歸也被稱為最小二乘法回歸(Linear Regression, also called Ordinary Least-Squares (OLS) Regression)。它的數(shù)學(xué)模型是這樣的:
y = a+ b* x+e
其中,a 被稱為常數(shù)項(xiàng)或截距;b 被稱為模型的回歸系數(shù)或斜率;e 為誤差項(xiàng)。a 和 b 是模型的參數(shù)。
當(dāng)然,模型的參數(shù)只能從樣本數(shù)據(jù)中估計(jì)出來:
y'= a' + b'* x
我們的目標(biāo)是選擇合適的參數(shù),讓這一線性模型最好地?cái)M合觀測(cè)值。擬合程度越高,模型越好。
那么,接下來的問題就是,我們?nèi)绾闻袛鄶M合的質(zhì)量呢?
這一線性模型可以用二維平面上的一條直線來表示,被稱為回歸線。
模型的擬合程度越高,也即意味著樣本點(diǎn)圍繞回歸線越緊密。
如何計(jì)算樣本點(diǎn)與回歸線之間的緊密程度呢?
高斯和勒讓德找到的方法是:被選擇的參數(shù),應(yīng)該使算出來的回歸線與觀測(cè)值之差的平房和最小。用函數(shù)表示為:
這被稱為最小二乘法。最小二乘法的原理是這樣的:當(dāng)預(yù)測(cè)值和實(shí)際值距離的平方和最小時(shí),就選定模型中的兩個(gè)參數(shù)(a 和 b)。這一模型并不一定反映解釋變量和反應(yīng)變量真實(shí)的關(guān)系。但它的計(jì)算成本低;相比復(fù)雜模型更容易解釋。
模型估計(jì)出來后,我們要回答的問題是:
我們的模型擬合程度如何?或者說,這個(gè)模型對(duì)因變量的解釋力如何?(R2)
整個(gè)模型是否能顯著預(yù)測(cè)因變量的變化?(F 檢驗(yàn))
每個(gè)自變量是否能顯著預(yù)測(cè)因變量的變化?(t 檢驗(yàn))
首先回答第一個(gè)問題。為了評(píng)估模型的擬合程度如何,我們必須有一個(gè)可以比較的基線模型。
如果讓你預(yù)測(cè)一個(gè)人的體重是多少?在沒有任何額外信息的情況下,你可能會(huì)用平均值來預(yù)測(cè),盡管會(huì)存在一定誤差,但總比瞎猜好。
現(xiàn)在,如果你知道他的身高信息,你的預(yù)測(cè)值肯定與平均值不一樣。額外信息相比平均值更能準(zhǔn)確地預(yù)測(cè)被預(yù)測(cè)的變量的能力,就代表模型的解釋力大小。
上圖中,SSA 代表由自變量 x 引起的 y 的離差平方和,即回歸平方和,代表回歸模型的解釋力;SSE 代表由隨機(jī)因素引起的 y 的離差平方和,即剩余平方和,代表回歸模型未能解釋的部分;SST 為總的離差平方和,即我們僅憑 y 的平均值去估計(jì) y 時(shí)所產(chǎn)生的誤差。
用模型能夠解釋的變異除以總的變異就是模型的擬合程度:
R2=SSA/SST=1-SSE
R2(R 的平方)也被稱為決定系數(shù)或判定系數(shù)。
第二個(gè)問題,我們的模型是否顯著預(yù)測(cè)了 y 的變化?
假設(shè) y 與 x 的線性關(guān)系不明顯,那么 SSA 相對(duì) SSE 占有較大的比例的概率則越小。換句話說,在 y 與 x 無線性關(guān)系的前提下,SSA 相對(duì) SSE 的占比越高的概率是越小的,這會(huì)呈現(xiàn)一定的概率分布。統(tǒng)計(jì)學(xué)家告訴我們它滿足 F 分布,就像這樣:
如果 SSA 相對(duì) SSE 占比較大的情況出現(xiàn)了,比如根據(jù) F 分布,這個(gè)值出現(xiàn)的概率小于 5%。那么,我們最好是拒絕 y 與 x 線性關(guān)系不顯著的原始假設(shè),認(rèn)為二者存在顯著的線性關(guān)系較為合適。
第三個(gè)問題,每個(gè)自變量是否能顯著預(yù)測(cè)因變量的變化?換句話說,回歸系數(shù)是否顯著?
回歸系數(shù)的顯著性檢驗(yàn)是圍繞回歸系數(shù)的抽樣分布(t 分布)來進(jìn)行的,推斷過程類似于整個(gè)模型的檢驗(yàn)過程,不贅言。
實(shí)際上,對(duì)于只有一個(gè)自變量的一元線性模型,模型的顯著性檢驗(yàn)和回歸系數(shù)的檢驗(yàn)是一致的,但對(duì)于多元線性模型來說,二者就不能等價(jià)了。
利用 statsmodels 進(jìn)行最小二乘回歸
#導(dǎo)入相應(yīng)模塊
In [1]: import numpy as np
In [2]: import pandas as pd
In [3]: import statsmodels.api as sm
#將數(shù)據(jù)導(dǎo)入 pandas 的 dataframe 對(duì)象,第一列(年份)作為行標(biāo)簽
In [4]: df=pd.read_csv('/Users/xiangzhendong/Downloads/vincentarelbundock-Rdatasets-1218370/csv/datasets/longley.csv', index_col=0)
#查看頭部數(shù)據(jù)
In [5]: df.head()
Out[5]:
GNP.deflator ? ? ?GNP ?Unemployed ?Armed.Forces ?Population ?Year ?\
1947 ? ? ? ? ?83.0 ?234.289 ? ? ? 235.6 ? ? ? ? 159.0 ? ? 107.608 ?1947
1948 ? ? ? ? ?88.5 ?259.426 ? ? ? 232.5 ? ? ? ? 145.6 ? ? 108.632 ?1948
1949 ? ? ? ? ?88.2 ?258.054 ? ? ? 368.2 ? ? ? ? 161.6 ? ? 109.773 ?1949
1950 ? ? ? ? ?89.5 ?284.599 ? ? ? 335.1 ? ? ? ? 165.0 ? ? 110.929 ?1950
1951 ? ? ? ? ?96.2 ?328.975 ? ? ? 209.9 ? ? ? ? 309.9 ? ? 112.075 ?1951
Employed
1947 ? ?60.323
1948 ? ?61.122
1949 ? ?60.171
1950 ? ?61.187
1951 ? ?63.221
#設(shè)置預(yù)測(cè)變量和結(jié)果變量,用 GNP 預(yù)測(cè) Employed
In [6]: y=df.Employed #結(jié)果變量
In [7]: X=df.GNP #預(yù)測(cè)變量
#為模型增加常數(shù)項(xiàng),即回歸線在 y 軸上的截距
In [8]: X=sm.add_constant(X)
#執(zhí)行最小二乘回歸,X 可以是 numpy array 或 pandas dataframe(行數(shù)等于數(shù)據(jù)點(diǎn)個(gè)數(shù),列數(shù)為預(yù)測(cè)變量個(gè)數(shù)),y 可以是一維數(shù)組(numpy array)或 pandas series
In [10]: est=sm.OLS(y,X)
使用 OLS 對(duì)象的 fit() 方法來進(jìn)行模型擬合
In [11]: est=est.fit()
#查看模型擬合的結(jié)果
In [12]: est.summary()
Out[12]:
#查看最終模型的參數(shù)
In [13]: est.params
Out[13]:
const ? ?51.843590
GNP ? ? ? 0.034752
dtype: float64
#選擇 100 個(gè)從最小值到最大值平均分布(equally spaced)的數(shù)據(jù)點(diǎn)
In [14]: X_prime=np.linspace(X.GNP.min(), X.GNP.max(),100)[:,np.newaxis]
In [15]: X_prime=sm.add_constant(X_prime)
#計(jì)算預(yù)測(cè)值
In [16]: y_hat=est.predict(X_prime)
In [17]: plt.scatter(X.GNP, y, alpha=0.3) #畫出原始數(shù)據(jù)
#分別給 x 軸和 y 軸命名
In [18]: plt.xlabel("Gross National Product")
In [19]: plt.ylabel("Total Employment")
In [20]: plt.plot(X_prime[:,1], y_hat, 'r', alpha=0.9) #添加回歸線,紅色
多元線性回歸(預(yù)測(cè)變量不止一個(gè))
我們用一條直線來描述一元線性模型中預(yù)測(cè)變量和結(jié)果變量的關(guān)系,而在多元回歸中,我們將用一個(gè)多維(p)空間來擬合多個(gè)預(yù)測(cè)變量。下面表現(xiàn)了兩個(gè)預(yù)測(cè)變量的三維圖形:商品的銷量以及在電視和廣播兩種不同媒介的廣告預(yù)算。
數(shù)學(xué)模型是:
Sales = beta_0 + beta_1*TV + beta_2*Radio
圖中,白色的數(shù)據(jù)點(diǎn)是平面上的點(diǎn),黑色的數(shù)據(jù)點(diǎn)事平面下的點(diǎn)。平面的顏色是由對(duì)應(yīng)的商品銷量的高低決定的,高是紅色,低是藍(lán)色。
利用 statsmodels 進(jìn)行多元線性回歸
In [1]: import pandas as pd
In [2]: import numpy as np
In [3]: import statsmodels.api as sm
In [4]: df_adv=pd.read_csv('g.csv',index_col=0)
In [6]: X=df_adv[['TV','Radio']]
In [7]: y=df_adv['Sales']
In [8]: df_adv.head()
Out[8]:
TV ?Radio ?Newspaper ?Sales
1 ?230.1 ? 37.8 ? ? ? 69.2 ? 22.1
2 ? 44.5 ? 39.3 ? ? ? 45.1 ? 10.4
3 ? 17.2 ? 45.9 ? ? ? 69.3 ? ?9.3
4 ?151.5 ? 41.3 ? ? ? 58.5 ? 18.5
5 ?180.8 ? 10.8 ? ? ? 58.4 ? 12.9
In [9]: X=sm.add_constant(X)
In [10]: est=sm.OLS(y,X).fit()
In [11]: est.summary()
Out[11]:
你也可以使用 statsmodels 的 formula 模塊來建立多元回歸模型
In [12]: import statsmodels.formula.api as smf
In [13]: est=smf.ols(formula='Sales ~ TV + Radio',data=df_adv).fit()
處理分類變量
性別或地域都屬于分類變量。
In [15]: df= pd.read_csv('httd.edu/~tibs/ElemStatLearn/datasets/SAheart.data', index_col=0)
In [16]: X=df.copy()
利用 dataframe 的 pop 方法將 chd 列單獨(dú)提取出來
In [17]: y=X.pop('chd')
In [18]: df.head()
Out[18]:
sbp ?tobacco ? ldl ?adiposity ?famhist ?typea ?obesity ?alcohol ?\
row.names
1 ? ? ? ? ?160 ? ?12.00 ?5.73 ? ? ?23.11 ?Present ? ? 49 ? ?25.30 ? ?97.20
2 ? ? ? ? ?144 ? ? 0.01 ?4.41 ? ? ?28.61 ? Absent ? ? 55 ? ?28.87 ? ? 2.06
3 ? ? ? ? ?118 ? ? 0.08 ?3.48 ? ? ?32.28 ?Present ? ? 52 ? ?29.14 ? ? 3.81
4 ? ? ? ? ?170 ? ? 7.50 ?6.41 ? ? ?38.03 ?Present ? ? 51 ? ?31.99 ? ?24.26
5 ? ? ? ? ?134 ? ?13.60 ?3.50 ? ? ?27.78 ?Present ? ? 60 ? ?25.99 ? ?57.34
age ?chd
row.names
1 ? ? ? ? ? 52 ? ?1
2 ? ? ? ? ? 63 ? ?1
3 ? ? ? ? ? 46 ? ?0
4 ? ? ? ? ? 58 ? ?1
5 ? ? ? ? ? 49 ? ?1
In [19]: y.groupby(X.famhist).mean()
Out[19]:
famhist
Absent ? ? 0.237037
Present ? ?0.500000
Name: chd, dtype: float64
In [20]: import statsmodels.formula.api as smf
In [21]: df['famhist_ord']=pd.Categorical(df.famhist).labels
In [22]: est=smf.ols(formula="chd ~ famhist_ord", data=df).fit()
分類變量的編碼方式有許多,其中一種編碼方式是虛擬變量編碼(dummy-encoding),就是把一個(gè) k 個(gè)水平的分類變量編碼成 k-1 個(gè)二分變量。在 statsmodels 中使用 C 函數(shù)實(shí)現(xiàn)。
In [24]: est=smf.ols(formula="chd ~ C(famhist)", data=df).fit()
In [26]: est.summary()
Out[26]:
處理交互作用
隨著教育年限(education)的增長(zhǎng),薪酬 (wage) 會(huì)增加嗎?這種影響對(duì)男性和女性而言是一樣的嗎?
這里的問題就涉及性別與教育年限的交互作用。
換言之,教育年限對(duì)薪酬的影響是男女有別的。
#導(dǎo)入相關(guān)模塊
In [1]: import pandas as pd
In [2]: import numpy as np
In [4]: import statsmodels.api as sm
#導(dǎo)入數(shù)據(jù),存入 dataframe 對(duì)象
In [5]: df=pd.read_csv('/Users/xiangzhendong/Downloads/pydatafromweb/wages.csv')
In [6]: df[['Wage','Education','Sex']].tail()
Out[6]:
Wage ?Education ?Sex
529 ?11.36 ? ? ? ? 18 ? ?0
530 ? 6.10 ? ? ? ? 12 ? ?1
531 ?23.25 ? ? ? ? 17 ? ?1
532 ?19.88 ? ? ? ? 12 ? ?0
533 ?15.38 ? ? ? ? 16 ? ?0
由于性別是一個(gè)二分變量,我們可以繪制兩條回歸線,一條是 sex=0(男性),一條是 sex=1(女性)
#繪制散點(diǎn)圖
In [7]: plt.scatter(df.Education,df.Wage, alpha=0.3)
In [9]: plt.xlabel('education')
In [10]: plt.ylabel('wage')
#linspace 的作用是生成從最小到最大的均勻分布的 n 個(gè)數(shù)
In [17]: education_linspace=np.linspace(df.Education.min(), df.Education.max(),100)
In [12]: import statsmodels.formula.api as smf
In [13]: est=smf.ols(formula='Wage ~ Education + Sex', data=df).fit()
In [18]: plt.plot(education_linspace, est.params[0]+est.params[1]education_linspace+est.params[2]0, 'r')
In [19]: plt.plot(education_linspace, est.params[0]+est.params[1]education_linspace+est.params[2]1, 'g')
以上兩條線是平行的。這是因?yàn)榉诸愖兞恐挥绊懟貧w線的截距,不影響斜率。
接下來我們可以為回歸模型增加交互項(xiàng)來探索交互效應(yīng)。也就是說,對(duì)于兩個(gè)類別,回歸線的斜率是不一樣的。
In [32]: plt.scatter(df.Education,df.Wage, alpha=0.3)
In [33]: plt.xlabel('education')
In [34]: plt.ylabel('wage')
#使用*代表我們的回歸模型中除了交互效應(yīng),也包括兩個(gè)變量的主效應(yīng);如果只想看交互效應(yīng),可以用:代替,但通常不會(huì)只看交互效應(yīng)
In [35]: est=smf.ols(formula='Wage ~ Sex*Education', data=df).fit()
In [36]: plt.plot(education_linspace, est.params[0]+est.params[1]0+est.params[2]education_linspace+est.params[3]0education_linspace, 'r')
In [37]: plt.plot(education_linspace, est.params[0]+est.params[1]1+est.params[2]education_linspace+est.params[3]1education_linspace, 'g')
參考資料:
DataRobot | Ordinary Least Squares in Python
DataRoboe | Multiple Regression using Statsmodels
AnalyticsVidhya | 7 Types of Regression Techniques you should know!
網(wǎng)站名稱:python回歸線函數(shù),python回歸算法有哪些
鏈接分享:http://chinadenli.net/article7/dsejgoj.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、域名注冊(cè)、定制開發(fā)、軟件開發(fā)、外貿(mào)網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)