我正在一个数据集上启动一个项目,该数据集包含一个类别的超过 5k 个唯一值。
我的问题是,在使用标签编码器“枚举”类别之后,使用 Standard Scaler 让我的机器学习模型的数据更“易于管理”是否有意义?
请记住,我总共有超过 500,000 个条目和 5,000 此特定列的唯一类别。
这更多是关于它背后的直觉,而不是如何编码,但我认为这应该是问的地方。
我正在一个数据集上启动一个项目,该数据集包含一个类别的超过 5k 个唯一值。
我的问题是,在使用标签编码器“枚举”类别之后,使用 Standard Scaler 让我的机器学习模型的数据更“易于管理”是否有意义?
请记住,我总共有超过 500,000 个条目和 5,000 此特定列的唯一类别。
这更多是关于它背后的直觉,而不是如何编码,但我认为这应该是问的地方。
如果您将 LabelEncoder 用于类别,则需要确保您的类别具有可比性。例如,对于类别 ['high', 'med', 'low'],项目具有可比性,因此对它进行 LabelEncoding 和标准缩放是有意义的。
但是,当您的类别无法相互比较时,标签编码将没有任何意义。例如,您不能将“星期一”与“星期二”进行比较。
TL;DR
如果您的类别具有可比性(序数),那么这是有道理的。如果没有,试着想办法减少你的类别,有很多方法可以做到。
1) 需要 LabelEncoder,因为您的机器学习模型无法处理字符串。您需要一个连续的数字标签 (0, 1, 2, .. n-1)。但是,它只针对标签部分,您可以根据您的模型要求使用 one-hot 编码或直接使用数字标签。
2) StandardScalar 使您的数据零均值和单位方差。
The standard score of a sample x is calculated as:
z = (x - u) / s
where u is the mean of the training samples or zero if with_mean=False, and s is the standard deviation of the training samples or one if with_std=False.
数据集的标准化是许多机器学习估计器的共同要求:如果单个特征或多或少看起来不像标准正态分布数据(例如,均值和单位方差为 0 的高斯),它们可能表现不佳。
例如,学习算法的目标函数中使用的许多元素(例如支持向量机的 RBF 内核或线性模型的 L1 和 L2 正则化器)假设所有特征都以 0 为中心并且具有相同顺序的方差。如果一个特征的方差比其他特征大几个数量级,它可能会主导目标函数并使估计器无法按预期正确地从其他特征中学习。(scikit-learn 文档)
因此,通常,它可以帮助您很好地扩展数据,这可能有助于更快地收敛。但是,同样,这取决于您使用的 ML 模型。
LabelEncoder
应该用于标签,以便将 n 个类别的标签替换为从 1 到 n 的整数。如果尚未完成,您应该这样做。
StandardScaler
最终将用于训练和测试数据,但不用于标签。它输出正或负 float
。
您当然不应该将此应用于标签列,因为标签列必须是正数 Integer
。