天天看點

Python使用線性回歸簡單預測資料

轉載自: http://python.jobbole.com/81215/

本文中,我們将進行大量的程式設計——但在這之前,我們先介紹一下我們今天要解決的執行個體問題。

Python使用線性回歸簡單預測資料

我們想預測特定房子的價值,預測依據是房屋面積。

Python使用線性回歸簡單預測資料

閃電俠和綠箭俠是我最喜歡的電視節目。我想看看下周哪個節目會有更多的觀衆。

我們經常要和帶有缺失值的資料集打交道。這部分沒有實戰例子,不過我會教你怎麼去用線性回歸替換這些值。

我們有下面的資料集:

輸入編号

平方英尺

價格

1

150

6450

2

200

7450

3

250

8450

4

300

9450

5

350

11450

6

400

15450

7

600

18450

步驟:

Python使用線性回歸簡單預測資料

其中: hθ(x)是關于特定平方英尺的價格值(我們要預測的值),(意思是價格是平方英尺的線性函數); θ0是一個常數; θ1是回歸系數。

那麼現在開始程式設計:

步驟1

打開你最喜愛的文本編輯器,并命名為predict_house_price.py。 我們在我們的程式中要用到下面的包,是以把下面代碼複制到predict_house_price.py檔案中去。

<code># Required Packages</code>

<code>import</code> <code>matplotlib.pyplot as plt</code>

<code>import</code> <code>numpy as np</code>

<code>import</code> <code>pandas as pd</code>

<code>from</code> <code>sklearn</code><code>import</code> <code>datasets, linear_model</code>

現在你的程式沒錯了,我們繼續……

步驟2

我把資料存儲成一個.csv檔案,名字為input_data.csv 是以讓我們寫一個函數把資料轉換為X值(平方英尺)、Y值(價格)

8

9

<code># Function to get data</code>

<code>def</code> <code>get_data(file_name):</code>

<code> </code><code>data</code><code>=</code> <code>pd.read_csv(file_name)</code>

<code> </code><code>X_parameter</code><code>=</code> <code>[]</code>

<code> </code><code>Y_parameter</code><code>=</code> <code>[]</code>

<code> </code><code>for</code> <code>single_square_feet ,single_price_value</code><code>in</code> <code>zip</code><code>(data[</code><code>'square_feet'</code><code>],data[</code><code>'price'</code><code>]):</code>

<code>       </code><code>X_parameter.append([</code><code>float</code><code>(single_square_feet)])</code>

<code>       </code><code>Y_parameter.append(</code><code>float</code><code>(single_price_value))</code>

<code> </code><code>return</code> <code>X_parameter,Y_parameter</code>

第3行:将.csv資料讀入Pandas資料幀。

第6-9行:把Pandas資料幀轉換為X_parameter和Y_parameter資料,并傳回他們。

是以,讓我們把X_parameter和Y_parameter列印出來:

<code>[[150.0], [200.0], [250.0], [300.0], [350.0], [400.0], [600.0]]</code>

<code>[6450.0, 7450.0, 8450.0, 9450.0, 11450.0, 15450.0, 18450.0]</code>

<code>[Finished in 0.7s]</code>

腳本輸出: <code>[[150.0], [200.0], [250.0], [300.0], [350.0], [400.0], [600.0]] [6450.0, 7450.0, 8450.0, 9450.0, 11450.0, 15450.0, 18450.0] [Finished in 0.7s]</code>

步驟3

現在讓我們把X_parameter和Y_parameter拟合為線性回歸模型。我們要寫一個函數,輸入為X_parameters、Y_parameter和你要預測的平方英尺值,傳回θ0、θ1和預測出的價格值。

10

11

12

<code># Function for Fitting our data to Linear model</code>

<code>def</code> <code>linear_model_main(X_parameters,Y_parameters,predict_value):</code>

<code> </code><code># Create linear regression object</code>

<code> </code><code>regr</code><code>=</code> <code>linear_model.LinearRegression()</code>

<code> </code><code>regr.fit(X_parameters, Y_parameters)</code>

