我正在为二分类问题生成随机样本:
X, y = make_classification(n_features=40, n_redundant=4, n_informative=36,n_clusters_per_class=2, n_samples=50000)
我想检查特征与目标之间的相关性(用于特征选择
步骤)。
我使用了两种不同的方法:
1. 相关性(皮尔逊)2. 互信息
对于这两种方法,我得到的特征与目标之间的得分都很低。
互信息:
from sklearn.feature_selection import mutual_info_classif res1 = mutual_info_classif(X, y)
相关性:
df = pd.DataFrame(data=X)df['Taregt'] = yres2 = df.apply(lambda x: x.corr(df['Taregt']))
对于这两种方法,我得到的结果都低于0.4
为什么我的得分很低?我期望得到更高的得分?我遗漏了什么?
回答:
这是一个由scikit-learn的便捷函数make_classification
生成的人工随机分类数据集。绝对没有理由期望特征与标签之间的相关系数会落在某个特定的值范围内。实际上,一个简单的实验表明,确实存在一系列的相关系数值,从高达约0.65(正值或负值)到接近零,正如在这种随机数据中所预期的那样;为了简洁,保持n_features=10
:
from sklearn.datasets import make_classificationfrom sklearn.feature_selection import mutual_info_classifimport pandas as pdfor i in range(10): X, y = make_classification(n_features=10, n_redundant=4, n_informative=6,n_clusters_per_class=2, n_samples=50000) df = pd.DataFrame(data=X) df['Target'] = y res2 = df.apply(lambda x: x.corr(df['Target'])) print(res2)
结果:
0 -0.2996191 0.0198792 -0.2712263 0.3246324 -0.2998245 0.2775746 0.0284627 0.3951188 0.2973979 0.001334Target 1.000000dtype: float640 -0.0085461 -0.1318752 0.0095823 0.3147254 0.2921525 0.0027546 0.2038957 0.0095308 -0.3146099 0.310828Target 1.000000dtype: float640 0.0619111 0.6482002 -0.2938453 0.0024024 0.5925915 -0.3875686 0.2774497 0.5742728 -0.4488039 -0.000266Target 1.000000dtype: float640 0.2893611 0.3068372 -0.5657763 0.0182114 -0.0016505 -0.0083176 -0.3182717 0.0258308 -0.0015119 0.461342Target 1.000000dtype: float640 0.3162921 0.2233312 -0.0018173 0.4237084 -0.4661665 -0.2837356 -0.2120397 0.3116008 -0.2923529 0.302497Target 1.000000dtype: float640 0.0063511 -0.0046312 -0.3311843 0.0839914 0.0022275 -0.0008836 -0.1239987 0.3747928 -0.0870079 0.530111Target 1.000000dtype: float640 -0.2788371 0.3603392 -0.4076223 -0.0264604 -0.2759855 -0.0074046 0.2959557 -0.2900088 0.2937109 0.138187Target 1.000000dtype: float640 0.0059731 -0.1828022 -0.0010293 -0.0009934 0.2075855 0.0021446 0.2989497 -0.2888918 -0.2772029 -0.203653Target 1.000000dtype: float640 0.2989331 0.0004612 -0.0048373 0.2902854 -0.0130165 -0.0032806 -0.1318177 0.0487338 -0.0329109 0.002162Target 1.000000dtype: float640 0.4948091 0.3820982 0.5493773 0.0046324 0.3005725 -0.4862026 -0.5819247 0.3000248 0.3082409 -0.398422Target 1.000000dtype: float64
仅从相关系数值来看,我们甚至无法确定哪些特征是有信息量的(这里是6个),哪些是冗余的(这里是4个)。
简而言之:这里没有什么需要解释的,再者,你所说的“低于0.4”并不准确。
类似的论点也适用于互信息。