Python: sci-kit learn中针对正态分布的特征选择

3
我有一个名为 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,标准差为0.10的正态分布。当我查看my_data['success']的直方图时,它不是正态分布且向左倾斜。这在现实中是否属实并不重要,我只想解决下面的技术问题。
因此,我的问题是:有一些事件使成功数据偏离正常,我认为这些事件不是“好”的。我想对我的事件进行“特征选择”,以选择其中的子集,使my_data['success']的分布尽可能接近正态分布,即"收敛于分布"
我看了一下scikit-learn的“特征选择”方法这里,“单变量特征选择”似乎是有道理的。但是,我对pandas和scikit-learn都非常陌生,真的需要帮助来实际编写代码。
约束条件:我需要保留至少一半的原始事件。
任何帮助将不胜感激。请尽可能分享细节,我对这些库非常陌生,很想看看如何在我的DataFrame中实现此操作。
谢谢!
编辑:在进一步查看scikit-learn的特征选择方法后,“递归特征选择”似乎也可能有意义,但我不确定如何建立它,同时我的“准确性”指标为“接近正态分布,均值为...”

“成功”怎么可能服从正态分布呢?它的下限是0,上限是1(除非有人参加比邀请多的活动,那么上限可能会更高)。正态分布没有上下限,你面对的是一个贝塔分布 ;) - swenzel
1个回答

0
请记住,特征选择是选择特征而不是样本,即通常是您的DataFrame的列而不是行。因此,我不确定特征选择是否是您想要的:我理解您想要删除导致分布偏斜的那些样本?
另外,特征缩放怎么样,例如标准化,使得您的数据变成均值为0,标准差为1的正态分布呢?
方程式很简单,即z =(x-mean)/ sd
要将其应用于您的DataFrame,您可以简单地执行
my_data['success'] = (my_data['success'] - my_data['success'].mean(axis=0)) / (my_data['success'].std(axis=0))

然而,不要忘记保留均值和标准差参数以转换您的测试数据。或者,您也可以使用scikit-learn中的StandardScaler


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接