Ama*_*nda 9 python binning pandas random-forest discretization
我对 Python 比较陌生,正在尝试准备一些数据来训练 RandomForest。由于各种原因,我们希望数据是离散的,所以有几个连续的变量需要离散化。我qcut在 Pandas 中找到了它,它似乎可以做我想做的事 - 我可以设置多个垃圾箱,它会将变量离散化到那么多垃圾箱中,试图保持每个垃圾箱中的计数均匀。
但是,输出的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)
Run Code Online (Sandbox Code Playgroud)
然后 str_cuts 是传入随机森林的变量之一。
但是,该系统的目的是训练 RandomForest,将其保存到文件中,然后允许某人在以后加载它并获得新测试实例的分类,这在训练时是不可用的。并且因为分类器是在离散化数据上训练的,所以新的测试实例需要在使用前进行离散化。所以我希望能够做的是在一个新实例中读取,将已经建立的离散化方案应用于它,将其转换为字符串,然后在随机森林中运行它。但是,我对“应用离散化方案”的最佳方式感到困惑。
有没有简单的方法来处理这个问题?我认为没有直接的方法可以将字符串转换回间隔。我可以从离散化(例如:)中获取所有 Interval 值的列表cuts.unique()并在测试时应用它,但这需要在随机森林旁边保存/加载离散化字典,这看起来很笨重,我担心会遇到问题试图重新创建一个分类变量(主要来自 R,它对分类变量的格式非常讲究)。或者还有其他我没有看到的解决方法吗?
使用labels中的参数qcut和 use pandas Categorical。
其中任何一个都可以帮助您为变量创建类别而不是间隔。然后,您可以使用某种形式的编码(例如标签编码或序数编码)将类别(如果您习惯使用 R,则为因子)转换为森林能够使用的数值。
然后流程是:
cutting => categoricals => encoding
Run Code Online (Sandbox Code Playgroud)
并且您不再需要手动完成。
最后,一些梯度增强树库支持分类变量,尽管它不是灵丹妙药,并且取决于您的目标。请参阅catboost和lightgbm。
| 归档时间: |
|
| 查看次数: |
6262 次 |
| 最近记录: |