首页 > 解决方案 > Scipy 和 Sklearn chi2 实现给出不同的结果

问题描述

我使用sklearn.feature_selection.chi2了特征选择并发现了一些意想不到的结果(检查代码)。有谁知道是什么原因,或者可以向我指出一些文档或拉取请求?

我将我得到的结果与手动和使用获得的预期结果进行了比较scipy.stats.chi2_contingency

编码:

import numpy as np
import pandas as pd
from scipy.stats import chi2_contingency
from sklearn.feature_selection import chi2, SelectKBest

x = np.array([[1, 1, 1, 0, 1], [1, 0, 1, 0, 0], [0, 0, 1, 1, 1], [0, 0, 1, 1, 0], [0, 0, 0, 1, 1], [0, 0, 0, 1, 0]])
y = np.array([1, 1, 2, 2, 3, 3])

scores = []
for i in range(x.shape[1]):
    result = chi2_contingency(pd.crosstab(x[:, i], y))
    scores.append(result[0])

sel = SelectKBest(score_func=chi2, k=3)
sel.fit(x, y)

print(scores)
print(sel.scores_)
print(sel.get_support())

结果是:

[6., 2.4, 6.0, 6.0, 0.0] (Expected)
[4. 2. 2. 2. 0.] (Unexpected)
[ True  True False  True False]

使用 scipy,它保留特征 0、2、3,而使用 sklearn,它保留特征 0、1、3。

标签: pythonmachine-learningscipyscikit-learnfeature-selection

解决方案


是的,它们确实给出了不同的结果。我认为你应该相信 scipy 的结果,而拒绝 sklearn 的结果。

但让我提供我的推理细节,因为我可能是错的。

我最近观察到与您描述的类似的效果,数据集包含 300 个数据点:两个 chi2 实现的结果确实不同。在我的情况下,差异是惊人的。我在这篇文章中详细描述了这个问题,然后是这个交叉验证的讨论线程,我还向 sklearn 提交了一个错误请求,可在此处查看

我的研究的附加价值(如果有的话)似乎是scipy 实现提供的结果似乎是正确的,而 sklearn 的结果是不正确的。详情请参阅文章。但我只关注我的样本,所以结论可能并不普遍正确。遗憾的是,源代码分析超出了我的能力范围,但我希望这个输入可以帮助某人改进代码,或者在错误时反驳我的推理。


推荐阅读