将熊猫间隔转换为字符串(然后再返回)

Posted

技术标签:

【中文标题】将熊猫间隔转换为字符串(然后再返回)【英文标题】:Converting a pandas Interval into a string (and back again) 【发布时间】:2019-12-30 09:43:32 【问题描述】:

我对 Python 比较陌生,正在尝试准备一些数据来训练 RandomForest。由于各种原因,我们希望数据是离散的,所以有几个连续变量需要离散化。我在 pandas 中找到了qcut,这似乎可以满足我的要求 - 我可以设置多个 bin,它会将变量离散化到那么多 bin 中,试图保持每个 bin 中的计数均匀。

但是,pandas.qcut 的输出是一个区间列表,scikit-learn 中的 RandomForest 分类器需要一个字符串。我发现我可以使用.astype(str) 将区间转换为字符串。这是我正在做的一个简单示例:

import pandas as pd
from random import sample

vals = sample(range(0,100), 100)
cuts = pd.qcut(vals, q=5)
str_cuts = pd.qcut(vals, q=5).astype(str)

然后 str_cuts 是传入随机森林的变量之一。

但是,该系统的目的是训练 RandomForest,将其保存到文件中,然后允许某人在以后加载它并获得新测试实例的分类,这在训练时不可用.并且由于分类器是在离散化数据上训练的,新的测试实例需要在使用之前进行离散化。所以我想要做的是在一个新实例中读取,将已经建立的离散化方案应用于它,将其转换为字符串,然后通过随机森林运行它。但是,我对“应用离散化方案”的最佳方式感到困惑。

有没有简单的方法来处理这个问题?我认为没有直接的方法可以将字符串转换回间隔。我可以从离散化中获取所有 Interval 值的列表(例如:cuts.unique())并在测试时应用它,但这需要在随机森林旁边保存/加载离散化字典,这看起来很笨重,我担心尝试重新创建分类变量时遇到问题(主要来自 R,它对分类变量的格式非常特别)。还是有其他我没有看到的解决方法?

【问题讨论】:

【参考方案1】:

qcut 中使用labels 参数并使用pandas Categorical

其中任何一个都可以帮助您为变量创建类别而不是区间。然后,您可以使用某种编码形式,例如 Label Encoding 或 Ordinal Encoding 将类别(如果您习惯于 R,则为因子)转换为 Forest 将能够使用的数值。

然后流程进行:

cutting => categoricals => encoding

您不再需要手动操作。

最后,一些梯度提升树库支持分类变量,尽管它不是灵丹妙药,取决于您的目标。请参阅catboost 和lightgbm。

【讨论】:

那么,当我得到一个新的测试实例并需要将其转换为相同的类别时,我该怎么办?我希望不需要将完整的训练数据传递给测试脚本,因此我需要存储“cutting => categoricals”转换,或者能够以某种方式从随机森林中恢复该转换。我的问题并不是真正的 qcut 输出间隔 - 我只是想找到能够在以后重新应用离散化的最干净的方法。抱歉,如果我的问题不清楚。 我提到的编码器支持inverse_transform,这正是你想要的。否则,您可以将映射保存为字典。【参考方案2】:

虽然它可能不是最简洁的方法,但确实可以将字符串转换回区间:

import pandas as pd
str_intervals = [i.replace("(","").replace("]", "").split(", ") for i in str_cuts]
original_cuts = [pd.Interval(float(i), float(j)) for i, j in str_intervals]

【讨论】:

以上是关于将熊猫间隔转换为字符串(然后再返回)的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中将文本字符串列表转换为熊猫数据框?

php将一维数组转换为字符串并自定义间隔符号

熊猫 datetime64 到字符串

如何将熊猫中的timedelta列转换为字符串

熊猫将数字转换为字符串 - 意外结果

将字符串日期时间转换为熊猫日期时间