如何将语料库的数据更改为适当的格式,以便在R中使用'caret'包进行培训?

时间:2015-12-15 20:29:17

标签: r text-mining r-caret text-classification document-classification

问-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)

那么,表格应该是什么?

1 个答案:

答案 0 :(得分:1)

由于您使用的是矩阵,因此应考虑caret::train的默认方法而不是公式接口。请注意?train下您可以传递以下参数:

  

x :样本在行中且功能在列中的对象。这可能是一个简单的矩阵 ......

     

y :包含每个样本结果的数字或因子向量。

这比构建公式简单。因此,让我们讨论如何获取xy

获取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模型。您还应该尝试使用基于树的方法,例如rfgbm

使用并行后端并非绝对必要,但会加快大型工作。如果没有它,请随意尝试这个例子。

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。因此,请务必尝试其他模型,看看是否可以提高性能。