【问题标题】:How to detect overfitting in xgboost(from test-auc score)如何检测 xgboost 中的过拟合(来自 test-auc 分数)
【发布时间】:2017-06-16 07:12:22
【问题描述】:

我正在尝试了解如何构建预测模型,最近在 R 中遇到了 xgboost 包,并尝试使用 Titanic 数据集来实现它。我建立了一个模型,现在我想知道如何检测我的模型是否过度拟合以及选择多少轮以及这是基于训练错误还是测试错误。

这是代码:

#Load Dataset
titanic.train <- read.csv("D:/Data/titanic/train.csv")
titanic.test <- read.csv("D:/Data/titanic/test.csv")
PassengerId=titanic.test$PassengerId
head(titanic.train)

#Create columns to distinguish between Train and Test datasets
titanic.train$IsTrainSet <- TRUE
titanic.test$IsTrainSet <- FALSE

#Create a missing column for Test data
titanic.test$Survived <- NA

#Combine Test and Train Datasets
titanic.full <- rbind(titanic.train , titanic.test)
tail(titanic.full)

titanic.full$Name <- as.character(titanic.full$Name)

titanic.full$Title <- sapply(titanic.full$Name, FUN=function(x) {strsplit(x, split='[,.]')[[1]][2]})
titanic.full$Title <- sub(' ','',titanic.full$Title)

titanic.full$Title[titanic.full$Title %in% c('Capt', 'Col' , 'Dr' , 'Don', 'Major', 'Sir' , 'Rev' ,
                                             'Dona', 'Lady', 'the Countess' , 'Jonkheer', 'Master')] <- 'Noble'


titanic.full$Title[titanic.full$Title %in% c('Ms', 'Miss' , 'Mlle')] <- 'Miss'
titanic.full$Title[titanic.full$Title %in% c('Mrs' , 'Mme')] <- 'Mrs'
table(titanic.full$Title) 

#Family size 3 and greater are TRUE or 1
titanic.full$Family <- titanic.full$SibSp + titanic.full$Parch + 1
table(titanic.full$Family)
#titanic.full$Family <- titanic.full$Family >= 3
#titanic.full$Family <- as.factor(titanic.full$Family)
#levels(titanic.full$Family) <- c(0,1)
#titanic.full$Family


titanic.full <- titanic.full[c( "Pclass" , "Title" , "Sex" , "Age" , "Family"  , "Fare", "SibSp" , "Parch"  , "Embarked"  , "Survived")]
head(titanic.full)




#Categorical Casting
titanic.full$Title <- as.factor(titanic.full$Title)
titanic.full$Sex <- as.factor(titanic.full$Sex)
titanic.full$Embarked <- as.factor(titanic.full$Embarked)


titanicDummy <- dummyVars("~.",data=titanic.full, fullRank=T)
titanic.full <- as.data.frame(predict(titanicDummy,titanic.full))
print(names(titanic.full))



#Create test and train data sets
titanic.train <- titanic.full[1:891,]
titanic.test <- titanic.full[892:1309,]

#XGBoosting

set.seed(35)
labs <- titanic.train$Survived
names(titanic.full)
dat <- titanic.train[c("Pclass","Title.Mr","Title.Mrs","Title.Noble", "Sex.male","Age", "Family", "Fare", "SibSp","Parch","Embarked.C","Embarked.Q","Embarked.S")]
titdata <- xgb.DMatrix(data = as.matrix(dat), missing = NA, label=as.numeric(labs))
res <- xgb.cv(objective="binary:logistic" , eta=0.1, metric="auc", max_depth = 3,
              data = titdata , label=as.numeric(labs) , nrounds =   200 , nfold = 10 , prediction = TRUE)

这是结果,我需要帮助来解释它,以及一些关于增加或减少“eta”和“max_depth”的建议

res

【问题讨论】:

    标签: r machine-learning data-science xgboost auc


    【解决方案1】:

    一般情况下(不管你使用什么具体算法),检测过拟合的方法如下:

    1) 将数据集拆分为训练集和测试集(比如 90% - 训练集,10% - 测试集)。

    2) 在训练数据集上训练分类器进行若干次迭代(或使用一些超参数值,如果您尝试调整各种参数值而不是多次训练迭代)

    3) 尝试对测试数据集使用经过训练的分类器并计算它的准确度(F1 指标,或 AUC,如果您愿意,也可以只是准确度)。

    4) 重复 3-4 直到您从 #3 开始的指标与上一步相比开始下降。

    在您的情况下,您没有将数据集拆分为训练和测试 - 因此我认为无法检测您是否真的过拟合。

    【讨论】:

    • 非常感谢您的回复。我明白你想说的。
    • 我将训练集分为 90 个训练集和 10 个验证集。我使用了与上面相同的 xgb 模型,并调整了一些参数,在验证集上进行了预测并计算了 F1 分数,得到了 0.862069
    猜你喜欢
    • 1970-01-01
    • 2020-07-13
    • 2016-04-02
    • 1970-01-01
    • 2018-01-31
    • 2017-07-16
    • 1970-01-01
    • 2022-01-05
    • 2022-06-20
    相关资源
    最近更新 更多