真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

python逐步回歸函數(shù),Python做回歸

Python的函數(shù)都有哪些

【常見(jiàn)的內(nèi)置函數(shù)】

創(chuàng)新互聯(lián)公司自2013年創(chuàng)立以來(lái),是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目做網(wǎng)站、網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元江北做網(wǎng)站,已為上家服務(wù),為江北各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18982081108

1、enumerate(iterable,start=0)

是python的內(nèi)置函數(shù),是枚舉、列舉的意思,對(duì)于一個(gè)可迭代的(iterable)/可遍歷的對(duì)象(如列表、字符串),enumerate將其組成一個(gè)索引序列,利用它可以同時(shí)獲得索引和值。

2、zip(*iterables,strict=False)

用于將可迭代的對(duì)象作為參數(shù),將對(duì)象中對(duì)應(yīng)的元素打包成一個(gè)個(gè)元組,然后返回由這些元組組成的列表。如果各個(gè)迭代器的元素個(gè)數(shù)不一致,則返回列表長(zhǎng)度與最短的對(duì)象相同,利用*號(hào)操作符,可以將元組解壓為列表。

3、filter(function,iterable)

filter是將一個(gè)序列進(jìn)行過(guò)濾,返回迭代器的對(duì)象,去除不滿足條件的序列。

4、isinstance(object,classinfo)

是用來(lái)判斷某一個(gè)變量或者是對(duì)象是不是屬于某種類型的一個(gè)函數(shù),如果參數(shù)object是classinfo的實(shí)例,或者object是classinfo類的子類的一個(gè)實(shí)例,

返回True。如果object不是一個(gè)給定類型的的對(duì)象, 則返回結(jié)果總是False

5、eval(expression[,globals[,locals]])

用來(lái)將字符串str當(dāng)成有效的表達(dá)式來(lái)求值并返回計(jì)算結(jié)果,表達(dá)式解析參數(shù)expression并作為Python表達(dá)式進(jìn)行求值(從技術(shù)上說(shuō)是一個(gè)條件列表),采用globals和locals字典作為全局和局部命名空間。

【常用的句式】

1、format字符串格式化

format把字符串當(dāng)成一個(gè)模板,通過(guò)傳入的參數(shù)進(jìn)行格式化,非常實(shí)用且強(qiáng)大。

2、連接字符串

常使用+連接兩個(gè)字符串。

3、if...else條件語(yǔ)句

Python條件語(yǔ)句是通過(guò)一條或多條語(yǔ)句的執(zhí)行結(jié)果(True或者False)來(lái)決定執(zhí)行的代碼塊。其中if...else語(yǔ)句用來(lái)執(zhí)行需要判斷的情形。

4、for...in、while循環(huán)語(yǔ)句

循環(huán)語(yǔ)句就是遍歷一個(gè)序列,循環(huán)去執(zhí)行某個(gè)操作,Python中的循環(huán)語(yǔ)句有for和while。

5、import導(dǎo)入其他腳本的功能

有時(shí)需要使用另一個(gè)python文件中的腳本,這其實(shí)很簡(jiǎn)單,就像使用import關(guān)鍵字導(dǎo)入任何模塊一樣。

請(qǐng)教怎樣用Python做stepwise回歸

所說(shuō)所有的變量都是對(duì)象。 對(duì)象在python里,其實(shí)是一個(gè)指針,指向一個(gè)數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu)里有屬性,有方法。

對(duì)象通常就是指變量。從面向?qū)ο驩O的概念來(lái)講,對(duì)象是類的一個(gè)實(shí)例。在python里很簡(jiǎn)單,對(duì)象就是變量。

class A:

myname="class a"

上面就是一個(gè)類。不是對(duì)象

a=A()

這里變量a就是一個(gè)對(duì)象。

它有一個(gè)屬性(類屬性),myname,你可以顯示出來(lái)

print a.myname

所以,你看到一個(gè)變量后面跟點(diǎn)一個(gè)小數(shù)點(diǎn)。那么小數(shù)點(diǎn)后面。

如何用python作空間自回歸模型

基本形式

線性模型(linear model)就是試圖通過(guò)屬性的線性組合來(lái)進(jìn)行預(yù)測(cè)的函數(shù),基本形式如下:

f(x)=wTx+b

許多非線性模型可在線性模型的基礎(chǔ)上通過(guò)引入層結(jié)構(gòu)或者高維映射(比如核方法)來(lái)解決。線性模型有很好的解釋性。

線性回歸

線性回歸要求均方誤差最小:

(w?,b?)=argmin∑i=1m(f(xi)?yi)2