<code> </code><code>predict_outcome</code><code>=</code> <code>regr.predict(predict_value)</code>

<code> </code><code>predictions</code><code>=</code> <code>{}</code>

<code> </code><code>predictions[</code><code>'intercept'</code><code>]</code><code>=</code> <code>regr.intercept_</code>

<code> </code><code>predictions[</code><code>'coefficient'</code><code>]</code><code>=</code> <code>regr.coef_</code>

<code> </code><code>predictions[</code><code>'predicted_value'</code><code>]</code><code>=</code> <code>predict_outcome</code>

<code> </code><code>return</code> <code>predictions</code>

第5-6行:首先,建立一個線性模型,用我們的X_parameters和Y_parameter訓練它。

第8-12行:我們建立一個名稱為predictions的字典,存着θ0、θ1和預測值,并傳回predictions字典為輸出。

是以讓我們調用一下我們的函數,要預測的平方英尺值為700。

<code>X,Y</code><code>=</code> <code>get_data(</code><code>'input_data.csv'</code><code>)</code>

<code>predictvalue</code><code>=</code> <code>700</code>

<code>result</code><code>=</code> <code>linear_model_main(X,Y,predictvalue)</code>

<code>print</code> <code>"Intercept value "</code> <code>, result[</code><code>'intercept'</code><code>]</code>

<code>print</code> <code>"coefficient"</code> <code>, result[</code><code>'coefficient'</code><code>]</code>

<code>print</code> <code>"Predicted value: "</code><code>,result[</code><code>'predicted_value'</code><code>]</code>

腳本輸出:<code>Intercept value 1771.80851064 coefficient [ 28.77659574] Predicted value: [ 21915.42553191] [Finished in 0.7s]</code>

這裡,Intercept value(截距值)就是θ0的值,coefficient value(系數)就是θ1的值。 我們得到預測的價格值為21915.4255——意味着我們已經把預測房子價格的工作做完了!

為了驗證,我們需要看看我們的資料怎麼拟合線性回歸。是以我們需要寫一個函數,輸入為X_parameters和Y_parameters,顯示出資料拟合的直線。

<code># Function to show the resutls of linear fit model</code>

<code>def</code> <code>show_linear_line(X_parameters,Y_parameters):</code>

<code> </code><code>plt.scatter(X_parameters,Y_parameters,color</code><code>=</code><code>'blue'</code><code>)</code>

<code> </code><code>plt.plot(X_parameters,regr.predict(X_parameters),color</code><code>=</code><code>'red'</code><code>,linewidth</code><code>=</code><code>4</code><code>)</code>

<code> </code><code>plt.xticks(())</code>

<code> </code><code>plt.yticks(())</code>

<code> </code><code>plt.show()</code>

那麼調用一下show_linear_line函數吧:

<code>show_linear_line(X,Y)</code>

腳本輸出:

Python使用線性回歸簡單預測資料

2)預測下周哪個電視節目會有更多的觀衆

Python使用線性回歸簡單預測資料

閃電俠是一部由劇作家/制片人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檔案。它如下所示。

閃電俠

閃電俠美國觀衆數

綠箭俠

綠箭俠美國觀衆數

4.83

2.84

4.27

2.32

3.59

2.55

3.53

2.49

3.46

2.73

3.73

2.6

3.47

2.64

4.34

3.92

4.66

3.06

觀衆數以百萬為機關。

解決問題的步驟:

首先我們需要把資料轉換為X_parameters和Y_parameters,不過這裡我們有兩個X_parameters和Y_parameters。是以,把他們命名為flash_x_parameter、flash_y_parameter、arrow_x_parameter、arrow_y_parameter吧。然後我們需要把資料拟合為兩個不同的線性回歸模型——先是閃電俠,然後是綠箭俠。 接着我們需要預測兩個電視節目下一集的觀衆數量。 然後我們可以比較結果,推測哪個節目會有更多觀衆。

導入我們的程式包:

<code>import</code> <code>csv</code>

<code>import</code> <code>sys</code>

