Ⅰ python裡面多元非線性回歸有哪些方法
SciPy 裡面的子函數庫optimize, 一般情況下可用curve_fit函數直接擬合或者leastsq做最小二乘
Ⅱ python多元線性回歸怎麼計算
1、什麼是多元線性回歸模型?
當y值的影響因素不唯一時,採用多元線性回歸模型。
y =y=β0+β1x1+β2x2+...+βnxn
例如商品的銷售額可能不電視廣告投入,收音機廣告投入,報紙廣告投入有關系,可以有 sales =β0+β1*TV+β2* radio+β3*newspaper.
2、使用pandas來讀取數據
pandas 是一個用於數據探索、數據分析和數據處理的python庫
[python]view plain
importpandasaspd
[html]view plain
<prename="code"class="python">#
data=pd.read_csv('/home/lulei/Advertising.csv')
#displaythefirst5rows
data.head()
上面代碼的運行結果:
上面顯示的結果類似一個電子表格,這個結構稱為Pandas的數據幀(data frame),類型全稱:pandas.core.frame.DataFrame.
pandas的兩個主要數據結構:Series和DataFrame:
Series類似於一維數組,它有一組數據以及一組與之相關的數據標簽(即索引)組成。
DataFrame是一個表格型的數據結構,它含有一組有序的列,每列可以是不同的值類型。DataFrame既有行索引也有列索引,它可以被看做由Series組成的字典。
[python]view plain
#displaythelast5rows
data.tail()
只顯示結果的末尾5行
[html]view plain
#checktheshapeoftheDataFrame(rows,colums)
data.shape
查看DataFrame的形狀,注意第一列的叫索引,和資料庫某個表中的第一列類似。
(200,4)
3、分析數據
特徵:
TV:對於一個給定市場中單一產品,用於電視上的廣告費用(以千為單位)
Radio:在廣播媒體上投資的廣告費用
Newspaper:用於報紙媒體的廣告費用
響應:
Sales:對應產品的銷量
在這個案例中,我們通過不同的廣告投入,預測產品銷量。因為響應變數是一個連續的值,所以這個問題是一個回歸問題。數據集一共有200個觀測值,每一組觀測對應一個市場的情況。
注意:這里推薦使用的是seaborn包。網上說這個包的數據可視化效果比較好看。其實seaborn也應該屬於matplotlib的內部包。只是需要再次的單獨安裝。
[python]view plain
importseabornassns
importmatplotlib.pyplotasplt
#ots
sns.pairplot(data,x_vars=['TV','Radio','Newspaper'],y_vars='Sales',size=7,aspect=0.8)
plt.show()#注意必須加上這一句,否則無法顯示。
[html]view plain
這里選擇TV、Radio、Newspaper作為特徵,Sales作為觀測值
[html]view plain
返回的結果:
[python]view plain
sns.pairplot(data,x_vars=['TV','Radio','Newspaper'],y_vars='Sales',size=7,aspect=0.8,kind='reg')
plt.show()
結果顯示如下:
4、線性回歸模型
優點:快速;沒有調節參數;可輕易解釋;可理解。
缺點:相比其他復雜一些的模型,其預測准確率不是太高,因為它假設特徵和響應之間存在確定的線性關系,這種假設對於非線性的關系,線性回歸模型顯然不能很好的對這種數據建模。
線性模型表達式:y=β0+β1x1+β2x2+...+βnxn其中
y是響應
β0是截距
β1是x1的系數,以此類推
在這個案例中:y=β0+β1∗TV+β2∗Radio+...+βn∗Newspaper
(1)、使用pandas來構建X(特徵向量)和y(標簽列)
scikit-learn要求X是一個特徵矩陣,y是一個NumPy向量。
pandas構建在NumPy之上。
因此,X可以是pandas的DataFrame,y可以是pandas的Series,scikit-learn可以理解這種結構。
[python]view plain
#
feature_cols=['TV','Radio','Newspaper']
#
X=data[feature_cols]
#
X=data[['TV','Radio','Newspaper']]
#printthefirst5rows
printX.head()
#checkthetypeandshapeofX
printtype(X)
printX.shape
輸出結果如下:
[python]view plain
#selectaSeriesfromtheDataFrame
y=data['Sales']
#
y=data.Sales
#printthefirst5values
printy.head()
輸出的結果如下:
(2)、構建訓練集與測試集
[html]view plain
<prename="code"class="python"><spanstyle="font-size:14px;">##構造訓練集和測試集
fromsklearn.cross_validationimporttrain_test_split#這里是引用了交叉驗證
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
printX_train.shape
printy_train.shape
printX_test.shape
printy_test.shape
輸出結果如下:
註:上面的結果是由train_test_spilit()得到的,但是我不知道為什麼我的版本的sklearn包中居然報錯:
處理方法:1、我後來重新安裝sklearn包。再一次調用時就沒有錯誤了。
2、自己寫函數來認為的隨機構造訓練集和測試集。(這個代碼我會在最後附上。)
(3)sklearn的線性回歸
[html]view plain
fromsklearn.linear_modelimportLinearRegression
linreg=LinearRegression()
model=linreg.fit(X_train,y_train)
printmodel
printlinreg.intercept_
printlinreg.coef_
輸出的結果如下:
[html]view plain
#
zip(feature_cols,linreg.coef_)
輸出如下:
y=2.668+0.0464∗TV+0.192∗Radio-0.00349∗Newspaper
如何解釋各個特徵對應的系數的意義?
對於給定了Radio和Newspaper的廣告投入,如果在TV廣告上每多投入1個單位,對應銷量將增加0.0466個單位。就是加入其它兩個媒體投入固定,在TV廣告上每增加1000美元(因為單位是1000美元),銷量將增加46.6(因為單位是1000)。但是大家注意這里的newspaper的系數居然是負數,所以我們可以考慮不使用newspaper這個特徵。這是後話,後面會提到的。
(4)、預測
[python]view plain
y_pred=linreg.predict(X_test)
printy_pred
[python]view plain
printtype(y_pred)
輸出結果如下:
5、回歸問題的評價測度
(1) 評價測度
對於分類問題,評價測度是准確率,但這種方法不適用於回歸問題。我們使用針對連續數值的評價測度(evaluation metrics)。
這里介紹3種常用的針對線性回歸的測度。
1)平均絕對誤差(Mean Absolute Error, MAE)
(2)均方誤差(Mean Squared Error, MSE)
(3)均方根誤差(Root Mean Squared Error, RMSE)
這里我使用RMES。
[python]view plain
<prename="code"class="python">#計算Sales預測的RMSE
printtype(y_pred),type(y_test)
printlen(y_pred),len(y_test)
printy_pred.shape,y_test.shape
fromsklearnimportmetrics
importnumpyasnp
sum_mean=0
foriinrange(len(y_pred)):
sum_mean+=(y_pred[i]-y_test.values[i])**2
sum_erro=np.sqrt(sum_mean/50)
#calculateRMSEbyhand
print"RMSEbyhand:",sum_erro
最後的結果如下:
(2)做ROC曲線
[python]view plain
importmatplotlib.pyplotasplt
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="upperright")#顯示圖中的標簽
plt.xlabel("thenumberofsales")
plt.ylabel('valueofsales')
plt.show()
顯示結果如下:(紅色的線是真實的值曲線,藍色的是預測值曲線)
直到這里整個的一次多元線性回歸的預測就結束了。
6、改進特徵的選擇
在之前展示的數據中,我們看到Newspaper和銷量之間的線性關系竟是負關系(不用驚訝,這是隨機特徵抽樣的結果。換一批抽樣的數據就可能為正了),現在我們移除這個特徵,看看線性回歸預測的結果的RMSE如何?
依然使用我上面的代碼,但只需修改下面代碼中的一句即可:
[python]view plain
#
feature_cols=['TV','Radio','Newspaper']
#
X=data[feature_cols]
#
#X=data[['TV','Radio','Newspaper']]#只需修改這里即可<prename="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
最後的到的系數與測度如下:
LinearRegression(_X=True, fit_intercept=True, normalize=False)
然後再次使用ROC曲線來觀測曲線的整體情況。我們在將Newspaper這個特徵移除之後,得到RMSE變小了,說明Newspaper特徵可能不適合作為預測銷量的特徵,於是,我們得到了新的模型。我們還可以通過不同的特徵組合得到新的模型,看看最終的誤差是如何的。
備註:
之前我提到了這種錯誤:
註:上面的結果是由train_test_spilit()得到的,但是我不知道為什麼我的版本的sklearn包中居然報錯:
處理方法:1、我後來重新安裝sklearn包。再一次調用時就沒有錯誤了。
2、自己寫函數來認為的隨機構造訓練集和測試集。(這個代碼我會在最後附上。)
這里我給出我自己寫的函數:
Ⅲ python 線性回歸 樣本外效果預測
看起來你可能在做股票方面的回測。
你自己寫個函數比較預測值和樣本外的實際值的偏差不行嗎?應該比較方便吧
Ⅳ 關於python簡單線性回歸
線性回歸:
設x,y分別為一組數據,代碼如下
import matplotlib.pyplot as plt
import numpy as np
ro=np.polyfit(x,y,deg=1) #deg為擬合的多項式的次數(線性回歸就選1)
ry=np.polyval(ro,x) #忘記x和ro哪個在前哪個在後了。。。
print ro #輸出的第一個數是斜率k,第二個數是縱截距b
plt.scatter(x,y)
plt.plot(x,ry)
Ⅳ 使用Python的線性回歸問題,怎麼解決
本文中,我們將進行大量的編程——但在這之前,我們先介紹一下我們今天要解決的實例問題。
1) 預測房子價格
閃電俠是一部由劇作家/製片人Greg Berlanti、Andrew Kreisberg和Geoff Johns創作,由CW電視台播放的美國電視連續劇。它基於DC漫畫角色閃電俠(Barry Allen),一個具有超人速度移動能力的裝扮奇特的打擊犯罪的超級英雄,這個角色是由Robert Kanigher、John Broome和Carmine Infantino創作。它是綠箭俠的衍生作品,存在於同一世界。該劇集的試播篇由Berlanti、Kreisberg和Johns寫作,David Nutter執導。該劇集於2014年10月7日在北美首映,成為CW電視台收視率最高的電視節目。
綠箭俠是一部由劇作家/製片人 Greg Berlanti、Marc Guggenheim和Andrew Kreisberg創作的電視連續劇。它基於DC漫畫角色綠箭俠,一個由Mort Weisinger和George Papp創作的裝扮奇特的犯罪打擊戰士。它於2012年10月10日在北美首映,與2012年末開始全球播出。主要拍攝於Vancouver、British Columbia、Canada,該系列講述了億萬花花公子Oliver Queen,由Stephen Amell扮演,被困在敵人的島嶼上五年之後,回到家鄉打擊犯罪和腐敗,成為一名武器是弓箭的神秘義務警員。不像漫畫書中,Queen最初沒有使用化名」綠箭俠「。
由於這兩個節目並列為我最喜愛的電視節目頭銜,我一直想知道哪個節目更受其他人歡迎——誰會最終贏得這場收視率之戰。 所以讓我們寫一個程序來預測哪個電視節目會有更多觀眾。 我們需要一個數據集,給出每一集的觀眾。幸運地,我從維基網路上得到了這個數據,並整理成一個.csv文件。它如下所示。
閃電俠
閃電俠美國觀眾數
綠箭俠
綠箭俠美國觀眾數
1 4.83 1 2.84
2 4.27 2 2.32
3 3.59 3 2.55
4 3.53 4 2.49
5 3.46 5 2.73
6 3.73 6 2.6
7 3.47 7 2.64
8 4.34 8 3.92
9 4.66 9 3.06
觀眾數以百萬為單位。
解決問題的步驟:
首先我們需要把數據轉換為X_parameters和Y_parameters,不過這里我們有兩個X_parameters和Y_parameters。因此,把他們命名為flash_x_parameter、flash_y_parameter、arrow_x_parameter、arrow_y_parameter吧。然後我們需要把數據擬合為兩個不同的線性回歸模型——先是閃電俠,然後是綠箭俠。 接著我們需要預測兩個電視節目下一集的觀眾數量。 然後我們可以比較結果,推測哪個節目會有更多觀眾。
步驟1
導入我們的程序包:
Python
1
2
3
4
5
6
7
# Required Packages
import csv
import sys
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn import datasets, linear_model
步驟2
寫一個函數,把我們的數據集作為輸入,返回flash_x_parameter、flash_y_parameter、arrow_x_parameter、arrow_y_parameter values。
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
# Function to get data
def get_data(file_name):
data = pd.read_csv(file_name)
flash_x_parameter = []
flash_y_parameter = []
arrow_x_parameter = []
arrow_y_parameter = []
for x1,y1,x2,y2 in zip(data['flash_episode_number'],data['flash_us_viewers'],data['arrow_episode_number'],data['arrow_us_viewers']):
flash_x_parameter.append([float(x1)])
flash_y_parameter.append(float(y1))
arrow_x_parameter.append([float(x2)])
arrow_y_parameter.append(float(y2))
return flash_x_parameter,flash_y_parameter,arrow_x_parameter,arrow_y_parameter
現在我們有了我們的參數,來寫一個函數,用上面這些參數作為輸入,給出一個輸出,預測哪個節目會有更多觀眾。
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Function to know which Tv show will have more viewers
def more_viewers(x1,y1,x2,y2):
regr1 = linear_model.LinearRegression()
regr1.fit(x1, y1)
predicted_value1 = regr1.predict(9)
print predicted_value1
regr2 = linear_model.LinearRegression()
regr2.fit(x2, y2)
predicted_value2 = regr2.predict(9)
#print predicted_value1
#print predicted_value2
if predicted_value1 > predicted_value2:
print "The Flash Tv Show will have more viewers for next week"
else:
print "Arrow Tv Show will have more viewers for next week"
把所有東西寫在一個文件中。打開你的編輯器,把它命名為prediction.py,復制下面的代碼到prediction.py中。
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# Required Packages
import csv
import sys
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn import datasets, linear_model
# Function to get data
def get_data(file_name):
data = pd.read_csv(file_name)
flash_x_parameter = []
flash_y_parameter = []
arrow_x_parameter = []
arrow_y_parameter = []
for x1,y1,x2,y2 in zip(data['flash_episode_number'],data['flash_us_viewers'],data['arrow_episode_number'],data['arrow_us_viewers']):
flash_x_parameter.append([float(x1)])
flash_y_parameter.append(float(y1))
arrow_x_parameter.append([float(x2)])
arrow_y_parameter.append(float(y2))
return flash_x_parameter,flash_y_parameter,arrow_x_parameter,arrow_y_parameter
# Function to know which Tv show will have more viewers
def more_viewers(x1,y1,x2,y2):
regr1 = linear_model.LinearRegression()
regr1.fit(x1, y1)
predicted_value1 = regr1.predict(9)
print predicted_value1
regr2 = linear_model.LinearRegression()
regr2.fit(x2, y2)
predicted_value2 = regr2.predict(9)
#print predicted_value1
#print predicted_value2
if predicted_value1 > predicted_value2:
print "The Flash Tv Show will have more viewers for next week"
else:
print "Arrow Tv Show will have more viewers for next week"
x1,y1,x2,y2 = get_data('input_data.csv')
#print x1,y1,x2,y2
more_viewers(x1,y1,x2,y2)
可能你能猜出哪個節目會有更多觀眾——但運行一下這個程序看看你猜的對不對。
3) 替換數據集中的缺失值
有時候,我們會遇到需要分析包含有缺失值的數據的情況。有些人會把這些缺失值捨去,接著分析;有些人會用最大值、最小值或平均值替換他們。平均值是三者中最好的,但可以用線性回歸來有效地替換那些缺失值。
這種方法差不多像這樣進行。
首先我們找到我們要替換那一列里的缺失值,並找出缺失值依賴於其他列的哪些數據。把缺失值那一列作為Y_parameters,把缺失值更依賴的那些列作為X_parameters,並把這些數據擬合為線性回歸模型。現在就可以用缺失值更依賴的那些列預測缺失的那一列。
一旦這個過程完成了,我們就得到了沒有任何缺失值的數據,供我們自由地分析數據。
為了練習,我會把這個問題留給你,所以請從網上獲取一些缺失值數據,解決這個問題。一旦你完成了請留下你的評論。我很想看看你的結果。
個人小筆記:
我想分享我個人的數據挖掘經歷。記得在我的數據挖掘引論課程上,教師開始很慢,解釋了一些數據挖掘可以應用的領域以及一些基本概念。然後突然地,難度迅速上升。這令我的一些同學感到非常沮喪,被這個課程嚇到,終於扼殺了他們對數據挖掘的興趣。所以我想避免在我的博客文章中這樣做。我想讓事情更輕松隨意。因此我嘗試用有趣的例子,來使讀者更舒服地學習,而不是感到無聊或被嚇到。
謝謝讀到這里——請在評論框里留下你的問題或建議,我很樂意回復你。
Ⅵ python怎麼用線性回歸擬合
from sklearn import linear_model#線性回歸clf = linear_model.LinearRegression()#訓練clf.fit ([[0, 0], [1, 1], [2, 2]], [0, 1, 2])#表達式參數clf.coef_#測試improt numpy as npx = np.array([1,1])y = x.dot(clf.coef_)
Ⅶ 如何用python去非線性擬合一個多變數的冪函數
為什麼不用MATLAB,MATLAB的曲線擬合非常完善,也簡單易學。
Ⅷ 如何用 python 實現帶隨機梯度下降的線性回歸
線性回歸是一種用於預測真實值的方法。讓人困惑的是,這些需要預測真實值的問題被稱為回歸問題(regression problems)。線性回歸是一種用直線對輸入輸出值進行建模的方法。在超過二維的空間里,這條直線被想像成一個平面或者超平面(hyperplane)。預測即是通過對輸入值的組合對輸出值進行預判。
Ⅸ python 非線性回歸是怎麼實現的
首先,找規律。每行都是從1開始,最大的數是 相應的行號。這樣可以得到 1 2 3 4 5 6 7 8 nums = 3 for x in range(1, nums+1): print range(1, x) # 這樣就輸出了,如下 [1, ] [1, 2, ] [1, 2, 3, ] 然後,繼續。 剩下的是前面序列的反轉