1

我需要使用 RWeka 的实现 ( )优化 C4.5 算法在我的流失数据集上的准确性。J48()因此,我使用train()caret 包的功能来帮助我确定最佳参数设置(对于MC)。我试图通过手动运行J48()由 确定的参数来验证结果train()。结果令人惊讶,因为手动运行的结果要好得多

这就提出了以下问题:

  • 手动执行时哪些参数可能不同J48()
  • 如何获得train()与手动参数设置相似或更好的结果的功能?
  • 或者我在这里完全错过了什么?

我正在运行以下代码:

library("RWeka", lib.loc="~/R/win-library/3.3")
library("caret", lib.loc="~/R/win-library/3.3")
library("gmodels", lib.loc="~/R/win-library/3.3")

set.seed(7331)

使用包 caret 中的 train() 确定具有 J48 的最佳 C4.5 模型:

ctrl <- trainControl(method="LGOCV", p=0.8, seeds=NA)
grid <- expand.grid(.M=25*(1:15), .C=c(0.1,0.05,0.025,0.01,0.0075,0.005))

使用完整数据集“response_nochar”训练模型:

rtrain <- train(churn~.,data=response_nochar,method="J48",na.action=na.pass,trControl=ctrl,tuneGrid=grid)

返回预测精度为 0.6055 的 rtrain$finalmodel(以及大小为 3 且有 2 个叶子的树):

# Accuracy was used to select the optimal model using  the largest value.
# The final values used for the model were C = 0.005 and M = 25.

大约有。50 种组合,准确度为 0.6055,范围从最终模型的给定值到 (M=325, C=0.1)(中间有一个例外)。

使用 J48 手动尝试参数值:

# splitting into training and test datasets, deriving from full dataset "response_nochar"
# similar/equal to the above splitting with LGOCV and p=0.8?
response_sample <- sample(10000, 8000)
response_train <- response_nochar[response_sample,]
response_test <- response_nochar[-response_sample,]
# setting parameters
jctrl <- Weka_control(M=25,C=0.005)

计算模型:

c45 <- J48(churn~.,data=response_train,na.action=na.pass,control=jctrl)

使用测试数据集进行预测:

pred_c45 <- predict(c45, newdata=response_test, na.action=na.pass)

模型预测精度为 0.655(以及大小为 25 的树,有 13 个叶子)。

CrossTable(response_test$churn, pred_c45, prop.chisq= FALSE, prop.c= FALSE, prop.r= FALSE, dnn= c('actual churn','predicted churn'))

PS:我使用的数据集包含 10000 条记录,目标变量的分布是 50:50。

4

0 回答 0