- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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.
这比构建公式更简单。那么我们来讨论一下如何获取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
获取:你的问题根本不清楚你的因变量是什么——你试图预测的东西。对于这个答案,我将向您展示如何预测文档是否包含“债务”一词的一种或多种用法。如果 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
模型。您还应该尝试基于树的方法,例如 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
。因此,请务必尝试其他模型,看看是否可以提高性能。
关于r - 如何使用 R 中的 'caret' 包将语料库的数据更改为适当的格式以进行训练?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34298800/
这段代码在 Java 中的等价物是什么?我放了一部分,我对 I/O 部分感兴趣: int fd = open(FILE_NAME, O_WRONLY); int ret = 0; if (fd =
我正在尝试将维度为 d1,d2,d3 的张量 M[a1,a2,a3] reshape 为维度为 d2, d1*d3 的矩阵 M[a2,a1*a3]。我试过 M.reshape(d2,d1*d3) 但是
我是一名优秀的程序员,十分优秀!