首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用chi2测试进行具有连续特征的特征选择(Scikit Learn)

使用chi2测试进行具有连续特征的特征选择(Scikit Learn)
EN

Stack Overflow用户
提问于 2018-04-16 06:44:02
回答 4查看 2.1K关注 0票数 5

我正在尝试从许多连续的特征中预测一个二元(分类)目标,并希望在进入模型拟合之前缩小您的特征空间。我注意到SKLearn的特征选择包中的SelectKBest类在虹膜数据集上有以下示例(它也是从连续的特征中预测一个二元目标):

代码语言:javascript
复制
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
iris = load_iris()
X, y = iris.data, iris.target
X.shape
(150, 4)
X_new = SelectKBest(chi2, k=2).fit_transform(X, y)
X_new.shape
(150,2)

该示例使用chi2测试来确定应该在模型中使用哪些功能。然而,我的理解是,chi2测试严格意义上是为了在我们具有预测分类性能的分类特征的情况下使用。我不认为chi2测试可以用于这样的场景。我的理解是错的吗?chi2检验是否可以用来检验分类变量是否依赖于连续变量?

EN

回答 4

Stack Overflow用户

发布于 2019-03-21 10:47:08

带有chi2测试的SelectKBest函数仅适用于分类数据。事实上,只有当特征只有1和0时,测试结果才有真正的意义。

如果你稍微检查一下chi2的实现,你会发现代码只对每个功能应用了一个和,这意味着该函数只需要二进制值。此外,接收chi2函数的参数表示以下内容:

代码语言:javascript
复制
def chi2(X, y):
...

X : {array-like, sparse matrix}, shape = (n_samples, n_features_in)
    Sample vectors.
y : array-like, shape = (n_samples,)
    Target vector (class labels).

这意味着该函数期望接收具有其所有样本的特征向量。但稍后当计算出期望值时,您将看到:

代码语言:javascript
复制
feature_count = X.sum(axis=0).reshape(1, -1)
class_prob = Y.mean(axis=0).reshape(1, -1)
expected = np.dot(class_prob.T, feature_count)

只有当X和Y向量只有1和0时,这些代码行才有意义。

票数 5
EN

Stack Overflow用户

发布于 2019-05-06 06:31:29

我同意@lalfab,但是我不清楚为什么sklearn提供了一个在所有连续变量的虹膜数据集上使用chi2的例子。https://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.SelectKBest.html

代码语言:javascript
复制
>>> from sklearn.datasets import load_digits
>>> from sklearn.feature_selection import SelectKBest, chi2
>>> X, y = load_digits(return_X_y=True)
>>> X.shape
(1797, 64)
>>> X_new = SelectKBest(chi2, k=20).fit_transform(X, y)
>>> X_new.shape
(1797, 20)

票数 3
EN

Stack Overflow用户

发布于 2020-07-04 21:30:29

我对此的理解是,当使用Chi2进行特征选择时,因变量必须是类别类型,但自变量可以是类别变量,也可以是连续变量,只要它是非负的。该算法试图做的是首先建立一个矩阵格式的列联表,揭示变量的多变量频率分布。然后尝试使用此列联表找到变量背后的依赖结构。Chi2是测量依赖性的一种方法。

来自维基百科上的权变表(https://en.wikipedia.org/wiki/Contingency_table,2020-07-04):

列联表的标准目录

  • 多列(过去,它们的设计用完了打印页的所有空白)。其中每一行指的是总体中的特定子组(在这种情况下是男性或女性),列有时被称为横标点或切割(行有时被称为stubs).
  • Significance测试)。通常,要么是列比较(用于测试列之间的差异并使用字母显示这些结果),要么是单元格比较(使用颜色或箭头来标识以某种方式突出显示的表中的单元格)。百分比、行百分比、列百分比、索引或averages.
  • Unweighted样本大小(计数)的
  • Net或Nets:百分比、行百分比、列百分比、索引或计数

基于此,纯二进制特征可以很容易地总结为计数,这是人们通常进行Chi2测试的方式。但只要这些特征是非负的,人们就可以以一种“有意义的”方式将其累积到列联表中。在sklearn实现中,它总结为feature_count = X.sum(axis=0),然后在class_prob上求平均值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49847493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档