寫一個函數,把我們的資料集作為輸入,傳回flash_x_parameter、flash_y_parameter、arrow_x_parameter、arrow_y_parameter values。

13

<code> </code><code>flash_x_parameter</code><code>=</code> <code>[]</code>

<code> </code><code>flash_y_parameter</code><code>=</code> <code>[]</code>

<code> </code><code>arrow_x_parameter</code><code>=</code> <code>[]</code>

<code> </code><code>arrow_y_parameter</code><code>=</code> <code>[]</code>

<code> </code><code>for</code> <code>x1,y1,x2,y2</code><code>in</code> <code>zip</code><code>(data[</code><code>'flash_episode_number'</code><code>],data[</code><code>'flash_us_viewers'</code><code>],data[</code><code>'arrow_episode_number'</code><code>],data[</code><code>'arrow_us_viewers'</code><code>]):</code>

<code> </code><code>flash_x_parameter.append([</code><code>float</code><code>(x1)])</code>

<code> </code><code>flash_y_parameter.append(</code><code>float</code><code>(y1))</code>

<code> </code><code>arrow_x_parameter.append([</code><code>float</code><code>(x2)])</code>

<code> </code><code>arrow_y_parameter.append(</code><code>float</code><code>(y2))</code>

<code> </code><code>return</code> <code>flash_x_parameter,flash_y_parameter,arrow_x_parameter,arrow_y_parameter</code>

現在我們有了我們的參數,來寫一個函數,用上面這些參數作為輸入,給出一個輸出,預測哪個節目會有更多觀衆。

14

15

<code># Function to know which Tv show will have more viewers</code>

<code>def</code> <code>more_viewers(x1,y1,x2,y2):</code>

<code> </code><code>regr1</code><code>=</code> <code>linear_model.LinearRegression()</code>

<code> </code><code>regr1.fit(x1, y1)</code>

<code> </code><code>predicted_value1</code><code>=</code> <code>regr1.predict(</code><code>9</code><code>)</code>

<code> </code><code>print</code> <code>predicted_value1</code>

<code> </code><code>regr2</code><code>=</code> <code>linear_model.LinearRegression()</code>

<code> </code><code>regr2.fit(x2, y2)</code>

<code> </code><code>predicted_value2</code><code>=</code> <code>regr2.predict(</code><code>9</code><code>)</code>

<code> </code><code>#print predicted_value1</code>

<code> </code><code>#print predicted_value2</code>

<code> </code><code>if</code> <code>predicted_value1 &gt; predicted_value2:</code>

<code> </code><code>print</code> <code>"The Flash Tv Show will have more viewers for next week"</code>

<code> </code><code>else</code><code>:</code>

<code> </code><code>print</code> <code>"Arrow Tv Show will have more viewers for next week"</code>

把所有東西寫在一個檔案中。打開你的編輯器,把它命名為prediction.py,複制下面的代碼到prediction.py中。

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

<code>x1,y1,x2,y2</code><code>=</code> <code>get_data(</code><code>'input_data.csv'</code><code>)</code>

<code>#print x1,y1,x2,y2</code>

<code>more_viewers(x1,y1,x2,y2)</code>

可能你能猜出哪個節目會有更多觀衆——但運作一下這個程式看看你猜的對不對。

有時候,我們會遇到需要分析包含有缺失值的資料的情況。有些人會把這些缺失值舍去,接着分析;有些人會用最大值、最小值或平均值替換他們。平均值是三者中最好的,但可以用線性回歸來有效地替換那些缺失值。

這種方法差不多像這樣進行。

首先我們找到我們要替換那一列裡的缺失值,并找出缺失值依賴于其他列的哪些資料。把缺失值那一列作為Y_parameters,把缺失值更依賴的那些列作為X_parameters,并把這些資料拟合為線性回歸模型。現在就可以用缺失值更依賴的那些列預測缺失的那一列。

一旦這個過程完成了,我們就得到了沒有任何缺失值的資料,供我們自由地分析資料。

為了練習,我會把這個問題留給你,是以請從網上擷取一些缺失值資料,解決這個問題。一旦你完成了請留下你的評論。我很想看看你的結果。