我试图从许多连续特征中预测二进制(分类)目标,并希望在进入模型拟合之前缩小特征空间。我注意到SKLearn的Feature Selection包中的SelectKBest类在Iris数据集上有以下示例(它还预测来自连续特征的二进制目标):
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检验来检验分类变量是否依赖于连续变量?
答案 0 :(得分:0)
带有chi2测试的SelectKBest函数仅适用于分类数据。实际上,只有该功能只有1和0时,测试结果才具有实际意义。
如果您稍微检查一下chi2的实现,您将看到代码仅对每个功能应用了总和,这意味着该功能仅需要二进制值。另外,接收chi2函数的参数表示以下内容:
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).
这意味着该函数希望接收其所有样本的特征向量。但是稍后在计算期望值时,您将看到:
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时,这些代码行才有意义。
答案 1 :(得分:0)
我同意@lalfab,但是我不清楚为什么sklearn提供了一个示例,该示例在具有所有连续变量的虹膜数据集上使用chi2。 https://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.SelectKBest.html
>>> 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)
答案 2 :(得分:0)
我对此的理解是,当使用Chi2进行特征选择时,因变量必须是分类类型,但是自变量可以是分类变量,也可以是连续变量,只要它是非负数即可。该算法试图做的是首先以矩阵格式构建一个列联表,该列表显示变量的多元频率分布。然后尝试使用此列联表找到变量基础的依存关系结构。 Chi2是衡量依赖性的一种方法。
摘自Wikipedia的列联表(https://en.wikipedia.org/wiki/Contingency_table,2020-07-04):
列联表的标准内容
- 多列(从历史上看,它们被设计为用完打印页面的所有空白)。如果每一行指的是人口中的特定子组(在这种情况下为男性或女性),则这些列有时被称为标语标记或切点(这些行有时被称为存根)。
- 重要性检验。通常,要么进行列比较(用于测试列之间的差异并使用字母显示这些结果),要么进行单元格比较(使用颜色或箭头来标识表格中以某种方式突出的单元格)。
- 网或网是小计。
- 一个或多个:百分比,行百分比,列百分比,索引或平均值。
- 未加权的样本量(计数)。
基于此,可以轻松地将纯二进制特征总结为计数,这就是人们通常进行的Chi2测试。但是只要这些特征是非负的,就可以始终以一种“有意义的”方式将其累积在列联表中。在sklearn实现中,其总和为feature_count = X.sum(axis=0)
,然后平均为class_prob
。