我应该为每个子集建立不同的模型吗

数据挖掘 机器学习 scikit-学习 回归 分类数据
2022-02-19 16:38:30

我有一个具有分类变量class的数据集。我正在尝试解决回归问题

我不明白我是否应该在整个数据集上构建模型并将变量视为输入变量之一,或者我应该为每个类构建一个完全不同的模型。

什么是可以帮助我在两种方法之间做出决定的一般规则。

这是我的数据的样例

+------------+----+-----+-----------------+
|   Class    | X1 | X2  |     Speed       |
+------------+----+-----+-----------------+
| Class1     | 12 | 123 |              10 |
| Class2     | 14 | 120 |              32 |
| Class3     | 15 |  34 |              12 |
|   .        |  . |   . |               . |
|   .        |  . |   . |               . |
|   .        |    |     |                 |
|  Class 300 | 23 |  13 |              45 |
+------------+----+-----+-----------------+

Class是输入分类变量,我有大约 300 个类。输出变量是Speed我正在尝试使用变量Class, X1,来预测速度X2

我应该为每个Class单独建立一个模型。所以当我知道输入类型是Class1我会选择为Class1. 当输入类型是Class2我将使用模型构建Class2等等。变量中的值Class也可以重复含义Class1可以出现 4 次,Class2可以出现 8 次等

我在想的另一种方法是将Class自己作为一个变量包含在内,然后只构建一个模型。

我不知道哪个是正确的方法

3个回答

构建一个包含类变量作为分类特征的模型。

由于它是一个高基数功能,因此您可以使用不同的技术:

  1. 一种热编码(将根据不同的类创建大约 300 个变量)
  2. 标签编码(将是单个变量,但会为不同的类分配权重 - 不理想)
  3. 散列技巧 - 使用散列函数来减少特征的数量
  4. 嵌入
  5. 将不同的类聚集在一起

在我看来,构建 300 个模型太暴力了。

我建议执行无监督聚类来检查您的 (x1,x2,speed) 是否确实属于这 300 个类。这样做,您可能会了解要素是否对回归问题很重要。

从这个意义上说,假设您发现这些类可以分为 5 个新的超类那么,构建 5 个模型似乎是一种更实用、更正确的方法

您还可以检查是否将Class特征作为分类特征包括在内,适用于单个回归模型

有时,为不同的类构建不同的模型是合理的。但作为第一种方法,尝试使用一个模型。

如果您的分类数据是序数,您可以将它们编码为自然数。否则,尝试 one-hot 编码,但使用阈值,因为你有太多的类,你会有太多的维度。

例如,您可以对所有样本超过 10 个的类进行 one-hot 编码,并关闭所有其余类。无论如何,对只有 1-2 个样本的类进行编码是没有意义的。

如果您使用不同的方法,则为每个类使用不同的模型是合理的。例如,对于一类,基于树的模型可能效果最好,对于另一类 SVM。您还可以构建不同的模型,如果一个模型对某个自变量的高值预测良好,而另一个模型预测低。