【R語言學習筆記】2. 線性迴歸與CART迴歸樹的應用及對比

1. 目的:根據房子信息,判斷博士頓地區的房價。

 

2. 數據來源:論文《Hedonic housing prices and the demand for clean air》,數據中共含506個觀測值,及16個變量。其中,每個觀測值代表一個人口普查區。

boston <- read.csv("boston.csv") # 讀取文件
str(boston) # 查看數據結構

 

 

 

3. 變量介紹:

(1)town:每一個人口普查區所在的城鎮

(2)LON: 人口普查區中心的經度

(3)LAT: 人口普查區中心的緯度

(4)MEDV: 每一個人口普查區所對應的房子價值的中位數 (單位爲$1000)

(5)CRIM: 人均犯罪率

(6)ZN: 土地中有多少是地區是大量住宅物業

(7)INDUS: 區域中用作工業用途的土地佔比

(8)CHAS: 1:該人口普查區緊鄰查爾斯河;0: 該人口普查區沒有緊鄰查爾斯河

(9)NOX: 空氣中氮氧化物的集中度 (衡量空氣污染的指標)

(10)RM: 每個房子的平均房間數目

(11)AGE: 建於1940年以前的房子的比例

(12)DIS: 該人口普查區距離波士頓市中心的距離

(13)RAD: 距離重要高速路的遠近程度 (1代表最近;24代表最遠)

(14)TAX: 房子每$10,000價值所對應的稅收金額

(15)PTRATIO: 該城鎮學生與老師的比例

 

View(boston) # 查看數據

 

 

 

 

 

4. 應用及分析

4.1 數據探索

plot(boston$LON, boston$LAT) # 根據人口普查區的經度和緯度作圖

 

points(boston$LON[boston$CHAS == 1], boston$LAT[boston$CHAS==1], col = 'blue', pch = 19) # 藍色代表緊鄰查爾斯河的人口普查區

 

summary(boston$NOX) # NOX的平均數大約爲0.55
points(boston$LON[boston$NOX >= 0.55], boston$LAT[boston$NOX >= 0.55], col = 'gray', pch = 19) # 灰色代表NOX大於平均值的地區

 

summary(boston$MEDV) #各地區中位數房價 的 中位數爲21.2
points(boston$LON[boston$MEDV >= 21.2], boston$LAT[boston$MEDV >= 21.2], col = 'green', pch = 19) # 綠色代表中位數房價 高於中位數的地區

 

 

 

4.2 運用經度和緯度兩個自變量構建線性迴歸模型

model1 <- lm(MEDV ~ LON + LAT, data = boston) # 經度和緯度爲自變量,中位數房價爲因變量
summary(model1) # not a good model

 

 

雖然自變量“緯度”非常顯著,但是模型的調整後R^2只有0.1036,因此,線性迴歸模型不是非常理想。

plot(boston$LON, boston$LAT)
points(boston$LON[boston$MEDV >= 21.2], boston$LAT[boston$MEDV >= 21.2], col = 'green', pch = 19) # 綠色代表實際房價中位數 高於中位數的地區

 

points(boston$LON[model1$fitted.values >= 21.2], boston$LAT[model1$fitted.values >= 21.2], col = 'yellow', pch = 19) # 黃色代表線性迴歸模型所預測的中位數房價 高於 中位數的地區

 

 上圖進一步證實了線性迴歸模型不是很理想,因爲模型完全忽略了圖像中右半部分的地區。同時,這也證實了“自變量’緯度'不顯著”的說法。

 

 

4.3 運用經度和緯度兩個自變量構建CART迴歸樹

library(rpart) # 加載rpart包,用於構建CART模型
library(rpart.plot) # 加載rpart.plot包,用於繪製迴歸樹

tree1 <- rpart(MEDV ~ LAT + LON, data = boston) # 不需要加method="class",因爲構建的是迴歸樹而非分類樹
prp(tree1, digits = 4) # 繪製迴歸樹

points(boston$LON[boston$MEDV >= 21.2], boston$LAT[boston$MEDV >= 21.2], col = 'green', pch = 19) # 綠色爲原數據中房價中位數 高於 中位數的 地區

