首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将pandas间隔转换为字符串(然后再转换回来)

将pandas间隔转换为字符串(然后再转换回来)
EN

Stack Overflow用户
提问于 2019-08-26 15:54:38
回答 2查看 7.4K关注 0票数 10

我是Python的新手,正在尝试准备一些数据来训练RandomForest。由于各种原因,我们希望数据是离散的,因此有一些连续变量需要离散化。我在pandas中发现了qcut,它似乎可以做我想做的事情--我可以设置一些存储箱,它会将变量离散到那么多的存储箱中,试图保持每个存储箱中的计数相等。

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

代码语言:javascript
复制
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,它对类别变量的格式非常特殊)时会遇到问题。或者有没有其他我看不到的办法呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-26 16:25:16

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

这两种方法都可以帮助您为变量创建类别,而不是间隔。然后,您可以使用一种编码形式,例如Label EncodingOrdinal Encoding,将类别(如果您习惯于R,则为因子)转换为森林将能够使用的数值。

然后这个过程就开始了:

代码语言:javascript
复制
cutting => categoricals => encoding

而且你不再需要手工操作了。

最后,一些gradient boosted库支持分类变量,但这不是灵丹妙药,这将取决于您的目标。参见catboostlightgbm

票数 3
EN

Stack Overflow用户

发布于 2019-08-26 16:19:20

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

代码语言:javascript
复制
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]
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57653844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档