在上一讲的数据预处理后,我们可以进行有意义的特征进行选择。
方差:在概率学里,方差是衡量随机变量或一组数据的离散程度,值越大,离散程度越大。
那么在数据分析/机器学习中,某个特征的数据的方差值越小,则说明这个值的离散程度很小,变化程度小,因此有很多大概率对target的影响没那么大,因此可以选择舍弃此特征。相反,如果方差值越大,则说明特征值在不同样本里的变化程度也大,有很大概率对target有很大的详细程度,应保留。
from sklearn.feature_selection import VarianceThreshold
# 设定阈值threshold,方差大于阈值,则选择
VT = VarianceThreshold(threshold=3)
vt_data = VT.fit_transform(iris.data)
# 从下面值可以看出,特征选择之后,只保留了一个特征
# ((150, 4), (150, 1))
print(iris.data.shape, vt_data.shape)
相关系数法:计算各个特征值对target值的相关系数的pearson值,公式为:
手写计算皮尔逊值的函数:
def pearson(vector1, vector2):
n = len(vector1)
#simple sums
sum1 = sum(float(vector1[i]) for i in range(n))
sum2 = sum(float(vector2[i]) for i in range(n))
#sum up the squares
sum1_pow = sum([pow(v, 2.0) for v in vector1])
sum2_pow = sum([pow(v, 2.0) for v in vector2])
#sum up the products
p_sum = sum([vector1[i]*vector2[i] for i in range(n)])
#分子num,分母den
num = p_sum - (sum1*sum2/n)
den = math.sqrt((sum1_pow-pow(sum1, 2)/n)*(sum2_pow-pow(sum2, 2)/n))
if den == 0:
return 0.0
return num/den
当然,还是不要用自己的吧,不高效,哈哈。
from sklearn.feature_selection import SelectKBest # 移除得分前K名以外的特征,即只保留TopK的特征
from scipy.stats import pearsonr # scipy.stats.pearsonr库里计算的pearson相关系数
import numpy as np
# 创建一个计算多个特征的pearson系数的函数
def multiFeature_pearsonr(X, y):
'''
params: X: 输入特征
y: 输入标签
'''
scores, p_values = [], []
for ret in map(lambda x:pearsonr(x, y), X.T):
scores.append(abs(ret[0]))
p_values.append(ret[1])
return (np.array(scores), np.array(p_values))
sk = SelectKBest(score_func=multiFeature_pearsonr, k=2) # 选择top2
x_pearson = sk.fit_transform(iris.data, iris.target) # 会自动调用multiFeature_pearsonr(X, y)函数
# (150, 2)
print(x_pearson.shape)
卡方检验:该方法就是检验定性自变量对因变量的相关性。假设自变量有N种取值,因变量有M种取值,考虑自变量等于i且因变量等于j的样本频数的观察值与期望的差距,构建统计量:
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
sk_chi2 = SelectKBest(score_func=chi2, k=2)
chi2_data = sk_chi2.fit_transform(iris.data, iris.target)
# (150, 2)
print(chi2_data.shape)
互信息法:也是检验自变量与因变量之间的相互依赖性的亮度,不同于相关系数,互信息计算公式为:
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import mutual_info_classif
sk_mi = SelectKBest(mutual_info_classif, k=2)
mi_data = sk_mi.fit_transform(iris.data, iris.target)
# (150, 2)
print(mi_data.shape)
编文不易,github地址,欢迎star/follow:https://github.com/Gary-Deeplearning/sklearn-study-note