轉載自: http://python.jobbole.com/81215/
本文中,我們将進行大量的程式設計——但在這之前,我們先介紹一下我們今天要解決的執行個體問題。
我們想預測特定房子的價值,預測依據是房屋面積。
閃電俠和綠箭俠是我最喜歡的電視節目。我想看看下周哪個節目會有更多的觀衆。
我們經常要和帶有缺失值的資料集打交道。這部分沒有實戰例子,不過我會教你怎麼去用線性回歸替換這些值。
我們有下面的資料集:
輸入編号
平方英尺
價格
1
150
6450
2
200
7450
3
250
8450
4
300
9450
5
350
11450
6
400
15450
7
600
18450
步驟:
其中: 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>
腳本輸出:
2)預測下周哪個電視節目會有更多的觀衆
閃電俠是一部由劇作家/制片人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 > 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,并把這些資料拟合為線性回歸模型。現在就可以用缺失值更依賴的那些列預測缺失的那一列。
一旦這個過程完成了,我們就得到了沒有任何缺失值的資料,供我們自由地分析資料。
為了練習,我會把這個問題留給你,是以請從網上擷取一些缺失值資料,解決這個問題。一旦你完成了請留下你的評論。我很想看看你的結果。