R中逻辑回归的交叉验证函数

Joh*_*net 2 r machine-learning logistic-regression

我来自一个主要是python + scikit学习背景,我想知道如何获得R中逻辑回归模型的交叉验证准确度?我一直在寻找和惊讶,没有简单的方法.我正在寻找相应的:

import pandas as pd
from sklearn.cross_validation import cross_val_score
from sklearn.linear_model import LogisticRegression

## Assume pandas dataframe of dataset and target exist.

scores = cross_val_score(LogisticRegression(),dataset,target,cv=10)
print(scores)
Run Code Online (Sandbox Code Playgroud)

对于R:我有:

model = glm(df$Y~df$X,family=binomial')
summary(model) 
Run Code Online (Sandbox Code Playgroud)

而现在我被卡住了.原因是,我的R模型的偏差是1900,这意味着它不合适,但是python给了我85%10倍交叉验证的准确性......这意味着它很好.看起来有点奇怪......所以我想在R中运行cross val以查看它是否有相同的结果.

任何帮助表示赞赏!

San*_*Dey 8

使用插入包的R版本:

library(caret)

# define training control
train_control <- trainControl(method = "cv", number = 10)

# train the model on training set
model <- train(target ~ .,
               data = train,
               trControl = train_control,
               method = "glm",
               family=binomial())

# print cv scores
summary(model)
Run Code Online (Sandbox Code Playgroud)

  • 补充一点,summary(model) 不会向您显示准确度分数。模型 $result 确实如此。 (2认同)

Hac*_*k-R 2

下面我从这里获取了答案并做了一些更改。

我所做的更改是使其成为一个 logit(逻辑)模型,添加建模和预测,存储 CV 的结果,并使其成为一个完全有效的示例。

另请注意,您可以使用许多包和函数,包括cv.glm()来自boot.

data(ChickWeight)

df                    <- ChickWeight
df$Y                  <- 0
df$Y[df$weight > 100] <- 1
df$X                  <- df$Diet 

df     <- df[sample(nrow(df)),]
folds  <- cut(seq(1,nrow(df)),breaks=10,labels=FALSE)
result <- list()

for(i in 1:10){
  testIndexes <- which(folds==i,arr.ind=TRUE)
  testData    <- df[testIndexes, ]
  trainData   <- df[-testIndexes, ]
  model       <- glm(Y~X,family=binomial,data=trainData)
  result[[i]] <- predict(model, testData) 
}
result
Run Code Online (Sandbox Code Playgroud)

您可以添加一行来计算循环内的精度,或者在循环完成后执行此操作。