
Python編程實(shí)現(xiàn)使用線性回歸預(yù)測(cè)數(shù)據(jù)
本文中,我們將進(jìn)行大量的編程——但在這之前,我們先介紹一下我們今天要解決的實(shí)例問(wèn)題。
1) 預(yù)測(cè)房子價(jià)格
房?jī)r(jià)大概是我們中國(guó)每一個(gè)普通老百姓比較關(guān)心的問(wèn)題,最近幾年保障啊,小編這點(diǎn)微末工資著實(shí)有點(diǎn)受不了。
我們想預(yù)測(cè)特定房子的價(jià)值,預(yù)測(cè)依據(jù)是房屋面積。
2) 預(yù)測(cè)下周哪個(gè)電視節(jié)目會(huì)有更多的觀眾
閃電俠和綠箭俠是我最喜歡的電視節(jié)目,特別是綠箭俠,當(dāng)初追的昏天黑地的,不過(guò)后來(lái)由于一些原因,沒(méi)有接著往下看。我想看看下周哪個(gè)節(jié)目會(huì)有更多的觀眾。
3) 替換數(shù)據(jù)集中的缺失值
我們經(jīng)常要和帶有缺失值的數(shù)據(jù)集打交道。這部分沒(méi)有實(shí)戰(zhàn)例子,不過(guò)我會(huì)教你怎么去用線性回歸替換這些值。
所以,讓我們投入編程吧(馬上)
在動(dòng)手之前,去把我以前的文章(Python Packages for Data Mining)中的程序包安裝了是個(gè)好主意。
1) 預(yù)測(cè)房子價(jià)格
我們有下面的數(shù)據(jù)集:
步驟:
在線性回歸中,我們都知道必須在數(shù)據(jù)中找出一種線性關(guān)系,以使我們可以得到θ0和θ1。 我們的假設(shè)方程式如下所示:
其中: hθ(x)是關(guān)于特定平方英尺的價(jià)格值(我們要預(yù)測(cè)的值),(意思是價(jià)格是平方英尺的線性函數(shù)); θ0是一個(gè)常數(shù); θ1是回歸系數(shù)。
那么現(xiàn)在開(kāi)始編程:
步驟1
打開(kāi)你最喜愛(ài)的文本編輯器,并命名為predict_house_price.py。 我們?cè)谖覀兊某绦蛑幸玫较旅娴陌?,所以把下面代碼復(fù)制到predict_house_price.py文件中去。
# Required Packages
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn import datasets, linear_model
運(yùn)行一下你的代碼。如果你的程序沒(méi)錯(cuò),那步驟1基本做完了。如果你遇到了某些錯(cuò)誤,這意味著你丟失了一些包,所以回頭去看看包的頁(yè)面。 安裝博客文章中所有的包,再次運(yùn)行你的代碼。這次希望你不會(huì)遇到任何問(wèn)題。
現(xiàn)在你的程序沒(méi)錯(cuò)了,我們繼續(xù)……
步驟2
把數(shù)據(jù)存儲(chǔ)成一個(gè).csv文件,名字為input_data.csv 所以讓我們寫(xiě)一個(gè)函數(shù)把數(shù)據(jù)轉(zhuǎn)換為X值(平方英尺)、Y值(價(jià)格)
# 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數(shù)據(jù)讀入Pandas數(shù)據(jù)幀。
第6-9行:把Pandas數(shù)據(jù)幀轉(zhuǎn)換為X_parameter和Y_parameter數(shù)據(jù),并返回他們。
所以,讓我們把X_parameter和Y_parameter打印出來(lái):
[[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
現(xiàn)在讓我們把X_parameter和Y_parameter擬合為線性回歸模型。我們要寫(xiě)一個(gè)函數(shù),輸入為X_parameters、Y_parameter和你要預(yù)測(cè)的平方英尺值,返回θ0、θ1和預(yù)測(cè)出的價(jià)格值。
# 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行:首先,創(chuàng)建一個(gè)線性模型,用我們的X_parameters和Y_parameter訓(xùn)練它。
第8-12行:我們創(chuàng)建一個(gè)名稱(chēng)為predictions的字典,存著θ0、θ1和預(yù)測(cè)值,并返回predictions字典為輸出。
所以讓我們調(diào)用一下我們的函數(shù),要預(yù)測(cè)的平方英尺值為700。
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(系數(shù))就是θ1的值。 我們得到預(yù)測(cè)的價(jià)格值為21915.4255——意味著我們已經(jīng)把預(yù)測(cè)房子價(jià)格的工作做完了!
為了驗(yàn)證,我們需要看看我們的數(shù)據(jù)怎么擬合線性回歸。所以我們需要寫(xiě)一個(gè)函數(shù),輸入為X_parameters和Y_parameters,顯示出數(shù)據(jù)擬合的直線。
# 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()
那么調(diào)用一下show_linear_line函數(shù)吧:
?
1
show_linear_line(X,Y)
腳本輸出:
2)預(yù)測(cè)下周哪個(gè)電視節(jié)目會(huì)有更多的觀眾
閃電俠是一部由劇作家/制片人Greg Berlanti、Andrew Kreisberg和Geoff Johns創(chuàng)作,由CW電視臺(tái)播放的美國(guó)電視連續(xù)劇。它基于DC漫畫(huà)角色閃電俠(Barry Allen),一個(gè)具有超人速度移動(dòng)能力的裝扮奇特的打擊犯罪的超級(jí)英雄,這個(gè)角色是由Robert Kanigher、John Broome和Carmine Infantino創(chuàng)作。它是綠箭俠的衍生作品,存在于同一世界。該劇集的試播篇由Berlanti、Kreisberg和Johns寫(xiě)作,David Nutter執(zhí)導(dǎo)。該劇集于2014年10月7日在北美首映,成為CW電視臺(tái)收視率最高的電視節(jié)目。
綠箭俠是一部由劇作家/制片人 Greg Berlanti、Marc Guggenheim和Andrew Kreisberg創(chuàng)作的電視連續(xù)劇。它基于DC漫畫(huà)角色綠箭俠,一個(gè)由Mort Weisinger和George Papp創(chuàng)作的裝扮奇特的犯罪打擊戰(zhàn)士。它于2012年10月10日在北美首映,與2012年末開(kāi)始全球播出。主要拍攝于Vancouver、British Columbia、Canada,該系列講述了億萬(wàn)花花公子Oliver Queen,由Stephen Amell扮演,被困在敵人的島嶼上五年之后,回到家鄉(xiāng)打擊犯罪和腐敗,成為一名武器是弓箭的神秘義務(wù)警員。不像漫畫(huà)書(shū)中,Queen最初沒(méi)有使用化名”綠箭俠“。
由于這兩個(gè)節(jié)目并列為我最喜愛(ài)的電視節(jié)目頭銜,我一直想知道哪個(gè)節(jié)目更受其他人歡迎——誰(shuí)會(huì)最終贏得這場(chǎng)收視率之戰(zhàn)。 所以讓我們寫(xiě)一個(gè)程序來(lái)預(yù)測(cè)哪個(gè)電視節(jié)目會(huì)有更多觀眾。 我們需要一個(gè)數(shù)據(jù)集,給出每一集的觀眾。幸運(yùn)地,我從維基百科上得到了這個(gè)數(shù)據(jù),并整理成一個(gè).csv文件。它如下所示。
觀眾數(shù)以百萬(wàn)為單位。
解決問(wèn)題的步驟:
首先我們需要把數(shù)據(jù)轉(zhuǎn)換為X_parameters和Y_parameters,不過(guò)這里我們有兩個(gè)X_parameters和Y_parameters。因此,把他們命名為flash_x_parameter、flash_y_parameter、arrow_x_parameter、arrow_y_parameter吧。然后我們需要把數(shù)據(jù)擬合為兩個(gè)不同的線性回歸模型——先是閃電俠,然后是綠箭俠。
接著我們需要預(yù)測(cè)兩個(gè)電視節(jié)目下一集的觀眾數(shù)量。 然后我們可以比較結(jié)果,推測(cè)哪個(gè)節(jié)目會(huì)有更多觀眾。
步驟1
導(dǎo)入我們的程序包:
# 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
寫(xiě)一個(gè)函數(shù),把我們的數(shù)據(jù)集作為輸入,返回flash_x_parameter、flash_y_parameter、arrow_x_parameter、arrow_y_parameter values。
# 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
現(xiàn)在我們有了我們的參數(shù),來(lái)寫(xiě)一個(gè)函數(shù),用上面這些參數(shù)作為輸入,給出一個(gè)輸出,預(yù)測(cè)哪個(gè)節(jié)目會(huì)有更多觀眾。
# 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"
把所有東西寫(xiě)在一個(gè)文件中。打開(kāi)你的編輯器,把它命名為prediction.py,復(fù)制下面的代碼到prediction.py中。
# 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)
可能你能猜出哪個(gè)節(jié)目會(huì)有更多觀眾——但運(yùn)行一下這個(gè)程序看看你猜的對(duì)不對(duì)。
3) 替換數(shù)據(jù)集中的缺失值
有時(shí)候,我們會(huì)遇到需要分析包含有缺失值的數(shù)據(jù)的情況。有些人會(huì)把這些缺失值舍去,接著分析;有些人會(huì)用最大值、最小值或平均值替換他們。平均值是三者中最好的,但可以用線性回歸來(lái)有效地替換那些缺失值。
這種方法差不多像這樣進(jìn)行。
首先我們找到我們要替換那一列里的缺失值,并找出缺失值依賴于其他列的哪些數(shù)據(jù)。把缺失值那一列作為Y_parameters,把缺失值更依賴的那些列作為X_parameters,并把這些數(shù)據(jù)擬合為線性回歸模型。現(xiàn)在就可以用缺失值更依賴的那些列預(yù)測(cè)缺失的那一列。
一旦這個(gè)過(guò)程完成了,我們就得到了沒(méi)有任何缺失值的數(shù)據(jù),供我們自由地分析數(shù)據(jù)。
為了練習(xí),我會(huì)把這個(gè)問(wèn)題留給你,所以請(qǐng)從網(wǎng)上獲取一些缺失值數(shù)據(jù),解決這個(gè)問(wèn)題。一旦你完成了請(qǐng)留下你的評(píng)論。我很想看看你的結(jié)果。
個(gè)人小筆記:
我想分享我個(gè)人的數(shù)據(jù)挖掘經(jīng)歷。記得在我的數(shù)據(jù)挖掘引論課程上,教師開(kāi)始很慢,解釋了一些數(shù)據(jù)挖掘可以應(yīng)用的領(lǐng)域以及一些基本概念。然后突然地,難度迅速上升。這令我的一些同學(xué)感到非常沮喪,被這個(gè)課程嚇到,終于扼殺了他們對(duì)數(shù)據(jù)挖掘的興趣。所以我想避免在我的博客文章中這樣做。我想讓事情更輕松隨意。因此我嘗試用有趣的例子,來(lái)使讀者更舒服地學(xué)習(xí),而不是感到無(wú)聊或被嚇到。
總結(jié)
以上就是本文關(guān)于Python編程實(shí)現(xiàn)使用線性回歸預(yù)測(cè)數(shù)據(jù)的全部?jī)?nèi)容,希望對(duì)大家有所幫助。
數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
LSTM 模型輸入長(zhǎng)度選擇技巧:提升序列建模效能的關(guān)鍵? 在循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)家族中,長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)憑借其解決長(zhǎng)序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報(bào)考條件詳解與準(zhǔn)備指南? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代浪潮下,CDA 數(shù)據(jù)分析師認(rèn)證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計(jì)的實(shí)用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強(qiáng)大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶 ...
2025-07-11尊敬的考生: 您好! 我們誠(chéng)摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實(shí)施重大更新。 此次更新旨在確保認(rèn) ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務(wù)的價(jià)值轉(zhuǎn)化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡(jiǎn)稱(chēng) BI)深度融合的時(shí)代,BI ...
2025-07-10SQL 在預(yù)測(cè)分析中的應(yīng)用:從數(shù)據(jù)查詢到趨勢(shì)預(yù)判? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代,預(yù)測(cè)分析作為挖掘數(shù)據(jù)潛在價(jià)值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢結(jié)束后:分析師的收尾工作與價(jià)值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢結(jié)束)并非工作的終點(diǎn),而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報(bào)考到取證的全攻略? 在數(shù)字經(jīng)濟(jì)蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭(zhēng)搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢(shì)性檢驗(yàn):捕捉數(shù)據(jù)背后的時(shí)間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢(shì)性檢驗(yàn)如同一位耐心的偵探,專(zhuān)注于從單 ...
2025-07-09year_month數(shù)據(jù)類(lèi)型:時(shí)間維度的精準(zhǔn)切片? ? 在數(shù)據(jù)的世界里,時(shí)間是最不可或缺的維度之一,而year_month數(shù)據(jù)類(lèi)型就像一把精準(zhǔn) ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應(yīng)用與實(shí)戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認(rèn)證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗(yàn):數(shù)據(jù)趨勢(shì)與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領(lǐng)域中,準(zhǔn)確捕捉數(shù)據(jù)的趨勢(shì)變化以及識(shí)別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認(rèn)證作為國(guó)內(nèi)權(quán)威的數(shù)據(jù)分析能力認(rèn)證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應(yīng)對(duì)策略? 長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)作為循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的一種變體,憑借獨(dú)特的門(mén)控機(jī)制,在 ...
2025-07-07統(tǒng)計(jì)學(xué)方法在市場(chǎng)調(diào)研數(shù)據(jù)中的深度應(yīng)用? 市場(chǎng)調(diào)研是企業(yè)洞察市場(chǎng)動(dòng)態(tài)、了解消費(fèi)者需求的重要途徑,而統(tǒng)計(jì)學(xué)方法則是市場(chǎng)調(diào)研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書(shū)考試全攻略? 在數(shù)字化浪潮席卷全球的當(dāng)下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅(qū)動(dòng)力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專(zhuān)業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉(zhuǎn)日期:解鎖數(shù)據(jù)處理的關(guān)鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準(zhǔn)確性的基礎(chǔ) ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅(qū)動(dòng)力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開(kāi)啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產(chǎn)要素的今天,數(shù)據(jù)分析師的職業(yè)價(jià)值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03