中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

python中的回歸函數(shù),python求回歸方程

python線性回歸有哪些方法

線性回歸:

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名注冊(cè)虛擬主機(jī)、營銷軟件、網(wǎng)站建設(shè)、雞西梨樹網(wǎng)站維護(hù)、網(wǎng)站推廣。

設(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)

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來讀取數(shù)據(jù)

pandas 是一個(gè)用于數(shù)據(jù)探索、數(shù)據(jù)分析和數(shù)據(jù)處理的python庫

[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ù)庫某個(gè)表中的第一列類似。

(200,4)?

3、分析數(shù)據(jù)

特征:

TV:對(duì)于一個(gè)給定市場中單一產(chǎn)品,用于電視上的廣告費(fèi)用(以千為單位)

Radio:在廣播媒體上投資的廣告費(fèi)用

Newspaper:用于報(bào)紙媒體的廣告費(fèi)用

響應(yīng):

Sales:對(duì)應(yīng)產(chǎn)品的銷量

在這個(gè)案例中,我們通過不同的廣告投入,預(yù)測產(chǎn)品銷量。因?yàn)轫憫?yīng)變量是一個(gè)連續(xù)的值,所以這個(gè)問題是一個(gè)回歸問題。數(shù)據(jù)集一共有200個(gè)觀測值,每一組觀測對(duì)應(yīng)一個(gè)市場的情況。

注意:這里推薦使用的是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作為觀測值

[html]?view plain?copy

返回的結(jié)果:

seaborn的pairplot函數(shù)繪制X的每一維度和對(duì)應(yīng)Y的散點(diǎn)圖。通過設(shè)置size和aspect參數(shù)來調(diào)節(jié)顯示的大小和比例??梢詮膱D中看出,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ù)測準(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)練集與測試集

[html]?view plain?copy

pre?name="code"?class="python"span?style="font-size:14px;"##構(gòu)造訓(xùn)練集和測試集

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)練集和測試集---- 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)練集和測試集。(這個(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ù)測

[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à)測度

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

對(duì)于分類問題,評(píng)價(jià)測度是準(zhǔn)確率,但這種方法不適用于回歸問題。我們使用針對(duì)連續(xù)數(shù)值的評(píng)價(jià)測度(evaluation metrics)。

這里介紹3種常用的針對(duì)線性回歸的測度。

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ù)測的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ù)測值曲線)

直到這里整個(gè)的一次多元線性回歸的預(yù)測就結(jié)束了。

6、改進(jìn)特征的選擇

在之前展示的數(shù)據(jù)中,我們看到Newspaper和銷量之間的線性關(guān)系竟是負(fù)關(guān)系(不用驚訝,這是隨機(jī)特征抽樣的結(jié)果。換一批抽樣的數(shù)據(jù)就可能為正了),現(xiàn)在我們移除這個(gè)特征,看看線性回歸預(yù)測的結(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ù)與測度如下:

LinearRegression(copy_X=True, fit_intercept=True, normalize=False)

2.81843904823

[ 0.04588771 ?0.18721008]

RMSE by hand: 1.28208957507

然后再次使用ROC曲線來觀測曲線的整體情況。我們?cè)趯ewspaper這個(gè)特征移除之后,得到RMSE變小了,說明Newspaper特征可能不適合作為預(yù)測銷量的特征,于是,我們得到了新的模型。我們還可以通過不同的特征組合得到新的模型,看看最終的誤差是如何的。

備注:

之前我提到了這種錯(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)練集和測試集---- 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)練集和測試集。(這個(gè)代碼我會(huì)在最后附上。)

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

python 嶺回歸

所求參數(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]])

當(dāng)前名稱:python中的回歸函數(shù),python求回歸方程
當(dāng)前網(wǎng)址:http://www.rwnh.cn/article48/dssdshp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)全網(wǎng)營銷推廣、企業(yè)建站外貿(mào)建站ChatGPT、搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計(jì)
从化市| 萨嘎县| 茌平县| 无为县| 大荔县| 潮州市| 肥东县| 中江县| 凉山| 克拉玛依市| 张家口市| 依安县| 文山县| 清苑县| 会宁县| 湘潭市| 南汇区| 宁阳县| 沙洋县| 祁东县| 长武县| 台安县| 罗山县| 罗定市| 资阳市| 临城县| 永定县| 紫云| 临猗县| 清水县| 十堰市| 天台县| 斗六市| 滦平县| 怀化市| 永安市| 闽侯县| 屏山县| 扬州市| 凤庆县| 拉孜县|