处理分类变量

数据挖掘 分类数据
2021-09-26 03:10:55

我有一个面板数据集。我的因变量是总成本,我的几乎所有自变量都是分类变量。例如,年龄是“旧”、“新”。现在我有一些问题。

  1. 我应该对所有这些都使用假人吗?例如,只有类型变量本身有 33 个值,或者我可以使用聚类并减少它们?或任何其他方式,如果你知道)

  2. 具有等级的分类变量之间的行为是否存在差异?例如类型是“A”、“B”、...“S”,所以 A 和 B 之间没有等级,但质量是“A1”、“A2”、“A3”,其中 A1 表示最高质量。

我不知道为什么,我找不到关于变量选择和准备数据的足够信息。所以现在我有很多变量,我认为我应该在它们之间进行选择,并减少假人的数量。

2个回答

您应该将分类变量转换为虚拟变量。通常,对于每个单独的变量,您希望每个类的元素数量相等,或者至少数字应该接近。如果没有,您可以将较小的类聚集成一个更大的类。例如,假设您有一个包含 5 个不同类别的分类变量。您希望每个类大约占数据的 %20。如果不是,您可以定义一个新类,它结合了较小的类,使每个类大致相等。

对于第二部分,如果您实际上可以量化 A1 比 A2 好多少,或者能够根据一些启发式为它们分配一个相对值;您可以将它们转换为数值变量。

您可以在此笔记本中找到一个示例(标题为“聚合分类变量”的部分)。它来自edX 上的“机器学习原理:R 版”课程。您可以在审核模式下免费观看视频;笔记本在 github 上。

  1. 对于数据集中有 33 个变量的问题,请为这些变量执行 value_counts。

  2. 如果您觉得下降时的值不是很多,因此不应给它们一个类别,您可以给它们一个“其他”类别。恢复到下图,看看这是如何发生的。

  3. 您可以将 nlargest 的参数从 4 调整为您认为合适的任何值。

在此处输入图像描述

  1. 如果您想找出分类变量和目标变量之间的区别,请使用 seaborn 之类的库执行 EDA

    导入 seaborn 作为 sns sns.factorplot('categorical_variable_column_name','target_column_name', data=dataframe)

  2. 如果您没有 seaborn 库或只想快速获得结果,请使用聚合函数,例如:

    dataframe.groupby(['categorcategorical_variable_column_name'])['target_column_name'].mean()

在此处输入图像描述

  1. 如果您发现某些变量的值高于其他变量(例如 A1>A2>A3 等),您可以按该顺序本身分配数值

    数据框['categorical_column_name'].str.replace(['A1','A2','A3'],[30,20,10])

  2. 您可以为所涉及的其余变量创建虚拟变量,但我仍然建议您使用循环替换,如果变量数量很大,例如 A1,A2 ... A33 而不是 get_dummies,因为使用 get 虚拟变量,您会得到非常您的模型可能无法从中学到很多东西的稀疏列。