我正在为二进制分类问题生成随机样本:
X, y = make_classification(n_features=40, n_redundant=4, n_informative=36,n_clusters_per_class=2, n_samples=50000)
我想检查特征和目标之间的相关性(对于feature selection
步骤(。
我使用两种不同的方法:
1. correlation (pearson)
2. mutual information
对于特征和目标之间的两种方法,我都得到了很小的分数。
相互信息:
from sklearn.feature_selection import mutual_info_classif
res1 = mutual_info_classif(X, y)
相关性:
df = pd.DataFrame(data=X)
df['Taregt'] = y
res2 = df.apply(lambda x: x.corr(df['Taregt']))
对于这两种方法,我得到的结果都小于0.4
为什么我得了小分?我希望得到更高的分数?我错过了什么?
这是一个人工生成的随机分类数据集,由scikit learn的便利函数make_classification
制作。绝对没有理由期望特征和标签之间的相关系数会有任何特定的值范围。事实上,一个简单的实验表明,确实存在一系列相关值,高达约0.65(正或负(,低至约零,正如在此类随机数据中所预期的那样;保持n_features=10
简洁::
from sklearn.datasets import make_classification
from sklearn.feature_selection import mutual_info_classif
import pandas as pd
for 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.299619
1 0.019879
2 -0.271226
3 0.324632
4 -0.299824
5 0.277574
6 0.028462
7 0.395118
8 0.297397
9 0.001334
Target 1.000000
dtype: float64
0 -0.008546
1 -0.131875
2 0.009582
3 0.314725
4 0.292152
5 0.002754
6 0.203895
7 0.009530
8 -0.314609
9 0.310828
Target 1.000000
dtype: float64
0 0.061911
1 0.648200
2 -0.293845
3 0.002402
4 0.592591
5 -0.387568
6 0.277449
7 0.574272
8 -0.448803
9 -0.000266
Target 1.000000
dtype: float64
0 0.289361
1 0.306837
2 -0.565776
3 0.018211
4 -0.001650
5 -0.008317
6 -0.318271
7 0.025830
8 -0.001511
9 0.461342
Target 1.000000
dtype: float64
0 0.316292
1 0.223331
2 -0.001817
3 0.423708
4 -0.466166
5 -0.283735
6 -0.212039
7 0.311600
8 -0.292352
9 0.302497
Target 1.000000
dtype: float64
0 0.006351
1 -0.004631
2 -0.331184
3 0.083991
4 0.002227
5 -0.000883
6 -0.123998
7 0.374792
8 -0.087007
9 0.530111
Target 1.000000
dtype: float64
0 -0.278837
1 0.360339
2 -0.407622
3 -0.026460
4 -0.275985
5 -0.007404
6 0.295955
7 -0.290008
8 0.293710
9 0.138187
Target 1.000000
dtype: float64
0 0.005973
1 -0.182802
2 -0.001029
3 -0.000993
4 0.207585
5 0.002144
6 0.298949
7 -0.288891
8 -0.277202
9 -0.203653
Target 1.000000
dtype: float64
0 0.298933
1 0.000461
2 -0.004837
3 0.290285
4 -0.013016
5 -0.003280
6 -0.131817
7 0.048733
8 -0.032910
9 0.002162
Target 1.000000
dtype: float64
0 0.494809
1 0.382098
2 0.549377
3 0.004632
4 0.300572
5 -0.486202
6 -0.581924
7 0.300024
8 0.308240
9 -0.398422
Target 1.000000
dtype: float64
单看相关值,我们甚至不能确定哪些特征是有信息的(这里是6(,哪些是冗余的(这里为4(。
简而言之:这里没有什么要解释的,加上你的">小于0.4"的发现是不准确的。
类似的论点也适用于相互信息。