gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:44:52 24 4
gpt4 key购买 nike

Q-1。如何将语料库的数据更改为适当的格式以使用“caret”包进行训练?

首先,我想为您提供一些解决这个问题的环境,我将向您展示我陷入困境的地方。

环境

This is corpus that is called rt. (R Code)

require(tm)
require(tm.corpus.Reuters21578) # to load data
data(Reuters21578)
rt<-Reuters21578

And the training Document-Term-Matrix is created from training corpus called dtmTrain. (R Code)

dtmTrain <- DocumentTermMatrix(rtTrain)

I have totally 10 classes for this project. The classes are in the metadatas of each document.

c("earn","acq","money-fx","grain","crude","trade","interest","ship","wheat","corn")

I have created a data frame from rt which has (documents x classes). It is called 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”包进行训练?

Q-2。如何使用“caret”包训练多类数据?

如果我们适当改变数据,之后如何使用caret包训练数据?

这来自插入符包文档。

## S3 method for class 'formula'
train(form, data, ..., weights, subset, na.action, contrasts = NULL)

那么,应该采用什么形式?

最佳答案

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

x: an object where samples are in rows and features are in columns. This could be a simple matrix...

y: a numeric or factor vector containing the outcome for each sample.

这比构建公式更简单。那么我们来讨论一下如何获取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

获取:你的问题根本不清楚你的因变量是什么——你试图预测的东西。对于这个答案,我将向您展示如何预测文档是否包含“债务”一词的一种或多种用法。如果 your_terms 中的某个类实际上是您的因变量,则将其从 your_terms 中删除,并在本例中使用它代替“debt”:

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]

现在您需要决定您想要尝试的模型类型。对于我们的示例,我们将使用 lasso/ridge 回归 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。因此,请务必尝试其他模型,看看是否可以提高性能。

关于r - 如何使用 R 中的 'caret' 包将语料库的数据更改为适当的格式以进行训练?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34298800/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com