处理训练和测试数据中的不同因子水平

Posted

技术标签:

【中文标题】处理训练和测试数据中的不同因子水平【英文标题】:Handling different Factor Levels in Train and Test data 【发布时间】:2017-03-24 23:48:39 【问题描述】:

我有一个 20 列的训练数据集,所有这些都是我必须用于训练模型的因素,我已经获得了测试数据集,我必须在这些数据集上应用我的模型进行预测并提交。

我正在做初步的数据探索,只是出于好奇检查了训练数据的级别和测试数据的级别,因为我们正在处理所有分类变量。令我沮丧的是,大多数类别(变量)在训练和测试中都有不同的级别数据集。

例如

table(train$cap.shape) #training data column levels
  b    c    f    k    x 
196    4 2356  828 2300

table(test$cap.shape) #test data 

 b    f    s    x 
256  796   32 1356

这里我在测试数据集中有一个额外的类别s,我该如何处理这些情况,训练中c的额外类别非常低,所以我想根据它的分布情况将该因子与其他因子合并有因变量,但我被困在如何处理测试中的额外级别。

更多示例

table(train$odor) #train
  c    f    m    n    p    s    y 
 189 2155   36 2150    2  576  576

table(test$odor) #test

  a    c    f    l    n    p 
400    3    5  400 1378  254

在本列中,我们有 2 个额外的测试级别,测试数据集中有大量实例。我该如何处理这些差异。

table(train$sColour) #train
    b    h    k    n    o    r    w    y 
   48 1627  700  753   48   72 2388   48

   table(test$sColour) #test
    h    k    n    u 
    5 1172 1215   48

这里我们有额外的 u 因子

我应该先在训练集上建立一个模型并找到重要的预测变量,然后再考虑因子水平吗?

【问题讨论】:

@Tchotchke 我不想删除测试中的额外因素,我想知道如何处理这些额外因素,以便模型不会抛出错误。 @Tchotchke 是不是应该结合测试和训练数据并重构所有列然后再次拆分数据? 你说得对,这是我的误解。你的提议是有道理的。不过,我对您的数据提出的一个更大的问题是,测试集和训练集似乎具有极其不同的分布(至少在这些因素方面),因此这可能是一项艰巨的建模任务。 @Tchotchke 是的,这个事实也让我感到不安,我合并了训练和测试数据集以使因子水平相等并获得 71 % 的准确度,所以任何想法如何处理建模时我们有这样的分类分布? 【参考方案1】:

拥有不同的特征集违反了机器学习的基本规则。训练和测试数据必须代表相同的数据空间。这些没有;尽管每一对都有一个共同的特征核(维度),但要在同一个模型上使用它们,您必须将每个集合减少为只有共同特征,或者将两者扩展到特征的并集,填写“不要care”或额外功能的语义空值。

【讨论】:

我不认为 OP 声明有不同的特征,而是分类或因子特征的不同值。如果是这种情况,那么我认为这是重复的(正如我刚刚对问题发表的评论),我的回复解决了问题。

以上是关于处理训练和测试数据中的不同因子水平的主要内容,如果未能解决你的问题,请参考以下文章

R语言使用caret包的predict函数对测试数据集进行数据预处理(和训练集的处理方式保持一致):缺失值填充数值变量最小最大缩放因子变量独热编码等

R语言数据预处理把类型变量转化为因子变量,把数据集转化为h2o格式数据集划分(训练集测试集验证集)

Python计算训练数据集(测试集)中某个分类变量阴性(阳性)标签样本的不同水平(level)或者分类值的统计个数以及比例

libsvm 中的大型训练和测试数据

22在不同的划分上进行训练和测试

python数据划分并使用卡方检验查看训练数据和测试数据的统计分布的合理性因为数据中有个别分类变量缺失稀有水平信息(频率为0)检查并补齐训练集和测试集中的水平(至少保证有1个)之后再进行卡方检验