我对 Python 相对较新,并且正在尝试准备一些数据以训练一个 RandomForest。由于各种原因,我们希望数据是离散的,所以有一些连续变量需要被离散化。我在 pandas 中找到了 qcut
函数,它似乎可以做到我想要的 - 我可以设置一定数量的 bins,它会将变量离散化为那么多个 bins,尽可能保持每个 bin 中的计数平衡。
然而,pandas.qcut
的输出是一组区间(Intervals),而 scikit-learn 中的 RandomForest 分类器需要一个字符串。我发现可以使用 .astype(str)
将一个区间转换为字符串。以下是我正在进行的一个快速示例:
# 将 'age' 变量离散化为 3 个 bins df['age_range'] = pd.qcut(df['age'], q=3)
# 将 'age_range' 转换为字符串类型 df['age_range_str'] = df['age_range'].astype(str)
# 创建一个随机森林分类器 rf = RandomForestClassifier()
# 使用离散化后的 'age_range_str' 变量拟合模型 rf.fit(df[['age_range_str', 'income']], ['low', 'low', 'medium', 'high', 'high']) ```
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,它对分类变量的格式非常特别)。或者是否有其他我没看到的解决办法?