我一直在开发一个工具,可以自动预处理 pandas.DataFrame 格式的数据。在此预处理步骤中,我想以不同的方式处理连续数据和分类数据。特别是,我希望能够应用 OneHotEncoder 等only分类数据。
现在,假设我们提供了一个 pandas.DataFrame 并且没有有关 DataFrame 中数据的其他信息。用于确定 pandas.DataFrame 中的列是否是分类的好的启发式是什么?
我最初的想法是:
1)如果列中有字符串(例如列数据类型为object
),那么该列很可能包含分类数据
2) 如果列中某些百分比的值是唯一的(例如,>=20%),则该列很可能包含连续数据
我找到了1)
工作正常,但是2)
效果不太好。我需要更好的启发法。你会如何解决这个问题?
Edit:有人要求我解释原因2)
效果不好。在一些测试用例中,我们的列中仍然有连续值,但列中没有很多唯一值。启发式在2)
在那种情况下显然失败了。还有一个问题是,我们的分类列有很多很多唯一值,例如泰坦尼克号数据集中的乘客姓名。存在相同列类型错误分类问题。
这里有几种方法:
-
求唯一值的数量与唯一值总数的比率。像下面这样的东西
likely_cat = {}
for var in df.columns:
likely_cat[var] = 1.*df[var].nunique()/df[var].count() < 0.05 #or some other threshold
-
检查前n个唯一值是否占所有值的一定比例
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) 会更好。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)