我有一个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']
的分布在"convergence in distribution"的意义上尽可能接近正常。
我查看了scikit-learn
"功能选择"方法here和"单变量特征选择"看起来很有道理。但我对pandas
和scikit-learn
都很新,并且可以真正使用有关如何在代码中实现此功能的帮助。
约束:我需要保持至少原始事件的一半。
非常感谢任何帮助。请分享尽可能多的详细信息,我对这些库非常陌生,并希望看到如何使用我的DataFrame执行此操作。
谢谢!
编辑:在scikit-learn
功能选择方法中查看更多内容后,"递归功能选择"看起来它似乎也有意义,但我不确定如何用我的"准确性来构建它#34;公制是"接近正态分布均值..."
答案 0 :(得分:0)
请注意,功能选择是选择要素,而不是样本,即(通常)DataFrame
的列,而不是行。所以,我不确定功能选择是否符合您的要求:我知道您要删除导致分布偏差的样本吗?
此外,关于特征缩放(例如标准化)如何使您的数据变为正态分布,均值= 0且sd = 1?
方程式只是z =(x - mean)/ sd
要将其应用于您的DataFrame,您只需执行
即可my_data['success'] = (my_data['success'] - my_data['success'].mean(axis=0)) / (my_data['success'].std(axis=0))
但是,不要忘记保留均值和SD参数来转换测试数据。或者,您也可以使用scikit-learn
中的StandardScaler