使用同一数据集训练多个模型进行分类

机器算法验证 机器学习 分类
2022-04-03 13:01:46

对于我的分类问题,我试图将对象分类为好或坏。我已经能够创建一个很好的第一个分类步骤,使用 SVM 将数据分成两组。

在使用训练/保持集(75% 训练,25% 保持)调整 SVM 的参数后,我从保持集获得以下结果:第 1 组(分类为坏的模型)由 99% 的坏对象组成,组2(分类为好的模型)由大约 45% 的好对象和 55% 的坏对象组成。我使用 k-fold CV (k=5) 验证了模型的性能,发现该模型是稳定的,并且在误分类率方面表现相对一致。

现在,我想通过在我的第 2 组(可能是好/可能是坏的对象)上训练另一个模型(可能是也可能不是 SVM)来让这些对象通过另一轮分类,以尝试正确分类第二组,因为我已经摆脱了明显坏的对象。

我有几个想法,但不确定如何进行。

(1) 我的第一个想法是使用来自 Holdout 集中分类对象的数据来训练另一个模型。我能够根据保留集的结果训练另一个分类模型。问题是我使用的原始数据不到 25%,而且我担心在我的数据的一个非常小的子集上过度拟合。

(2) 我的第二个想法是收集 5-fold CV 的结果来创建另一个数据集。我的推理是,由于数据被划分为 5 个部分,并且每个部分从其他 4 个部分训练的模型中分为两组,所以我认为我可以聚合 5 个部分的预测结果,得到一个分类版本我的原始数据集并从那里继续。

唯一的问题是,我有一种沉沦的感觉,两种方法都不好。CV 能否阐明一些可能的后续步骤?

编辑

抱歉,我的问题措辞不当。让我试着澄清我想要做什么。可以把它想象成一棵树...

  • 让我将原始数据集称为节点 0。
  • 我使用分类方法 1 将节点 0 拆分为节点 1 和节点 2。
    • 节点 1 的误分类率低(主要由坏对象组成)
    • 节点 2 的错误分类率很高(大致均匀地混合了好对象和坏对象)
  • 我现在想使用分类方法 2 将节点 2 拆分为节点 3 和节点 4

“分类方法”可以是任何东西(LDA、QDA、SVM、CART、随机森林等)。所以我想我在这里想要实现的是一个“分类”树(不是CART),其中每个节点都经过不同的分类方法以获得整体高的“类纯度”。基本上,我想混合使用不同的分类方法来获得合理的结果。

我的问题在于第一次拆分后丢失了训练数据。在我通过“分类方法 1”运行它后,我用完了可用数据,在我的例子中是 SVM。

2个回答

我会为两个模型使用相同的训练数据集,并使用相同的 CV 折叠进行调整。不要将任何 25% 的保留用于训练或调整。一旦你在 75% 的训练样本上拟合了你的 2 个模型,就可以使用 holdout 来评估你的表现。

如果您使用的是 R,则 caret 包具有在数据集上创建折叠的功能,您可以重复使用这些功能来调整多个模型,然后评估它们的预测准确性。如果您愿意,我可以帮助您提供一些示例代码。

编辑:这是承诺的代码,从caret的小插图修改:

#Setup
rm(list = ls(all = TRUE)) #CLEAR WORKSPACE
set.seed(123)

#Pretend we only care about virginica
Data <- iris
virginica <- Data$Species=='virginica'
Data$Species <- NULL

#Look at the variable relationships
library(PerformanceAnalytics)
chart.Correlation(Data,col=ifelse(virginica,1,2))

#Create cross-validation folds to use for multiple models
#Use 10-fold CV, repeat 5 times
library(caret)
MyFolds <- createMultiFolds(virginica, k = 10, times = 5)
MyControl <- trainControl(method = "repeatedCV", index = MyFolds,
                summaryFunction = twoClassSummary,
                classProbs = TRUE)

#Define Equation for Models
fmla <- as.formula(paste("virginica ~ ", paste(names(Data), collapse= "+")))

#Fit some models
Data$virginica <- as.factor(ifelse(virginica,'Yes','No'))

svmModel <- train(fmla,Data,method='svmRadial',
    tuneLength=3,metric='ROC',trControl=MyControl)

rfModel <- train(fmla,Data,method='rf',
    tuneLength=3,metric='ROC',trControl=MyControl)

#Compare Models
resamps <- resamples(list(
    SVM = svmModel,
    RandomForest = rfModel
    ))
summary(resamps)
densityplot(resamps,auto.key = TRUE, metric='ROC')

只是为了确保我们在同一页面上,我从您的描述中得知,您考虑了一个监督学习问题,您知道对象的好/坏状态,并且您对每个对象都有一个特征向量用于将对象分类为好或坏。此外,训练 SVM 的结果是给出一个分类器,该分类器在保留数据上几乎没有给出错误的坏预测,但有 55% 的错误预测是好的。我没有亲自处理过两组错误率差异如此之大的问题。它向我表明,两组中的特征分布重叠,但 Bad 组中的特征分布更加分散。就像两个高斯分布,对于一组坏对象来说,均值几乎相同但方差更大。如果是这样的话,我想如果不是不可能的话,要大大提高 Good 预测的错误率是很困难的。可能还有其他我不知道的解释。

话虽如此,我认为按照您的建议,以分层方式组合分类程序是一种明智的策略。首先,一个分类器将整个训练集分成两组,然后其他分类器将每个组分成两组等。事实上,这就是分类树所做的,但通常在每一步中使用非常简单的分割。在被 SVM 归类为良好的训练数据上训练你喜欢的任何模型时,我认为没有正式的问题。您不需要使用保留数据。事实上,如果您需要保留数据来评估模型,您不应该这样做。

您的第二个建议与仅使用训练数据中分类为 Good 的组来训练第二个模型密切相关。我看不出有什么特别的理由使用基于 CV 的分类来获得这个组。请记住,如果您要使用 CV,那么每次都必须执行整个培训过程。

我的建议是首先从低维投影和探索性可视化中更好地了解这两组中的特征分布是什么样的。它可能会解释为什么 Good 分类的错误率如此之大。