我正在尝试创建一个大型模型。其中一个功能是分类的,它有近 1 亿个条目。
我看过 sklearn LabelEncoder,但我担心它仍然会在我的标签中创建一个我想避免的排序。如果我使用一种热编码,我最终会得到 1 亿维的非常大的向量。我有哪些选择?
我正在尝试创建一个大型模型。其中一个功能是分类的,它有近 1 亿个条目。
我看过 sklearn LabelEncoder,但我担心它仍然会在我的标签中创建一个我想避免的排序。如果我使用一种热编码,我最终会得到 1 亿维的非常大的向量。我有哪些选择?
不幸的是,AFAIK 没有 sklearn 模型支持分类变量。
例如,sklearn决策树仅支持诸如 , 之类的规则,这在此处X<n并不理想。X==n
此外,他们实现的决策树算法仅产生局部单向预测优化。这意味着,它可能不会产生诸如X<n遵循的规则X>n-1,即使这样的规则是非常可取的。
最后你会得到一些无意义的东西,比如:Car > 11Car < 6是大众汽车,6 是法拉利。
典型的解决方法是使用 one-hot 编码,在您的情况下这可能会让人头疼。然后,它可能不会:sklearn 决策树支持稀疏矩阵,因此内存损失会很低。您可以为此使用scipy。(稀疏矩阵以不同于常规矩阵的方式存储数据。而不是要求大小,内存需求与矩阵中非零的数量成正比。)就速度而言,它与算法本身支持分类变量的情况没有什么不同。
话虽这么说,如果其余功能不是稀疏的,您的数据可能不允许使用稀疏。我认为 scipy 不支持稀疏密集混合矩阵。
我能想到的另一种解决方法是在各种类别的观察之间产生一个欧几里得距离矩阵(您可能需要先进行归一化)。然后将靠近的类别分组。然后构建一个分层模型,您可以在其中预测每个类别的最终类别。在 python 中,这比看起来要容易。您可以使用 sklearn 基类为您的模型创建一个类。
我喜欢 Python 和 sklearn。但我相信为每项工作使用正确的工具。我会使用 R,它对分类变量(他们称之为factors)具有本机支持,并且有大量的决策树包。(注意:xgboost for R 不支持分类变量,它忽略了因子类类型。) Weka 也可以是一个很好的工具,它也有非常强大的决策树算法。
您可以sklearn.preprocessing.OneHotEncoder使用sparse=True. 它将返回一些模型可以使用的scipy.sparse矩阵。您的矩阵确实是 100e6 列宽,但不密集填充不会占用大量 RAM。
弹性网络(也称为 L1 和 L2 回归)模型可以是处理非常高维问题的有效技术。它通常用于处理基因组数据。可以在此处找到 sklearn 的弹性网络文档。弹性网络区分具有预测价值的变量和没有预测价值的变量,它通常将无用变量的系数设置为零。这可以显着减少问题中的类别数量。
您可以通过从类别中创建“虚拟”变量来利用 sklearn。如果您的一个级别/列是“颜色”,并且您的类别是红色、绿色和蓝色,那么您将制作两列,例如,一列用于红色,另一列用于绿色(消除过程不需要蓝色)。