Day 4 models 常用演算法說明
本日重點:
了解迴歸預測的幾種常見方法(這邊主要是介紹方法,不會有艱深的數學式)
了解如何應用R實踐模型預測
了解常用參數的意義與適用性
prepare
install and load packages
#------ Package ------
#(if didn't install yet then install those packages)
#--- Check Package
packages.need <- c("caTools", "e1071", 'rpart', 'randomForest', 'xgboost', 'dplyr', 'Metrics')
packages.download <- !packages.need %in% installed.packages()[,"Package"]
if(any(packages.download))
install.packages(packages.need[packages.download],dependencies=TRUE)
#--- Load packaes
lapply(packages.need, require, character.only = TRUE)
load data and split
# load data
dataset <- read.csv('train_new.csv', stringsAsFactors = T)
# select features you want to put in models
# 這邊請根據前面幾天所學的去放入你認為重要的變數(如下只是範例)
dataset <- dataset %>% dplyr::select(SalePrice_log, X1stFlrSF, TotalBsmtSF, YearBuilt, LotArea,
Neighborhood, GarageCars, GarageArea,
GrLivArea_stand, MasVnrArea_stand, LotFrontage_log,
is_Fireplace, TotalBathrooms, TotalSF_stand)
# 部份類別變數用csv讀進來會是numeric,將之轉換成factor
dataset$is_Fireplace <- as.factor(dataset$is_Fireplace)
# Splitting the dataset into the Training set and Validation set
# library(caTools)
set.seed(1)
split <- sample.split(dataset$SalePrice_log, SplitRatio = 0.8)
training_set <- subset(dataset, split == TRUE)
val_set <- subset(dataset, split == FALSE)
linear regression
description
線性回歸是利用稱為線性回歸方程式的最小平方函數對一個或多個自變數和應變數之間關係進行建模的一種回歸分析。這種函數是一個或多個稱為回歸係數的模型參數的線性組合。只有一個自變數的情況稱為簡單回歸,大於一個自變數情況的叫做多元回歸
多元線性回歸模型表示如下: \[y_{}=\beta_{0}+\beta_{1}x_{1}+\beta_{2}x_{2}+...+\beta_{k}x_{k}+\epsilon_{}\] 建立多元回歸模型時,為了確保回歸模型具有良好的解釋及預測能力,需假設如下:
應變數與自變數之間具有顯著的線性關係
自變數之間應具有一定的互斥性,以避免共線性
demo
# Fitting Multiple Linear Regression to the Training set
regressor <- lm(formula = SalePrice_log ~ .,
data = training_set)
# Predicting the Test set results
y_pred <- predict(regressor, newdata = val_set)
# performance evaluation
rmse(val_set$SalePrice_log, y_pred)
[1] 0.1531
parameters
- 通常我們只要用到 formula 與 data 兩個參數就可以進行迴歸運算了,不太需要進行參數調整
SVR
description
SVM可同時應用於分類問題與回歸問題,應用於分類問題稱為support-vector classification (SVC),應用於回歸問題則稱為support-vector regression (SVR)
SVM本身是一個線性分類器,最開始解決的是線性可分的問題,然後拓展到非線性可分的問題。
若樣本非線性可分,利用非線性映射將低維空間內不可分的樣本映射成高緯空間線性可分的樣本,映射函數做內積所得到的函數在 SVM 中稱之為 kernel。
SVM具體實現方式是透過找出一個超平面(hyperplane),使之將兩個不同的集合分開,同時保證超平面兩邊的樣本儘可能遠的距離這個超平面。
一般的SVM找的是能將資料一分為二的平面, 而SVR所找的則是能準確預測資料分佈的平面
demo
# Fitting SVR to the dataset
# library(e1071)
regressor <- svm(formula = SalePrice_log ~ .,
data = training_set,
type = 'eps-regression',
kernel = 'radial')
# Predicting the Test set results
y_pred <- predict(regressor, newdata = val_set)
# performance evaluation
rmse(val_set$SalePrice_log, y_pred)
[1] 0.1452
parameters
- type: 建立模型的類別,SVM通常可以用做分類模型、迴歸模型或異常檢測模型。可以設置的種類有: eps-regression, nu-regression, C-classification, nu-classification, one-classification (for novelty detection)
- kernel: 模型建立過程中使用的核心函數。如前所述,SVM的建模過程中為了解決線性不可分的問題,會使用核函數對原始特徵進行轉換。有四個可選的核心函數: linear、polynomial、radial、sigmoid
Decision Tree
description
樹的建構通常包含以下兩個步驟:
- 決策樹的產生
將初始的包含大量資訊的資料集,按照一定的劃分條件逐層非類至不可再分或不需再分,充分產生樹。 在每一次分類中先找出各個可以做為分類變數的引數的所有可能劃分條件,再對每一個引數比較在各個劃分條件下所得的兩個分支的差異大小。選出使得差異最大的劃分條件作為該引數的最佳劃分;再將各個引數在最佳劃分下所得的兩個分支的差異大小進行比較,選出差異最大者作為該節點的分類變數,並採用該變數的最佳劃分。
比較差異大小的計算方法通常有信息熵(Entropy)或基尼係數(Gini index),CART分類回歸數即是以吉尼係數(Gini index)做為選擇屬性的依據。
- 產生樹的剪枝
在建樹過程中,可能存在Overfitting,許多分支中反映的是數據中的異常,這樣的決策樹對分類的準確性不高,那麼需要檢測並減去這些不可靠的分支。
決策樹示意圖:
demo
# Fitting Decision Tree Regression to the dataset
# library(rpart)
regressor <- rpart(formula = SalePrice_log ~ .,
data = training_set,
control = rpart.control(minsplit = 10))
# Predicting the Test set results
y_pred <- predict(regressor, newdata = val_set)
# performance evaluation
rmse(val_set$SalePrice_log, y_pred)
[1] 0.1896
parameters
- na.action: 用來處理遺漏值,預設為na.rpart,即僅剔除缺失y值或缺失所有輸入變數值的樣本資料。
- method: 選擇決策樹的類型,包含anova、poisson、class、exp,不進行設定的情況下,R會根據y的類型自己猜測。
- control參數:
- minisplit: 每個節點中所含樣本數的最小值
- minbucket: 每個葉節點中所含樣本數的最小值,預設取1/3的minisplit
- cp: 複雜度參數
- maxdepth: 控制樹的高度
Random Forest
description
隨機森林是多個決策樹組合而成的,這個在機器學習領域稱為Ensemble。這種模型比較不會有偏差或是發生Overfitting,通常將多個學習器組合起來,其表現會優於單個學習器。
隨機森林是透過 Bagging 演算法進行組合學習,並在 CART 樹生長時隨機選取變數進行分裂。它讓每顆樹完全生長不進行剪枝,最後對這 n 顆樹的結果進行組合。若為分類資料,則用簡單多數投票法,若為迴歸,則用平均法。
透過 Bagging 方法應用於組合分類器演算法時,是透過 Bootstrap Sampling 生成各不相同的訓練集來建構各個分類器,故每一顆樹都是建立自不同的bootstrapped sample,每次未被抽到的樣本組成了k個袋外資料,即 Out-Of-Bag (OOB)。我們通常可以透過這些資料來評估模型的正確率。
示意圖如下:
https://commons.wikimedia.org/wiki/File:Random_forest_diagram_complete.png
demo
# Fitting Random Forest Regression to the dataset
# library(randomForest)
set.seed(1)
regressor <- randomForest(formula = SalePrice_log ~ .,
data = training_set,
ntree = 500)
# Predicting the Test set results
y_pred <- predict(regressor, newdata = val_set)
# performance evaluation
rmse(val_set$SalePrice_log, y_pred)
[1] 0.1446
parameters
- na.action: 用來處理遺漏值,預設為na.fail,即不能出現遺漏值。
- ntree: 森林中樹的數目,通常這個參數不宜過小,通常會配合OOB的err.rate來決定。
- mtry: 用來決定在隨機森林中決策樹的每次分支時所選擇的變數個數。
- replace: 用來決定隨機抽樣的方式。TRUE代表抽樣是採有放回的隨機抽樣,取出的訓練集中會出現重複樣本。
XGBoost
description
XGBoost是boosting算法的其中一種。Boosting算法的思想是將許多弱分類器集成在一起形成一個強分類器,一個接一個的(串行)訓練基學習器,每一個基學習器主要用來修正前面學習器的偏差。 XGBoost所用到的樹模型是CART回歸樹模型,XGBoost既可以用於分類也可以用於迴歸問題。
其發展概念如下圖:
具體演算法說明可參考此: http://www.dehong.space/XGBoost
demo
# library(xgboost)
# 因XGBoost是吃matrix的格式,故須將所有資料皆轉換為數值型,存入矩陣中
# transfer all feature to numeric
training_set_new <- training_set %>% dplyr::select(-SalePrice_log)
val_set_new <- val_set %>% dplyr::select(-SalePrice_log)
cat_index <- which(sapply(training_set_new, class) == "factor")
training_set_new[cat_index] <- lapply(training_set_new[cat_index], as.numeric)
val_set_new[cat_index] <- lapply(val_set_new[cat_index], as.numeric)
###########!!!更正,類別型資料建議用one-hot encoding的方式轉成數值型(參考Day3),不要直接轉!!!###########
###########請自行修改###########
# put testing & training data into two seperates Dmatrixs objects
labels <- training_set$SalePrice_log
dtrain <- xgb.DMatrix(data = as.matrix(training_set_new),label = labels)
dval <- xgb.DMatrix(data = as.matrix(val_set_new))
# set parameters
param <-list(objective = "reg:linear",
booster = "gbtree",
eta = 0.01, #default = 0.3
gamma=0,
max_depth=3, #default=6
min_child_weight=4, #default=1
subsample=1,
colsample_bytree=1
)
# Fitting XGBoost to the Training set
set.seed(1)
regressor <- xgb.train(params = param, data = dtrain, nrounds = 3000
#watchlist = list(train = dtrain, val = dval),
#print_every_n = 50, early_stopping_rounds = 300
)
# Predicting the Test set results
y_pred <- predict(regressor, dval)
# performance evaluation
rmse(val_set$SalePrice_log, y_pred)
[1] 0.1441
parameters
- 通用參數
- booster: gbtree使用基於樹的模型進行提升計算,gblinear使用線性模型進行提升計算,default = gbtree
- silent: 0為印出運行時的訊息,1為不印出訊息,defalt = 0
- 輔助參數
- eta: 更新過程中用到的收縮步長,default = 0.3
- gamma: 進一步劃分樹的葉節點的 minimum loss reduction,default = 0,範圍從 0 ~ ∞
- max_depth: 樹的最大深度,default = 6
- min_child_weight: 子節點中最小的樣本權重和,default = 1,範圍從 0 ~ ∞
- subsample: 用於訓練模型的子樣本佔整個樣本集合的比例,default = 1
- colsample_bytree: 建立樹時對特徵採樣的比例,default = 1
- 任務參數
- objective: 定義學習任務及相應的學習目標,常見的目標函數有: reg:linear, binary:logistic, multi:softmax, rank:pairwise 等等
- eval_metric: 驗證數據的評估指標,常用的有: rmse, logloss, auc 等等
- 其他參數
- nrounds: 樹的數量
- watchlist: 訓練時是否要顯示loss,若train and validation都要顯示則帶入list(train = dtrain, val = dval)
- print_every_n: 當watchlist有設定時,這邊可以設定每跑多少round顯示一次
- early_stopping_rounds: 驗證集的誤差迭代到設定的次數內不能再繼續降低,就停止迭代
詳細參數調整可參考官方文件: https://xgboost.readthedocs.io/en/latest/parameter.html
本日小挑戰
請試著改變randomforest與XGBoost模型的參數,重新訓練模型並輸出各自的rmse