close

所需packages:rpart、rattle

library(rpart)

library(rattle)

 

data <- na.omit(read.csv("E:/Dataset/nonchange_adult.csv"))

讀入資料,這裡使用的是UCI Machine Learning Repository上的Adult資料集

一共有14個Input和一個Output資料
data <-  subset(data, select =-c(native_country))

刪去不想要的欄位,select = -c(想刪除的欄位)

也可使用select = c(想要的欄位)

index <- sample(2, nrow(data), replace = TRUE, prob=c(0.7,0.3))

train <- data[index==1,]
test <- data[index==2, ]

將data分為70%訓練集與30%測試集

train_real <- subset(train, select = income)
train_predict <- subset(train, select = -income)

test_real<- subset(test, select = income)
test_predict<- subset(test, select = -income)

train_real和test_real為Output,先取出來方便等等計算錯誤率

predict的部分為用來放入Model做預測的資料(因為要預測不需要Output,所以將income那欄刪掉)

result <- rpart(income~., data = train, method="class") 

建構決策樹,第一個逗號前為預測的公式,在這邊就是利用全部其他column來預測income這欄

data則填入train的資料

而因為這個資料集想實現的是分類問題,所以method選擇class,其他還有poisson、exp、anova可選

詳細部分可參考rpart的介紹

fancyRpartPlot(result)

畫出剛剛建構的決策樹(如下圖),這個套件畫出來蠻容易懂的,來自rattle package

Decision tree-1    

pred_train <- predict(result, train_predict, type="class")                              
pred_test <- predict(result, test_predict, type="class")

將資料放入Model進行預測

pred_train <- round(as.numeric(pred_train))-1
pred_test <- round(as.numeric(pred_test))-1

將預測的值做一下處理,因為預測出來的值並不是數值型態的,要使用as.numeric轉型

後面的-1是因為他將類別表示為1和2,可是資料裡面是0和1(這部分我也不太了解為什麼...)

train_real <- as.numeric(unlist(train_real))
test_real <- as.numeric(unlist(test_real))

cmatrix_train <- table(pred_train, train_real)                
cmatrix_test <- table(pred_test, test_real)

cmatrix_train  <- as.vector(cmatrix_train)
cmatrix_test  <- as.vector(cmatrix_test)

將real data轉為numeric並unlist(才能放進table

confuse matrix為一種評斷預測的準確度的方法

R語言有提供他的套件,但是我這邊是直接寫了一個Function,所以才那麼多資料型態的轉換,讓他能Fit我的Function

FM <- function(matrix){                                                       # count Precision,recall,Fmeasure
 
  accruracy <- (matrix[1]+matrix[4])/sum(matrix)
  precision <- matrix[4]/(matrix[2]+matrix[4])
  recall <- matrix[4]/(matrix[3]+matrix[4])
  Fmeasure <- 2 * precision * recall / (precision + recall)
  Flist <- list("accuracy" = accruracy, "precision" = precision,"recall" = recall, "Fmeasure" = Fmeasure)
  return(Flist)
}

F_train <- FM(cmatrix_train)                                   
F_test <- FM(cmatrix_test)

將matrix放入function運算,會算出accuracy、precision、recall、F1值

          F_train   F_test   
accuracy  0.8414128 0.8402188
precision 0.8547849 0.8528121
recall    0.9501131 0.9519145
Fmeasure  0.8999316 0.8996423

這就是本次的結果~ 準確度高達84%~

 

arrow
arrow
    文章標籤
    R language Decision tree
    全站熱搜

    蕭亦辰 發表在 痞客邦 留言(0) 人氣()