gpt4 book ai didi

Python:如何正确处理 pandas DataFrame 中的 NaN,以便在 scikit-learn 中进行特征选择

转载 作者:行者123 更新时间:2023-11-28 16:33:50 24 4
gpt4 key购买 nike

这与我发布的问题有关here但这个更具体、更简单。

我有一个 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']

我现在的目标是对事件/列进行特征选择,从最基本的基于方差的方法开始:去除方差低的那些。然后我会查看事件的线性回归,并只保留那些具有大系数和小 p 值的事件。

但我的问题是我有太多 NaN,我不确定处理它们的正确方法是什么,因为大多数 scikit-learn 方法都会因为它们而给我错误。一种想法是用 -1 替换“未参加”,用 0 替换“未受邀”,但我担心这会改变事件的重要性。

谁能建议在不改变每个特征/事件的统计显着性的情况下处理所有这些 NaN 的正确方法?

编辑:我想补充一点,如果有一个合理的指标可以让我继续进行特征选择,我很乐意从上面更改我的“成功”指标.我只是想确定哪些事件可以有效地吸引用户兴趣。它非常开放,主要是练习特征选择。

谢谢!

最佳答案

如果我理解正确,您希望从 NaN 中清除数据而不显着改变其中的统计属性 - 以便您可以在事后运行一些分析。

我实际上最近遇到了类似的事情,您可能感兴趣的一种简单方法是使用 sklearn 的“Imputer”。正如 EdChum 前面提到的,一种想法是用轴上的均值代替。其他选项包括例如用中位数替换。

类似于:

from sklearn.preprocessing import Imputer
imp = Imputer(missing_values='NaN', strategy='mean', axis=1)
cleaned_data = imp.fit_transform(original_data)

在这种情况下,这会将 NaN 替换为每个轴上的平均值(例如,让我们按事件估算,因此轴 = 1)。然后,您可以对清理后的数据进行舍入以确保获得 0 和 1。

我会按事件为数据绘制一些直方图,以健全地检查这种预处理是否显着改变了你的分布——因为我们可能通过将如此多的值交换为均值/众数/中值而引入了太多的偏差每个轴。

引用链接:http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.Imputer.html

更进一步(假设以上还不够),您可以交替执行以下操作:

  • 获取数据中的每个事件列,并在删除所有 nan 数字后计算参加 ('p') 与不参加 ('1 - p') 的概率。 [IE。 p = 出席/(出席+未出席)]
  • 然后使用伯努利分布生成的随机数替换每个事件列中的 NaN 数,我们将其与您估计的“p”相匹配,大致如下:

    将 numpy 导入为 np

    n = 1 # 试验次数

    p = 0.25 # 每次试验的估计概率(即替换为参加人数/总人数)

    s = np.random.binomial(n, p, 1000)

    # s 现在随机包含一堆 1 和 0,您可以将每列上的 NaN 值替换为

同样,这本身并不完美,您最终仍然会略微偏向您的数据(例如,更准确的方法是考虑每个用户跨事件的数据依赖性)——但通过从一个大致匹配的分布,这至少应该比用平均值等任意替换更稳健。

希望这对您有所帮助!

关于Python:如何正确处理 pandas DataFrame 中的 NaN,以便在 scikit-learn 中进行特征选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29110135/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com