为什么我得到的相关性和互信息很少?
Why I'm getting small score of correlation and mutual information?
我正在为二进制分类问题生成随机样本:
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(正或负),最低可达零左右,正如在 random 中预期的那样数据;为简洁起见,保留 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”是不准确的。
类似的论点也适用于互信息。
我正在为二进制分类问题生成随机样本:
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(正或负),最低可达零左右,正如在 random 中预期的那样数据;为简洁起见,保留 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”是不准确的。
类似的论点也适用于互信息。