Ran*_*son 21 python pandas scikit-learn
我一直在开发一种自动预处理pandas.DataFrame格式数据的工具.在此预处理步骤中,我希望以不同方式处理连续和分类数据.我特别希望能够适用,例如,一个OneHotEncoder来只中的分类数据.
现在,让我们假设我们提供了一个pandas.DataFrame,并且没有关于DataFrame中数据的其他信息.用于确定pandas.DataFrame中的列是否属于分类的良好启发式方法是什么?
我最初的想法是:
1)如果列中有字符串(例如,列数据类型是object
),则该列很可能包含分类数据
2)如果列中某些值的值是唯一的(例如,> = 20%),那么该列很可能包含连续数据
我发现1)
工作正常,但2)
还没有很好地完成.我需要更好的启发式方法.你会如何解决这个问题?
编辑:有人要求我解释为什么2)
效果不好.在某些测试案例中,我们仍然在列中有连续值,但列中的唯一值不多.2)
在这种情况下,启发式显然失败了.还有一些问题,我们有一个分类列,其中有许多独特的值,例如泰坦尼克号数据集中的乘客名称.那里有相同的列类型错误分类问题.
Ris*_*ava 24
以下是几种方法:
查找唯一值的数量与唯一值的总数之比.像下面这样的东西
Run Code Online (Sandbox Code Playgroud)likely_cat = {} for var in df.columns: likely_cat[var] = 1.*df[var].nunique()/df[var].count() < 0.05 #or some other threshold
检查前n个唯一值是否占所有值的一定比例
Run Code Online (Sandbox Code Playgroud)top_n = 10 likely_cat = {} for var in df.columns: likely_cat[var] = 1.*df[var].value_counts(normalize=True).head(top_n).sum() > 0.8 #or some other threshold
方法1)对我来说通常比方法2)更好.但是如果存在"长尾分布",则方法2)更好,其中少数分类变量具有高频率而大量分类变量具有低频率.
有很多地方可以“窃取”可以转换为“数字”的格式定义。##,#e-# 将是这样的格式之一,只是为了说明。也许你能找到一个图书馆来做到这一点。我尝试先将所有内容都转换为数字,然后再将剩下的内容转换为数字,好吧,除了将它们保持为分类之外别无他法。
IMO 相反的策略,识别类别更好,因为它取决于数据的内容。从技术上讲,地址数据可以被认为是无序的分类数据,但通常我不会那样使用它。
对于调查数据,一个想法是寻找李克特量表,例如 5-8 个值,或者字符串(可能需要硬编码(和翻译)级别来查找“好”、“坏”、“同意。”、 “very .*”,...) 或 0-8 范围内的 int 值 + NA。
国家和类似的东西也可能是可识别的......
年龄组(“.- . ”)也可能有效。
归档时间: |
|
查看次数: |
6067 次 |
最近记录: |