均方誤差有很好的幾何意義,它對(duì)應(yīng)了常用的歐式距離(Euclidean distance)。基于均方誤差最小化來(lái)進(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

python多元線性回歸怎么計(jì)算

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來(lái)讀取數(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è)案例中,我們通過(guò)不同的廣告投入,預(yù)測(cè)產(chǎn)品銷量。因?yàn)轫憫?yīng)變量是一個(gè)連續(xù)的值,所以這個(gè)問(wèn)題是一個(gè)回歸問(wèn)題。數(shù)據(jù)集一共有200個(gè)觀測(cè)值,每一組觀測(cè)對(duì)應(yīng)一個(gè)市場(chǎng)的情況。

注意:這里推薦使用的是seaborn包。網(wǎng)上說(shuō)這個(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()#注意必須加上這一句,否則無(wú)法顯示。

[html]?view plain?copy

這里選擇TV、Radio、Newspaper?作為特征,Sales作為觀測(cè)值

[html]?view plain?copy

返回的結(jié)果:

seaborn的pairplot函數(shù)繪制X的每一維度和對(duì)應(yīng)Y的散點(diǎn)圖。通過(guò)設(shè)置size和aspect參數(shù)來(lái)調(diào)節(jié)顯示的大小和比例??梢詮膱D中看出,TV特征和銷量是有比較強(qiáng)的線性關(guān)系的,而Radio和Sales線性關(guān)系弱一些,Newspaper和Sales線性關(guān)系更弱。通過(guò)加入一個(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):快速;沒(méi)有調(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來(lái)構(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、我后來(lái)重新安裝sklearn包。再一次調(diào)用時(shí)就沒(méi)有錯(cuò)誤了。

2、自己寫函數(shù)來(lái)認(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、回歸問(wèn)題的評(píng)價(jià)測(cè)度

(1) 評(píng)價(jià)測(cè)度

對(duì)于分類問(wèn)題,評(píng)價(jià)測(cè)度是準(zhǔn)確率,但這種方法不適用于回歸問(wè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曲線來(lái)觀測(cè)曲線的整體情況。我們?cè)趯ewspaper這個(gè)特征移除之后,得到RMSE變小了,說(shuō)明Newspaper特征可能不適合作為預(yù)測(cè)銷量的特征,于是,我們得到了新的模型。我們還可以通過(guò)不同的特征組合得到新的模型,看看最終的誤差是如何的。

備注:

之前我提到了這種錯(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、我后來(lái)重新安裝sklearn包。再一次調(diào)用時(shí)就沒(méi)有錯(cuò)誤了。

2、自己寫函數(shù)來(lái)認(rèn)為的隨機(jī)構(gòu)造訓(xùn)練集和測(cè)試集。(這個(gè)代碼我會(huì)在最后附上。)

這里我給出我自己寫的函數(shù):

python函數(shù)有哪些

1、print()函數(shù):打印字符串;

2、raw_input()函數(shù):從用戶鍵盤捕獲字符;

3、len()函數(shù):計(jì)算字符長(zhǎng)度;

4、format()函數(shù):實(shí)現(xiàn)格式化輸出;

5、type()函數(shù):查詢對(duì)象的類型;

6、int()函數(shù)、float()函數(shù)、str()函數(shù)等:類型的轉(zhuǎn)化函數(shù);

7、id()函數(shù):獲取對(duì)象的內(nèi)存地址;

8、help()函數(shù):Python的幫助函數(shù);

9、s.islower()函數(shù):判斷字符小寫;

10、s.sppace()函數(shù):判斷是否為空格;

11、str.replace()函數(shù):替換字符;

12、import()函數(shù):引進(jìn)庫(kù);

13、math.sin()函數(shù):sin()函數(shù);

14、math.pow()函數(shù):計(jì)算次方函數(shù);

15、os.getcwd()函數(shù):獲取當(dāng)前工作目錄;

16、listdir()函數(shù):顯示當(dāng)前目錄下的文件;

17、time.sleep()函數(shù):停止一段時(shí)間;

18、random.randint()函數(shù):產(chǎn)生隨機(jī)數(shù);

19、range()函數(shù):返回一個(gè)列表,打印從1到100;

20、file.read()函數(shù):讀取文件返回字符串;

21、file.readlines()函數(shù):讀取文件返回列表;

22、file.readline()函數(shù):讀取一行文件并返回字符串;

23、split()函數(shù):用什么來(lái)間隔字符串;

24、isalnum()函數(shù):判斷是否為有效數(shù)字或字符;

25、isalpha()函數(shù):判斷是否全為字符;

26、isdigit()函數(shù):判斷是否全為數(shù)字;

27、 lower()函數(shù):將數(shù)據(jù)改成小寫;

28、upper()函數(shù):將數(shù)據(jù)改成大寫;

29、startswith(s)函數(shù):判斷字符串是否以s開始的;

30、endwith(s)函數(shù):判斷字符串是否以s結(jié)尾的;

31、file.write()函數(shù):寫入函數(shù);

32、file.writeline()函數(shù):寫入文件;

33、abs()函數(shù):得到某數(shù)的絕對(duì)值;

34、file.sort()函數(shù):對(duì)書數(shù)據(jù)排序;

35、tuple()函數(shù):創(chuàng)建一個(gè)元組;

36、find()函數(shù):查找 返回的是索引;

37、dict()函數(shù):創(chuàng)建字典;

38、clear()函數(shù):清楚字典中的所有項(xiàng);

39、copy()函數(shù):復(fù)制一個(gè)字典,會(huì)修改所有的字典;

40、 get()函數(shù):查詢字典中的元素。

…………

如何用python實(shí)現(xiàn)含有虛擬自變量的回歸

利用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ì)出來(lái):

y'= a' + b'* x

我們的目標(biāo)是選擇合適的參數(shù),讓這一線性模型最好地?cái)M合觀測(cè)值。擬合程度越高,模型越好。

那么,接下來(lái)的問(wèn)題就是,我們?nèi)绾闻袛鄶M合的質(zhì)量呢?

這一線性模型可以用二維平面上的一條直線來(lái)表示,被稱為回歸線。

模型的擬合程度越高,也即意味著樣本點(diǎn)圍繞回歸線越緊密。

如何計(jì)算樣本點(diǎn)與回歸線之間的緊密程度呢?

高斯和勒讓德找到的方法是:被選擇的參數(shù),應(yīng)該使算出來(lái)的回歸線與觀測(cè)值之差的平房和最小。用函數(shù)表示為:

這被稱為最小二乘法。最小二乘法的原理是這樣的:當(dāng)預(yù)測(cè)值和實(shí)際值距離的平方和最小時(shí),就選定模型中的兩個(gè)參數(shù)(a 和 b)。這一模型并不一定反映解釋變量和反應(yīng)變量真實(shí)的關(guān)系。但它的計(jì)算成本低;相比復(fù)雜模型更容易解釋。

模型估計(jì)出來(lái)后,我們要回答的問(wèn)題是:

我們的模型擬合程度如何?或者說(shuō),這個(gè)模型對(duì)因變量的解釋力如何?(R2)

整個(gè)模型是否能顯著預(yù)測(cè)因變量的變化?(F 檢驗(yàn))

每個(gè)自變量是否能顯著預(yù)測(cè)因變量的變化?(t 檢驗(yàn))

首先回答第一個(gè)問(wèn)題。為了評(píng)估模型的擬合程度如何,我們必須有一個(gè)可以比較的基線模型。

如果讓你預(yù)測(cè)一個(gè)人的體重是多少?在沒(méi)有任何額外信息的情況下,你可能會(huì)用平均值來(lái)預(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è)問(wèn)題,我們的模型是否顯著預(yù)測(cè)了 y 的變化?

假設(shè) y 與 x 的線性關(guān)系不明顯,那么 SSA 相對(duì) SSE 占有較大的比例的概率則越小。換句話說(shuō),在 y 與 x 無(wú)線性關(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è)問(wèn)題,每個(gè)自變量是否能顯著預(yù)測(cè)因變量的變化?換句話說(shuō),回歸系數(shù)是否顯著?

回歸系數(shù)的顯著性檢驗(yàn)是圍繞回歸系數(shù)的抽樣分布(t 分布)來(lái)進(jìn)行的,推斷過(guò)程類似于整個(gè)模型的檢驗(yàn)過(guò)程,不贅言。

實(shí)際上,對(duì)于只有一個(gè)自變量的一元線性模型,模型的顯著性檢驗(yàn)和回歸系數(shù)的檢驗(yàn)是一致的,但對(duì)于多元線性模型來(lái)說(shuō),二者就不能等價(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() 方法來(lái)進(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è))

我們用一條直線來(lái)描述一元線性模型中預(yù)測(cè)變量和結(jié)果變量的關(guān)系,而在多元回歸中,我們將用一個(gè)多維(p)空間來(lái)擬合多個(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 模塊來(lái)建立多元回歸模型

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ú)提取出來(lái)

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ì)男性和女性而言是一樣的嗎?

這里的問(wèn)題就涉及性別與教育年限的交互作用。

換言之,教育年限對(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線的截距,不影響斜率。

接下來(lái)我們可以為回歸模型增加交互項(xiàng)來(lái)探索交互效應(yīng)。也就是說(shuō),對(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!


標(biāo)題名稱:python逐步回歸函數(shù),Python做回歸
當(dāng)前路徑:http://weahome.cn/article/hsjjgh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部