#10.1 VT(方差阈值化)
from sklearn import datasets
from sklearn.feature_selection import VarianceThreshold#载入方差阈值函数
iris=datasets.load_iris()
features=iris.data
target=iris.target
thresholder=VarianceThreshold(threshold=0.5)#方差小于等于0.5的删除,含有信息比较少的列(特征)删除
features_high_variance=thresholder.fit_transform(features)#用thresholder规定的规则进行计算转换
features_high_variance[0:5]
array([[5.1, 1.4, 0.2],
[4.9, 1.4, 0.2],
[4.7, 1.3, 0.2],
[4.6, 1.5, 0.2],
[5. , 1.4, 0.2]])
#10.3 处理高度相关性的特征
import pandas as pd
import numpy as np
features=np.array([[1,1,1],#创建一个包含两个高度相关特征的特征矩阵(数组)
[2,2,0],
[3,3,1],
[4,4,0],
[5,5,1],
[6,6,0],
[7,7,1],
[8,7,0],
[9,7,1]])
dataframe=pd.DataFrame(features)#把数组转为数据框(表格)
corr_matrix=dataframe.corr().abs()#创建一个相关矩阵(由各列之间的相关系数组成),返回数据绝对值
print(corr_matrix)
0 1 2
0 1.000000 0.976103 0.000000
1 0.976103 1.000000 0.034503
2 0.000000 0.034503 1.000000
upper=corr_matrix.where(np.triu(np.ones(corr_matrix.shape),k=1).astype(np.bool))#点点还是逗号!
#triu上三角,tril下三角,ones函数返回给定形状和类型的数组##astype修改数据类型
to_drop=[column for column in upper.columns if any(upper[column]>0.95)]
#这里给定的是corr_matrix的形状和类型,第k条对角线上方的元素全部置零。
#k=0(默认值),为主对角线,k<0为主对角线左下方,k>0为主对角线右上方。
dataframe.drop(dataframe.columns[to_drop],axis=1)#显示去掉相关特征后的特征数据框
0
2
0
1
1
1
2
0
2
3
1
3
4
0
4
5
1
5
6
0
6
7
1
7
8
0
8
9
1
#10.4删除与分类任务不相关的特征
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2,f_classif
#分类型用卡方,数值型用F检验
from sklearn.datasets import load_iris
iris = load_iris()#分类型数据,计算特征和目标向量的卡方统计量
features=iris.data
target=iris.target
features=features.astype(int)#把数据转化为整数型
chi2_selector = SelectKBest(chi2, k=2)#选择k个最佳特征,卡方表示观测值和期望值之间的差异
features_kbest=chi2_selector.fit_transform(features,target)#进行计算、转化
print(features.shape)
print(features_kbest.shape)
(150, 4)
(150, 2)
fvalue_selector=SelectKBest(f_classif, k=2)#数值型使用F检验
features_kbest2=fvalue_selector.fit_transform(features,target)
print(features.shape)
print(features_kbest2.shape)#特征减少到2个特征
(150, 4)
(150, 2)
#10.4的第二种方法
from sklearn.feature_selection import SelectPercentile
fvalue_selector2=SelectPercentile(f_classif,percentile=75)#选择前75%的特征
features_kbest3=fvalue_selector2.fit_transform(features,target)#进行计算、转化
print(features.shape)
print(features_kbest3.shape)
(150, 4)
(150, 3)
#10.5 递归式消除(递归式:自己调用自己)
from sklearn.datasets import make_regression#用于生成可回归的数据
from sklearn.feature_selection import RFECV
from sklearn import datasets,linear_model
features,target=make_regression(n_samples=10000,#生成一万个样本
n_features=100,#每个样本特征为100个
n_informative=2,#对回归有效的特征数量
random_state=1)#相当于种子数
ols=linear_model.LinearRegression()
rfecv=RFECV(estimator=ols,step=1,scoring="neg_mean_squared_error")
#训练模型为最小二乘法,步长为1,评估使用均方误差
rfecv.fit(features,target)
rfecv.transform(features)
rfecv.n_features_#查看最优特征数量
9
rfecv.support_#查看哪些特征应该被保留
array([False, False, False, False, False, True, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, True, True, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, True, False, False, False, False,
False, False, False, True, True, True, False, False, False,
False, True, True, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, False, False,
False])
rfecv.ranking_#查看特征排名,和上面的对比,差一个下划线
array([88, 59, 42, 81, 92, 1, 65, 55, 58, 38, 73, 3, 37, 35, 84, 48, 61,
28, 11, 79, 17, 13, 33, 27, 14, 30, 32, 20, 78, 16, 2, 40, 4, 75,
82, 62, 54, 86, 1, 1, 64, 67, 19, 51, 91, 71, 9, 26, 90, 63, 39,
83, 77, 10, 36, 80, 52, 47, 1, 44, 29, 60, 68, 72, 70, 23, 1, 1,
1, 25, 6, 18, 41, 1, 1, 56, 7, 66, 57, 74, 69, 24, 76, 5, 50,
8, 12, 34, 89, 22, 15, 31, 46, 53, 21, 87, 85, 43, 45, 49])