python - 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。
解决方案
是的,它们确实给出了不同的结果。我认为你应该相信 scipy 的结果,而拒绝 sklearn 的结果。
但让我提供我的推理细节,因为我可能是错的。
我最近观察到与您描述的类似的效果,数据集包含 300 个数据点:两个 chi2 实现的结果确实不同。在我的情况下,差异是惊人的。我在这篇文章中详细描述了这个问题,然后是这个交叉验证的讨论线程,我还向 sklearn 提交了一个错误请求,可在此处查看。
我的研究的附加价值(如果有的话)似乎是scipy 实现提供的结果似乎是正确的,而 sklearn 的结果是不正确的。详情请参阅文章。但我只关注我的样本,所以结论可能并不普遍正确。遗憾的是,源代码分析超出了我的能力范围,但我希望这个输入可以帮助某人改进代码,或者在错误时反驳我的推理。
推荐阅读
- javascript - TypeScript/JavaScript 中未找到模块错误
- sapui5 - 为什么要用 `FragmentDefinition` 包装`Dialog`?
- git - Git 扩展无法推送
- umbraco - 创建不在 Umbraco9 RC3 中工作的后端用户
- javascript - 如何将 Docusign 的电子签名 API 与 .NET 后端和 Angular + Devextreme 前端集成?
- druid - 使用 theta sketch 计算广告展示次数和取消用户数量
- arduino-uno - HC-05 与 Arduino Uno 将数据从手机发送到 hc-05
- react-native - 如何从 Expo 管理的工作流程中删除权限?
- php - Laravel 划分查询覆盖以前的变量
- sql - Sqlite 从多个表中选择