fitted <- predict(tree1) # 運用迴歸樹tree1預測每個地區的房價中位數
points(boston$LON[fitted >= 21.2], boston$LAT[fitted >= 21.2], col = 'yellow', pch = 19) # 黃色爲預測數據高於中位數的地區

 

由此不難看出,與線性迴歸模型相比,迴歸樹tree1的準確性顯著提高。

 

 

4.4 運用全部自變量構建線性迴歸模型並不斷優化

library(caTools) # 加載caTools包,將數據分爲70%訓練集和30%測試集
set.seed(123) # 設置種子
spl <- sample.split(boston$MEDV, SplitRatio = 0.7)
train <- subset(boston, spl == T) # 訓練集
test <- subset(boston, spl == F) # 測試集

  

lm1 <- lm(MEDV ~ LAT + LON + CRIM + ZN + INDUS + CHAS + NOX + RM + AGE + DIS + RAD + TAX + PTRATIO, data = train) # 運用訓練集數據構建線性迴歸模型
summary(lm1)

 

 

其中,CRIM, CHAS, NOX, RM, AGE, DIS, RAD, TAX, PTRATIO爲顯著變量,模型調整後R^2爲0.6525,較之前線性迴歸模型的調整後R^2相比顯著提高。

lm1pred <- predict(lm1, newdata = test) # 將模型應用到測試集用於預測集

library(forecast) # 加載forecast包
accuracy(lm1pred, test$MEDV) # 計算模型準確性

 

接着,依次剔除模型中最不顯著的自變量LAT, INDUS, LON,直至所有自變量均顯著,構建以下線性迴歸模型:

lm4 <- lm(MEDV ~ CRIM + ZN + CHAS + NOX + RM + AGE + DIS + RAD + TAX + PTRATIO, data = train) # 將模型應用到測試集用於預測集
summary(lm4) lm4pred <- predict(lm4, newdata = test)
accuracy(lm4pred, test$MEDV)

 

對比兩個模型的準確性:

library(forecast)
accuracy(lm1pred, test$MEDV) # 應用所有自變量的模型準確性 (模型4)
accuracy(lm4pred, test$MEDV) # 剔除LAT, INDUS, LON以後的模型準確性 (模型1)

 

 

對比ME, RMSE, MAE, MPE, MAPE, 不難發現模型4略微比模型1準確。

 

 

 4.5 運用全部自變量構建CART迴歸樹並不斷優化

tree3 <- rpart(MEDV ~ LAT + LON + CRIM + ZN + INDUS + CHAS + NOX + RM + AGE + DIS + RAD + TAX + PTRATIO, data = train)
prp(tree3)

 

 

treepred <- predict(tree3, newdata = test) # 將回歸樹tree3應用到訓練集,進行預測
accuracy(treepred, test$MEDV) # 迴歸樹tree3的準確性

 

 

 

通過對比ME, RMSE, MAE, MPE, MAPE等指標,發現該回歸樹tree3的準確定略低於線性迴歸模型 (模型1以及模型4)

 

接下來,通過引入cp, 進行交叉檢驗來尋找最佳的迴歸樹模型

library(caret)
library(lattice)
library(ggplot2)
library(e1071)
tr.control <- trainControl(method = 'cv', number = 10)
cp.grid <- expand.grid(.cp = (0:10)*0.001)
tr <- train(MEDV ~ LAT + LON + CRIM + ZN + INDUS + CHAS + NOX + RM + AGE + DIS + TAX + PTRATIO, data = train, method = 'rpart', trControl = tr.control, tuneGrid = cp.grid)
tr # cp = 0.001

 

 

 

 基於cp=0.001,構建新的迴歸樹

best.tree <- tr$finalModel
prp(best.tree)

 

 

best.tree.pred <- predict(best.tree, newdata = test) # 將新的迴歸樹best.tree應用到訓練集數據中進行預測
accuracy(best.tree.pred, test$MEDV) # 迴歸樹best.tree的準確性

 

 

 

 

 雖然引入cp,做了交叉檢驗以後,迴歸樹best.tree與迴歸樹tree3相比,準確率有所提升,但準確率仍低於線性迴歸模型(模型4)。因此,迴歸樹模型不一定是一個更好的選擇。

原文出處:https://www.cnblogs.com/shanshant/p/11888456.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章