R爬蟲小白入門:Rvest爬鏈家網+分析(三)

R爬蟲小白入門:Rvest爬鏈家網+分析(三)

歡迎關注天善智能,我們是專注於商業智能BI,人工智能AI,大數據分析與挖掘領域的垂直社區,學習,問答、求職一站式搞定!

對商業智能BI、大數據分析挖掘、機器學習,python,R等數據領域感興趣的同學加微信:tstoutiao,邀請你進入數據愛好者交流群,數據愛好者們都在這兒。

作者:汪喵行 R語言中文社區專欄作者

知乎ID:https://www.zhihu.com/people/yhannahwang

前言

上兩節

我們已經成功爬取了鏈家網的3w條數據,並且做了一些淺顯的分析,那麼這一節我們就利用機器學習,用除了房屋價格之外的其他因素(房屋高度/房屋面積等)來預測一套房子的價格。

objective:用除了房屋總價和房屋單位價格的其他因素,來預測房子的價格

用到的R包: splitstackshape / dummies / rpart / rpart.plot / RWeka / ggplot2

1.Data pre-processing

首先,根據我們的目標,我們需要預測的房屋總價是一個numeric的變量,具體的機器學習的方法有很多,比如簡單的線性迴歸,迴歸樹,模型樹,甚至神經網絡等等,這裡具體介紹用regression tree和model tree來進行預測。這是因為對於比較複雜的數據,直接用建立一個全局線性規劃模型有時候是不切實際並且費勁的,但是regression tree和model tree能夠解決這個問題。

讀取數據

1house_info 

由於之前數據裡面還有一些需要處理的字符之類,在我們訓練模型之前先把這些字符啊什麼的都處理處理。

1content 2content_size 3content 4content_size 5level 6size 7house_info[7] 8house_info[3] 9# 相當於把house_level,house_size裡面的字去掉以後再放回去

看一下output:

R爬蟲小白入門:Rvest爬鏈家網+分析(三)

這裡我們發現:

1.house_size這個變量其實可以拆成兩個,變成bedroom和hall。因為要用“室”來切分這個變量,所以之前我沒有把變量裡這個字去掉。

2.第一列對於我們預測房價沒有什麼意義,所以也直接去掉。

3.第5列其實也可以看成一個除了房屋總價的因變量,所以也應該去掉。

1library(splitstackshape)
2house_infos 3colnames(house_infos)[7:8] 4house_infos 5house_infos

看一下output:

R爬蟲小白入門:Rvest爬鏈家網+分析(三)

Model要求的形式是每一個variable是numeric或者int形式的,所以這裡有個麻煩就是我們的house_loc,這是一個類別型變量,很容易想到的辦法是給予每個區一個數字代替,但是這樣是錯誤的,因為model對於這個變量會區分大小。比如“黃浦區”是1,“長寧區”是12,那麼因為12>1,我們的model會認為“長寧區”>“黃浦區”,但是這種情況並不正確,所以用這種方法,我們的model準確度會很差。

其實對於類別型變量有一種方法就是one-hot Encoding(獨熱變量),把類別型變量變成dummy variables,既能實現類別型變量的區分,也不會造成直接賦值帶來的問題。

這裡用R中的dummies package就可以實現:

1library(dummies)
2#one-hot encoding on categorical variables
3house_infosd

看一下output:

R爬蟲小白入門:Rvest爬鏈家網+分析(三)

可以看出,我們原來一個house_loc變量,在運用dummies以後變成了15個變量,比如house_loc_黃浦,如果某條數據裡為0,那麼說明這套房子不在黃浦區,為1則說明在黃浦區,這個變量只能取0/1這兩個值,代表是否存在。其他14個和house_loc變來的變量也是如此。

2.ML on data

首先我們要劃分訓練集和測試集,這裡按照3:1進行劃分。

1#split the train and test datasets
2order 3train 4test 5test_p 6test_f

到此,train裡面是我們包括house_p的訓練數據,一共22500條,test_f是我們去掉house_p的測試數據,共7500條。

Regression tree

regression tree make predictions based on the average value of examples that reach a leaf. 迴歸樹使用CART算法來構建樹,使用二元切分法來分割數據,其葉節點包含單個值。首先,計算所有數據的均值,然後計算每條數據的值到均值的差值,再求平方和,即我們用總方差的方法來度量連續型數值的混亂度。在迴歸樹中,葉節點包含單個值,所以總方差可以通過均方差乘以數據集中樣本點的個數來得到。

在R中用rpart包來建立模型:

1library(rpart)
2model 3

output:

R爬蟲小白入門:Rvest爬鏈家網+分析(三)

這裡我們可以看見決策迴歸樹是怎樣來判定的,也可以用rpart.plot把樹畫出來:

1library(rpart.plot)
2rpart.plot(model, digits = 5)
R爬蟲小白入門:Rvest爬鏈家網+分析(三)

這裡尋找的第一個切分點是house_m,當測試數據進來以後,會根據house_m的值去走到葉子節點,進行預測。

下面我們把測試集放進去進行預測:

