我有一个pandas
DataFrame,其索引是唯一用户标识符、与唯一事件对应的列以及值 1(已参加)、0(未参加)或 NaN(未受邀请/不相关)。相对于 NaN,该矩阵相当稀疏:有数百个事件,而大多数用户最多只被邀请参加数十个。
我创建了一些额外的列来衡量“成功”,我将其定义为相对于邀请的参加百分比:
my_data['invited'] = my_data.count(axis=1)
my_data['attended'] = my_data.sum(axis=1)-my_data['invited']
my_data['success'] = my_data['attended']/my_data['invited']
假设以下内容为真:成功数据应服从均值 0.80 和 s.d 的正态分布。 0.10。当我查看直方图时my_data['success']
它不正常并且向左倾斜。这在现实中是否属实并不重要。我只是想解决我下面提出的技术问题。
所以这是我的问题:有些事件我认为并不“好”,因为它们使成功数据偏离了正常情况。我想对我的事件进行“特征选择”,以选择其中的一个子集,这使得分布my_data['success']
尽可能接近正常的意义上“分布收敛” http://en.wikipedia.org/wiki/Convergence_of_random_variables#Convergence_in_distribution.
我看了看scikit-learn
“特征选择”方法here http://scikit-learn.org/stable/modules/feature_selection.html“单变量特征选择”似乎是有道理的。但我对两者都很陌生pandas
and scikit-learn
并且确实可以使用有关如何在代码中实际实现此功能的帮助。
限制条件:我需要保留至少一半的原始事件。
任何帮助将不胜感激。请尽可能多地分享详细信息,我对这些库非常陌生,很想看看如何使用我的 DataFrame 来做到这一点。
Thanks!
EDIT: 又看了一些之后scikit-learn
特征选择方法,“递归特征选择”似乎在这里也有意义,但我不确定如何用我的“准确性”指标“接近正态分布且平均值......”来构建它
请记住,特征选择是选择特征,而不是样本,即(通常)您的列DataFrame
,而不是行。所以,我不确定特征选择是否是您想要的:我知道您想要删除那些导致分布倾斜的样本?
另外,特征缩放(例如标准化)怎么样,以便您的数据成为平均值 = 0 和 sd = 1 的正态分布?
方程很简单: z = (x - 平均值) / sd
要将其应用到您的 DataFrame,您只需执行以下操作
my_data['success'] = (my_data['success'] - my_data['success'].mean(axis=0)) / (my_data['success'].std(axis=0))
但是,也不要忘记保留均值和 SD 参数来转换测试数据。或者,您也可以使用StandardScaler http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html来自 scikit-learn
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)