将 pandas 间隔转换为字符串(并再次返回)

Converting a pandas Interval into a string (and back again)

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

但是pandas.qcut的输出是一个Intervals列表,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是传入随机森林的变量之一。

然而,这个系统的目的是训练一个随机森林,将它保存到一个文件中,然后允许某人在以后加载它并获得新测试实例的分类,这在训练时间。而且因为分类器是在离散化数据上训练的,所以新的测试实例在使用之前需要被离散化。所以我希望能够做的是在一个新实例中读取,将已经建立的离散化方案应用于它,将其转换为字符串,然后 运行 通过随机森林。但是,我正在挂断 'apply the discretization scheme' 的最佳方式。

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

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

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]

使用 qcut and use pandas Categorical 中的 labels 参数。

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

然后流程进行:

cutting => categoricals => encoding

而且您不再需要手动操作。

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