1pre 

pre是我們用test數據集預測數來的房屋價格,test$house_p是test數據集裡面原有的房屋價格。可以看出它們在中間部分的分佈差不多,極值的差別還是很大的。

R爬蟲小白入門:Rvest爬鏈家網+分析(三)

cor在0.81左右,說明真實值和預測值是很相關的。說明模型準確度還可以。

算一下MAE

1# MAE
2MAE 3MAE(pre, test$house_p)

MAE= 147.8623

單純的MAE是看不出我們預測值和真實值的差別的,所以我們可以用整個數據的平均值去放到整個數據的預測變量裡,看看這個MAE2是多少,再和我們model的MAE比較:

1mean(test$house_p) 
2MAE(527.3331, test$house_p)
R爬蟲小白入門:Rvest爬鏈家網+分析(三)

MAE2=259.311>147.8623=MAE,說明我們的模型減小了誤差,但是並不是那麼好,可以考慮用model tree試試看。

Model tree

模型樹與迴歸樹的差別在於:迴歸樹的葉節點是節點數據標籤值的平均值,而模型樹的節點數據是一個線性模型。簡單來說,就是隻有當某個data到達某個葉子節點的時候,才會用葉子節點上面建立的model去預測。

Model tree裡面會用到的就是這個Rweka包:

1library(RWeka) 
2model.m5p 3

house_p是我們要預測的因變量,這個.代表除了house_p之外的其他變量,"data="後面跟的就是我們需要訓練的數據。

R爬蟲小白入門:Rvest爬鏈家網+分析(三)

我們最後訓練的模型就是這樣子的,LM1-LM13代表的是每個葉子節點上的線性模型,也就是說,當我們用這個模型樹進行預測的時候,當某個test data走到某個葉子節點的時候,就會用那個葉子節點上的model來進行預測。

帶入測試數據:

1pre.m5p 

比較一下真實值和預測值的情況:

R爬蟲小白入門:Rvest爬鏈家網+分析(三)

1cor(pre.m5p,test$house_p)
R爬蟲小白入門:Rvest爬鏈家網+分析(三)

cor也可以看出,比剛剛的相關度0.81要高了很多。MAE比剛剛小了一些,說明model tree準確度和相關度都是優於regression tree的。

最後讓我們以一張model tree預測的預測房價和真實房價的對比圖結尾:

R爬蟲小白入門:Rvest爬鏈家網+分析(三)

散點越靠近y=x這條線,說明模型效果越好。從圖中看出,我們的模型還是比較好的。

根據這個模型我們也可以知道,可以去找那些在y=x這條線以下的房子,因為這些是低於市場價的。

最後寫寫模型可以改進的地方。

1.數據方面,單單把上海分成十幾個區可能不大科學,但是考慮到獨熱變量可能帶來的維度飆升問題所以還是選擇只用十多個區而不再細分

2.可能可以對於一些異常值進行處理

3.迴歸樹和模型樹可能可以剪枝(?)效果可能會好一些,但也需要嘗試才知道

最後的最後,做再多的模型,還是!買!不!起!房!

罷了罷了,與其唱一首 涼涼 送給自己,不如過好佛系的一生。足矣。

參考文獻

《Machine Learning with R, 2nd Edition》 by Brett Lantz

附上畫圖代碼

 1library(ggplot2) 

2ggplot(data = b,aes(x=b$V1 ,y=b$pre.m5p))+
3 labs(x="Actual price",y="predict price",
4 title = "Actual & predict price")+
5 geom_point(size=3,shape=21,color="dark red",alpha=0.3)+
6 geom_abline(intercept = 45,color="black")+
7 theme(axis.text.x = element_text(angle = 0,size=11),
8 panel.grid.major=element_blank(),
9 panel.grid.minor=element_blank(),
10 panel.background = element_rect(fill = "gray97"),
11 panel.border=element_rect(fill="transparent",color="light gray"),
12 plot.title = element_text(lineheight = 610,colour = "gray9"))
R爬蟲小白入門:Rvest爬鏈家網+分析(三)


今日祈禱:

沒房子的你,過得還好嗎?祝願看到此篇的朋友們都能有一個屬於自己的豪宅。

R爬蟲小白入門:Rvest爬鏈家網+分析(三)

往期精彩:

  • 是否,是否,總是富肥窮瘦?(文末上週投票公佈)
  • 功不唐捐,每日一道LeetCode,玉汝於成,終獲offer滿滿!
  • R語言中文社區2018年終文章整理(作者篇)
  • R語言中文社區2018年終文章整理(類型篇)
R爬蟲小白入門:Rvest爬鏈家網+分析(三)

回覆 爬蟲 爬蟲三大案例實戰

回覆 Python 1小時破冰入門

回覆 數據挖掘 R語言入門及數據挖掘

回覆 人工智能 三個月入門人工智能

回覆 數據分析師 數據分析師成長之路

回覆 機器學習 機器學習的商業應用

回覆 數據科學 數據科學實戰

回覆 常用算法 常用數據挖掘算法


分享到:


相關文章: