我有一个仅包含分类变量和目标变量的数据集。我想用分类变量预测(二元)目标变量。
我正在尝试在 Python 和 sklearn 中执行此操作。
分类变量有许多不同的值。我正在考虑为所有分类变量中的每个值创建虚拟变量。但是,最终这会导致包含数千个变量的稀疏数据集。
您将如何减少虚拟变量的数量?您会使用 Chi2 来选择有用的功能吗?
或者您根本不会制作虚拟变量?
我有一个仅包含分类变量和目标变量的数据集。我想用分类变量预测(二元)目标变量。
我正在尝试在 Python 和 sklearn 中执行此操作。
分类变量有许多不同的值。我正在考虑为所有分类变量中的每个值创建虚拟变量。但是,最终这会导致包含数千个变量的稀疏数据集。
您将如何减少虚拟变量的数量?您会使用 Chi2 来选择有用的功能吗?
或者您根本不会制作虚拟变量?
这里有多个问题,其中一些问题较早提出和回答。首先,关于计算需要很长时间的问题。有多种方法可以解决这个问题,请参阅https://stackoverflow.com/questions/3169371/large-scale-regression-in-r-with-a-sparse-feature-matrix 以及Maechler 和 Bates的论文。
但是很可能问题出在建模上,我不太确定在具有非常多级别的分类变量时,处理分类预测变量的常用方法是否真的能提供足够的指导,请参阅此站点的标签[many-categories]。当然有很多方法可以尝试,一种可能是(如果这对你的例子来说是个好主意,我不知道,你没有告诉我们你的具体应用程序)一种分层分类变量,即启发通过生物分类中使用的系统,请参阅https://en.wikipedia.org/wiki/Taxonomy_(biology). 在那里,个体(植物或动物)首先被分类为领域,然后是王国、门、类、目、科、属,最后是物种。因此,对于分类中的每个级别,您都可以创建一个因子变量。如果您的级别是超市销售的产品,您可以创建一个以 [foodstuff, kitchenware, other] 开头的层次分类,然后 foodstuff 可以分类为 [meat, fish, vegetables, grains, ...] 和很快。只是一种可能。
与最后一个想法正交,您可以尝试融合套索,请参阅Principled way of collapsing categorical variables with many categories 这可以被视为一种将级别折叠成更大组的方法,完全基于数据,而不是级别的先前组织正如我提出的层次结构组织的建议所暗示的那样。
思考以下问题。你有一个巨大的矩阵(假设有 1000 行和 1000 列)。在此矩阵的每个单元格中,您都有一个值或没有值。您需要创建一个预测模型来预测由行 ID 和列 ID 给出的单元格中的值。
所描述的问题与您面临同样的问题:作为输入,您只有分类变量(行 ID 和列 ID 是分类的),并且每个分类变量都有许多可能的值(行数和列数)。
这个问题是如何解决的?解决此问题的一种标准方法是矩阵分解。您基本上为每行和每列分配不同的数值向量,然后通过将函数应用于与所选行和列相对应的向量来计算单元格中的值。例如,在非负矩阵分解的情况下,此函数只是行向量和列向量的标量积。
因此,如果您想对您的问题应用相同的方法,您需要将每个分类变量的每个值映射到一个数值向量中。然后你使用这些向量作为你的模型函数的输入,作为输出你得到你的预测。
从分类变量到向量和/或函数形状的精确映射由模型训练决定。
另一种解决问题的方法是受协同过滤的启发。要预测给定行和列的值,您需要找到相似的行和列并从中获取值。基本上,在您的情况下,它转化为一种 k-NN(最近邻)方法。使用分类变量的值来查找具有相似分类变量值的行。然后从“邻居”中获取目标的值并将它们组合起来(例如通过平均它们,也许权重与相似性度量成比例)。