问-1。如何使用'caret'包将语料库的数据更改为适当的格式进行培训?
首先,我想给你一些这个问题的环境,我会告诉你我被困在哪里。
环境
这是一种名为
rt
的语料库。 (R代码)
require(tm)
require(tm.corpus.Reuters21578) # to load data
data(Reuters21578)
rt<-Reuters21578
培训Document-Term-Matrix是从名为
dtmTrain
的培训语料库中创建的。 (R代码)
dtmTrain <- DocumentTermMatrix(rtTrain)
这个项目共有10个课程。课程在 每个文件的元数据。
c("earn","acq","money-fx","grain","crude","trade","interest","ship","wheat","corn")
我已经从rt创建了一个数据框,其中包含(文档x类)。它被称为
docLabels
。
Docs earn acq money-fx grain crude trade interest ship wheat corn
1 0 0 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0 0 0 0
5 0 0 0 1 0 0 0 0 1 1
6 0 0 0 1 0 0 0 0 1 1
我认为到目前为止一切都很清楚。
问题
我有一个文档 - 术语 - 矩阵,它有数据和数据框,你可以看到有类。最后,如何将这两个数据对象合并为“caret”包进行培训?
问-2。如何使用'caret'包训练多类数据?
如果我们适当地更改数据,那么,如何使用插入符包训练数据?
这是来自插入包文档。
## S3 method for class 'formula'
train(form, data, ..., weights, subset, na.action, contrasts = NULL)
那么,表格应该是什么?
答案 0 :(得分:1)
由于您使用的是矩阵,因此应考虑caret::train
的默认方法而不是公式接口。请注意?train
下您可以传递以下参数:
x :样本在行中且功能在列中的对象。这可能是一个简单的矩阵 ......
y :包含每个样本结果的数字或因子向量。
这比构建公式简单。因此,让我们讨论如何获取x
和y
。
获取x:我们希望传递caret::train
x矩阵,只包含我们要在模型中使用的那些术语。因此,我们必须缩小DocumentTermMatrix
,这是一个稀疏矩阵,直到这些术语:
# You need to tell people where to find the file so your example is reproducible
install.packages("tm.corpus.Reuters21578", repos = "http://datacube.wu.ac.at")
library(tm.corpus.Reuters21578)
data(Reuters21578)
rt <- Reuters21578
dtm <- DocumentTermMatrix(rt)
# these are the terms you care about
your_terms <- c("earn","acq","money-fx","grain","crude","trade",
"interest","ship","wheat","corn")
your_columns <- which(tolower(dtm$dimnames$Terms) %in% your_terms) # only 8 are found
your_dtm <- as.matrix(dtm[,your_columns]) # unpack selected columns of sparse matrix
获取y:
你的因变量是什么 - 你想要预测的东西,你的问题根本不清楚。对于这个答案,我将向您展示如何预测该文件是否包含“债务”这个词的一个或多个用途。&#34;如果your_terms
中的某个类实际上是您的因变量,则将其从your_terms
中删除并使用它代替&#34;债务&#34;在这个例子中:
your_target <- as.integer(as.matrix(dtm[,'debt'])[,1] > 0) # returns array
在caret
中培训模型。
首先,我们将创建目标向量和解释矩阵分成60/40列车/测试集。
library('caret')
set.seed(123)
train_rows <- createDataPartition(your_target, p=0.6) # for 60% training set
dtm_train <- your_dtm[train_rows,]
y_train <- your_target[train_rows]
dtm_test <- your_dtm[-train_rows,]
y_test <- your_target[-train_rows]
现在您需要确定要尝试的模型类型。对于我们的示例,我们将使用套索/岭回归glmnet
模型。您还应该尝试使用基于树的方法,例如rf
或gbm
。
使用并行后端并非绝对必要,但会加快大型工作。如果没有它,请随意尝试这个例子。
tr_ctrl <- trainControl(method='repeatedcv', number=8, # train using 8-fold CV w/ 3 reps
repeats=3, returnResamp='none')
library(parallel)
library(doParallel) # if using Windows, but for Linux/OSX use library(doMC) instead
use_cores <- detectCores()-1
cl <- makeCluster(use_cores)
registerDoParallel(cl) # if using Windows, but for Linux/OSX use registerDoMC(cl)
set.seed(123)
glm <- train(x = dtm_train, y = y_train, # You can ignore the warning about
method='glmnet', trControl = t_ctrl)# classification vs. regression.
stopCluster(cl)
当然,你可以在这里做更多调整。
测试模型。您可以在此处使用AUC。
library('pROC')
auc_train <- roc(y_train,
predict(glm, newdata = dtm_train, type='raw') )
auc_test <- roc(y_test,
predict(glm, newdata = dtm_test, type='raw') )
writeLines(paste('AUC using glm:', round(auc_train$auc,4),'on training/validation set',
round(auc_test$auc,4),'on test set.'))
运行这个我得到AUC using glm: 0.6389 on training/validation set 0.6552 on test set
。因此,请务必尝试其他模型,看看是否可以提高性能。