http://python.jobbole.com/81215/
本文參考了博樂在線的這篇文章,在其基礎上加了一些自己的理解。其原文是一篇英文的博客,講的十分通俗易懂。
本文通過一個簡單的例子:預測房價,來探討怎么用python做一元線性回歸分析。
1. 預測一下房價
房價是一個很火的話題,現在我們拿到一組數據,是房子的大小(平方英尺)和房價(美元)之間的對應關系,見下表(csv數據文件):
從中可以大致看出,房價和房子大小之間是有相關關系的,且可以大致看出來是線性相關關系。為了簡單起見,這里理想化地假設房價只和房子大小有關,那我們在這組數據的基礎上,怎樣預測任意大小的房子的房價呢?答案是用一元回歸分析。
2. 一元回歸分析是啥
講到一元回歸分析很多人應該不陌生,在初中還是高中的數學課程中肯定有學過,即對于一組自變量x和對應的一組因變量y的值,x和y呈線性相關關系,現在讓你求出這個線性關系的直線方程,就是這樣一個問題。
記得當時用的方法叫:最小二乘法,這里不再細講最小二乘法的詳細內容,其主要思想就是找到這樣一條直線,使得所有已知點到這條直線的距離的和最短,那么這樣一條直線理論上就應該是和實際數據擬合度最高的直線了。
下面我們將開篇提出的問題中的房價和房子的大小之間的關系用一個線性方程來表示:
表示大小為x(單位:平方英尺)的房子的價格為,其中θ0
是直線的截距,θ1
為回歸系數,即直線的斜率。
我們要計算的東西其實就是θ0、θ1
這兩個系數,因為只要這兩個系數確定了,那直線的方程也就確定了,然后就可以把要預測的x值代入方程來求:
3. 上代碼
注:用到的3個庫都可以用pip命令進行安裝。
#!/usr/bin/python
# coding:utf-8
# python一元回歸分析實例:預測房子價格
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.linear_model import LinearRegression
# 從csv文件中讀取數據,分別為:X列表和對應的Y列表
def get_data(file_name):
# 1. 用pandas讀取csv
data = pd.read_csv(file_name)
# 2. 構造X列表和Y列表
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
# 線性回歸分析,其中predict_square_feet為要預測的平方英尺數,函數返回對應的房價
def linear_model_main(X_parameter,Y_parameter,predict_square_feet):
# 1. 構造回歸對象
regr = LinearRegression()
regr.fit(X_parameter,Y_parameter)
# 2. 獲取預測值
predict_outcome = regr.predict(predict_square_feet)
# 3. 構造返回字典
predictions = {}
# 3.1 截距值
predictions['intercept'] = regr.intercept_
# 3.2 回歸系數(斜率值)
predictions['coefficient'] = regr.coef_
# 3.3 預測值
predictions['predict_value'] = predict_outcome
return predictions
# 繪出圖像
def show_linear_line(X_parameter,Y_parameter):
# 1. 構造回歸對象
regr = LinearRegression()
regr.fit(X_parameter,Y_parameter)
# 2. 繪出已知數據散點圖
plt.scatter(X_parameter,Y_parameter,color = 'blue')
# 3. 繪出預測直線
plt.plot(X_parameter,regr.predict(X_parameter),color = 'red',linewidth = 4)
plt.title('Predict the house price')
plt.xlabel('square feet')
plt.ylabel('price')
plt.show()
def main():
# 1. 讀取數據
X,Y = get_data('./price_info.csv')
# 2. 獲取預測值,在這里我們預測700平方英尺大小的房子的房價
predict_square_feet = 700
result = linear_model_main(X,Y,predict_square_feet)
for key,value in result.items():
print '{0}:{1}'.format(key,value)
# 3. 繪圖
show_linear_line(X,Y)
if __name__ == '__main__':
main()
【輸出結果】
coefficient:[ 28.77659574]
predict_value:[ 21915.42553191]
intercept:1771.80851064
4. 總結與不足
上述分析過程,有兩點不足:
數據量太少,預測的誤差可能較大;
影響房價不止房子大小這一個因素,肯定還有很多其他因素,這里沒有把其他因素考慮進去,導致預測的結果也是不準確的。既然有一元回歸分析,那肯定也有多元回歸分析,留到以后再講。
但是我們也看到可以用python的一些科學計算和數據分析的庫自動的幫我們完成以前需要繁瑣計算的過程,更加靈活高效,特別是面對上萬上百萬規模的數據的時候。