今天要來實作一個跟回歸分析相關的題目,我們將引用課程提供的房價訊息(King County data),其位於美國西雅圖
我們將用這個資料來做回歸預測房價
首先我們必須先引入 Graph Lab
import graphlab
接著導入房價的資料(home_data.gl),我們也可以透過graphlab來讓資料視覺化
seles = graphlab.SFrame('/home/user/nylon7/machine_learning/week1/home_data.gl/')
seles
seles.show(view="Scatter Plot",x="sqft_living",y="price")
id | date | price | bedrooms | bathrooms | sqft_living | sqft_lot | floors | waterfront | view | condition | grade | sqft_above | sqft_basement | yr_built | yr_renovated | zipcode | lat | long | sqft_living15 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
7129300520 | 2014-10-13 00:00:00+00:00 | 221900 | 3 | 1 | 1180 | 5650 | 1 | 0 | 0 | 3 | 7 | 1180 | 0 | 1955 | 0 | 98178 | 47.51123398 | -122.25677536 | 1340.0 |
6414100192 | 2014-12-09 00:00:00+00:00 | 538000 | 3 | 2.25 | 2570 | 7242 | 2 | 0 | 0 | 3 | 7 | 2170 | 400 | 1951 | 1991 | 98125 | 47.72102274 | -122.3188624 | 1690.0 |
5631500400 | 2015-02-25 00:00:00+00:00 | 180000 | 2 | 1 | 770 | 10000 | 1 | 0 | 0 | 3 | 6 | 770 | 0 | 1933 | 0 | 98028 | 47.73792661 | -122.23319601 | 2720.0 |
2487200875 | 2014-12-09 00:00:00+00:00 | 604000 | 4 | 3 | 1960 | 5000 | 1 | 0 | 0 | 5 | 7 | 1050 | 910 | 1965 | 0 | 98136 | 47.52082 | -122.39318505 | 1360.0 |
1954400510 | 2015-02-18 00:00:00+00:00 | 510000 | 3 | 2 | 1680 | 8080 | 1 | 0 | 0 | 3 | 8 | 1680 | 0 | 1987 | 0 | 98074 | 47.61681228 | -122.04490059 | 1800.0 |
7237550310 | 2014-05-12 00:00:00+00:00 | 1225000 | 4 | 4.5 | 5420 | 101930 | 1 | 0 | 0 | 3 | 11 | 3890 | 1530 | 2001 | 0 | 98053 | 47.65611835 | -122.00528655 | 4760.0 |
1321400060 | 2014-06-27 00:00:00+00:00 | 257500 | 3 | 2.25 | 1715 | 6819 | 2 | 0 | 0 | 3 | 7 | 1715 | 0 | 1995 | 0 | 98003 | 47.30972002 | -122.32704857 | 2238.0 |
2008000270 | 2015-01-15 00:00:00+00:00 | 291850 | 3 | 1.5 | 1060 | 9711 | 1 | 0 | 0 | 3 | 7 | 1060 | 0 | 1963 | 0 | 98198 | 47.40949984 | -122.31457273 | 1650.0 |
2414600126 | 2015-04-15 00:00:00+00:00 | 229500 | 3 | 1 | 1780 | 7470 | 1 | 0 | 0 | 3 | 7 | 1050 | 730 | 1960 | 0 | 98146 | 47.51229381 | -122.33659507 | 1780.0 |
3793500160 | 2015-03-12 00:00:00+00:00 | 323000 | 3 | 2.5 | 1890 | 6560 | 2 | 0 | 0 | 3 | 7 | 1890 | 0 | 2003 | 0 | 98038 | 47.36840673 | -122.0308176 | 2390.0 |
我們可以發現,這張圖大部分的情況都符合我們直覺的反應,房子地坪越大,價格越高
接著我們想要建立一個回歸的模型,所以最重要的是,我們要先處理測試集與訓練集
所以我們必須把資料分成測試集與訓練集
我們呼叫隨機分布函數(random_split())
#.8 意味著 80%訓練集/20%測試集
train_data,test_data = seles.random_split(.8,seed=0)
有了測試集與訓練集之後,接下來就是建立回歸模型(在這次的課程當中只會先用內建的演算法)
# 預測目標為"價格",特徵為"房子大小"
sqft_model = graphlab.linear_regression.create(train_data,target='price',features=['sqft_living'])
我們將得到一個圖表,它使用的演算法為Newton's method(graphlab 除非指定否則會自動選擇)
我們可以從測試集裡面取得平均的價格
接著可以從之前建立的模型呼叫它的評估函數,它會返回一些資料告訴我們擬合的狀況
print test_data['price'].mean()
#543,000
print sqft_model.evaluate(test_data)
#{'max_error': 4130610.392309714, 'rmse': 255224.89364924902}
此例的西雅圖均價為543,000
測試資料的最大誤差為410萬,我們可以從中推敲一定有一個房子的資料是異常,導致這個模型預測的不夠精確
RMSE(方均根差)是種在測量數值之間差異的量度
接下來我們要顯示我們的預測
import matplotlib.pyplot as plt
#用test_data作為參數,房子大小為X軸價格為Y軸,並以dot表示每一個測試
#接著是預測的線,房子大小依然為X軸,Y軸則為預測價格,並以'-'來繪製
plt.plot(test_data['sqft_living'],test_data['price'],'.',
test_data['sqft_living'],sqft_model.predict(test_data),'-')
還有一半還沒完成,今天錯估了形勢,以為已經安裝成功,結果沒想到爆出這種錯誤,還好有線上的jupyter可用
不只如此,用makedown畫那張房價資料圖,讓我差點崩潰QQ