當前位置:成語大全網 - 新華字典 - 使用Python的線性回歸問題,怎麽解決

使用Python的線性回歸問題,怎麽解決

本文中,我們將進行大量的編程——但在這之前,我們先介紹壹下我們今天要解決的實例問題。

1) 預測房子價格

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

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

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

3) 替換數據集中的缺失值

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

所以,讓我們投入編程吧(馬上)

在動手之前,去把我以前的文章(Python Packages for Data Mining)中的程序包安裝了是個好主意。

1) 預測房子價格

我們有下面的數據集:

輸入編號

平方英尺

價格

1 150 6450

2 200 7450

3 250 8450

4 300 9450

5 350 11450

6 400 15450

7 600 18450

步驟:

在線性回歸中,我們都知道必須在數據中找出壹種線性關系,以使我們可以得到θ0和θ1。 我們的假設方程式如下所示:

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

那麽現在開始編程:

步驟1

打開妳最喜愛的文本編輯器,並命名為predict_house_price.py。 我們在我們的程序中要用到下面的包,所以把下面代碼復制到predict_house_price.py文件中去。

Python

1

2

3

4

5

# Required Packages

import matplotlib.pyplot as plt

import numpy as np

import pandas as pd

from sklearn import datasets, linear_model

運行壹下妳的代碼。如果妳的程序沒錯,那步驟1基本做完了。如果妳遇到了某些錯誤,這意味著妳丟失了壹些包,所以回頭去看看包的頁面。 安裝博客文章中所有的包,再次運行妳的代碼。這次希望妳不會遇到任何問題。

現在妳的程序沒錯了,我們繼續……

步驟2

我把數據存儲成壹個.csv文件,名字為input_data.csv 所以讓我們寫壹個函數把數據轉換為X值(平方英尺)、Y值(價格)

Python

1

2

3

4

5

6

7

8

9

# Function to get data

def get_data(file_name):

data = pd.read_csv(file_name)

X_parameter = []

Y_parameter = []

for single_square_feet ,single_price_value in zip(data['square_feet'],data['price']):

X_parameter.append([float(single_square_feet)])

Y_parameter.append(float(single_price_value))

return X_parameter,Y_parameter

第3行:將.csv數據讀入Pandas數據幀。

第6-9行:把Pandas數據幀轉換為X_parameter和Y_parameter數據,並返回他們。

所以,讓我們把X_parameter和Y_parameter打印出來:

Python

1

2

3

[[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]

腳本輸出:?[[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]

步驟3

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

Python

1

2

3

4

5

6

7

8

9

10

11

12

# Function for Fitting our data to Linear model

def linear_model_main(X_parameters,Y_parameters,predict_value):

# Create linear regression object

regr = linear_model.LinearRegression()

regr.fit(X_parameters, Y_parameters)

predict_outcome = regr.predict(predict_value)

predictions = {}

predictions['intercept'] = regr.intercept_

predictions['coefficient'] = regr.coef_

predictions['predicted_value'] = predict_outcome

return predictions

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

第8-12行:我們創建壹個名稱為predictions的字典,存著θ0、θ1和預測值,並返回predictions字典為輸出。

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

Python

1

2

3

4

5

6

X,Y = get_data('input_data.csv')

predictvalue = 700

result = linear_model_main(X,Y,predictvalue)

print "Intercept value " , result['intercept']

print "coefficient" , result['coefficient']

print "Predicted value: ",result['predicted_value']

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

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

為了驗證,我們需要看看我們的數據怎麽擬合線性回歸。所以我們需要寫壹個函數,輸入為X_parameters和Y_parameters,顯示出數據擬合的直線。

Python

1

2

3

4

5

6

7

8

9

10

# Function to show the resutls of linear fit model

def show_linear_line(X_parameters,Y_parameters):

# Create linear regression object

regr = linear_model.LinearRegression()

regr.fit(X_parameters, Y_parameters)

plt.scatter(X_parameters,Y_parameters,color='blue')

plt.plot(X_parameters,regr.predict(X_parameters),color='red',linewidth=4)

plt.xticks(())

plt.yticks(())

plt.show()

那麽調用壹下show_linear_line函數吧:

Python

1

show_linear_line(X,Y)

腳本輸出:

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文件。它如下所示。

閃電俠

閃電俠美國觀眾數

綠箭俠

綠箭俠美國觀眾數

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,並把這些數據擬合為線性回歸模型。現在就可以用缺失值更依賴的那些列預測缺失的那壹列。

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

為了練習,我會把這個問題留給妳,所以請從網上獲取壹些缺失值數據,解決這個問題。壹旦妳完成了請留下妳的評論。我很想看看妳的結果。

個人小筆記:

我想分享我個人的數據挖掘經歷。記得在我的數據挖掘引論課程上,教師開始很慢,解釋了壹些數據挖掘可以應用的領域以及壹些基本概念。然後突然地,難度迅速上升。這令我的壹些同學感到非常沮喪,被這個課程嚇到,終於扼殺了他們對數據挖掘的興趣。所以我想避免在我的博客文章中這樣做。我想讓事情更輕松隨意。因此我嘗試用有趣的例子,來使讀者更舒服地學習,而不是感到無聊或被嚇到。

謝謝讀到這裏——請在評論框裏留下妳的問題或建議,我很樂意回復妳。