python - 如何处理分类数据以在机器学习中进行预处理

标签 python pandas dataframe machine-learning feature-selection

这可能是一个基本问题,我有一个分类数据,我想将其输入到我的机器学习模型中。我的 ML 模型只接受数字数据。将此分类数据转换为数值数据的正确方法是什么。

我的示例 DF:

  T-size Gender  Label
0      L      M      1
1      L      M      1
2      M      F      1
3      S      F      0
4      M      M      1
5      L      M      0
6      S      F      1
7      S      F      0
8      M      M      1

我知道以下代码将我的分类数据转换为数字

类型 1:

df['T-size'] = df['T-size'].cat.codes

上一行只是将类别从 0 转换为 N-1。它不遵循它们之间的任何关系。

对于这个例子,我知道S < M < L。当我想像上面那样转换数据时,我应该怎么做。

类型 2:

在这种类型中,我没有 M 和 F 之间的关系。但是我可以看出当 MF 有更多的概率。即,样本为 1/样本总数

对于男性,

(4/5)

对于女性,

(2/4)

WKT,

(4/5) > (2/4)

这种柱子应该怎么替换?

对于这个问题,我可以用 (4/5) 替换 M,用 (2/4) 替换 F 吗?

处理列的正确方法是什么?

帮助我更好地理解这一点。

最佳答案

对分类数据进行编码的方法有很多种,其中一些方法取决于您打算用它做什么。例如,很容易成为最受欢迎选择的 one-hot-encoding 是 extremely poor choice。如果您计划使用决策树/随机森林/GBM。

关于你上面的T恤,你可以给pandas categorical type下单:

df['T-size'].astype(pd.api.types.CategoricalDtype(['S','M','L'],ordered=True)).

如果您像那样设置您的 T 恤,那么您的 .cat.codes 方法将完美运行。这也意味着您可以轻松使用 scikit-learn 的 LabelEconder,它非常适合管道。

关于性别编码,在使用目标变量(您的Label)时需要非常小心。您不想在训练-测试拆分之前进行此编码,否则您将使用未见数据的知识,使其并非真正未见。如果您使用交叉验证,这会变得更加复杂,因为您需要在每次 CV 迭代中进行编码(即每次折叠新编码)。如果你想这样做,我建议你查看TargetEncoder来自 skcontribs Category Encoders 但同样,一定要在 sklearn Pipeline 中使用它,否则你会弄乱训练测试拆分并将测试集中的信息泄漏到你的训练集中。

关于python - 如何处理分类数据以在机器学习中进行预处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53478046/

相关文章:

python - 分类器中是否正确选择和使用了所有特征?

python - 逐行阅读 .txt 单词列表时如何获得正确的哈希值?

python - pandas中groupby后按条件计数

python - Pandas 检查时间序列的连续性

r - 通过连接列连接两个数据框

python - 在计算文本文档集合中的单词出现次数时遇到问题

python - overrideredirect(True) 后重制窗口在调整大小后移动困难

python - 如何从我创建的函数创建循环和新数据集?

返回包含数据框中所有变量的最大值的列

python - 将数据帧向量添加到数据帧表