首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R rfe功能选择插入符号

R rfe功能选择插入符号
EN

Stack Overflow用户
提问于 2016-01-20 22:35:18
回答 1查看 662关注 0票数 0

我正在使用R和插入符号包来执行分类任务。对于特征消除,我使用rfe,它有不同的选项,其中,我想最大化/最小化的度量是什么。

问题是rfe接受诸如RMSE、kappa之类的指标,而我想使用不同的指标来最大化,在mi情况下,我想最大化指标库中的ScoreQuadraticWeightedKappa,但我不知道如何做到这一点。

我有以下代码:

代码语言:javascript
复制
control <- rfeControl(functions = rfFuncs, method="cv", number=2)
results <- rfe(dataset[, -59], dataset[, 59], 
               sizes = c(1:58), rfeControl = control)

我如何编辑它,以使rfe最大化ScoreQuadraticWeightedKappa?

EN

回答 1

Stack Overflow用户

发布于 2016-01-27 01:09:50

下面是默认的postResample函数:

代码语言:javascript
复制
> postResample
function (pred, obs) 
{
    isNA <- is.na(pred)
    pred <- pred[!isNA]
    obs <- obs[!isNA]
    if (!is.factor(obs) & is.numeric(obs)) {
        if (length(obs) + length(pred) == 0) {
            out <- rep(NA, 2)
        }
        else {
            if (length(unique(pred)) < 2 || length(unique(obs)) < 
                2) {
                resamplCor <- NA
            }
            else {
                resamplCor <- try(cor(pred, obs, use = "pairwise.complete.obs"), 
                  silent = TRUE)
                if (class(resamplCor) == "try-error") 
                  resamplCor <- NA
            }
            mse <- mean((pred - obs)^2)
            n <- length(obs)
            out <- c(sqrt(mse), resamplCor^2)
        }
        names(out) <- c("RMSE", "Rsquared")
    }
    else {
        if (length(obs) + length(pred) == 0) {
            out <- rep(NA, 2)
        }
        else {
            pred <- factor(pred, levels = levels(obs))
            requireNamespaceQuietStop("e1071")
            out <- unlist(e1071::classAgreement(table(obs, pred)))[c("diag", 
                "kappa")]
        }
        names(out) <- c("Accuracy", "Kappa")
    }
    if (any(is.nan(out))) 
        out[is.nan(out)] <- NA
    out
}

代码语言:javascript
复制
    else {
        if (length(obs) + length(pred) == 0) {
            out <- rep(NA, 2)
        }
        else {
            pred <- factor(pred, levels = levels(obs))
            requireNamespaceQuietStop("e1071")
            out <- unlist(e1071::classAgreement(table(obs, pred)))[c("diag", 
                                    "kappa")]
        }
        names(out) <- c("Accuracy", "Kappa")
    }

在编辑了postResample或创建了您自己的等效函数之后,您可以运行:

代码语言:javascript
复制
rfFuncs$summary <- function (data, lev = NULL, model = NULL) {
    if (is.character(data$obs)) 
        data$obs <- factor(data$obs, levels = lev)
    postResample(data[, "pred"], data[, "obs"])
}

只需确保postResample已被编辑或替换为等效函数的名称即可。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34902898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档