移除变异度明显过低的特征
函数介绍
class sklearn.feature_selection.Variance Threshold(threshold=0.0)
默认设定将会移除模型中的常量
Variance Threshold类的属性:
variances_: array, shape (n_features,), 各特征列的方差值
代码解释
from sklearn.feature_selection import VarianceThreshold
X = [[0, 2, 0, 3],
[0, 1, 4, 3],
[0, 1, 1, 3]]
selector = VarianceThreshold()
selector.fit(X)
selector.variances_
selector.transform(X)
2.1. 筛选关联程度最高的特征
可以将分析范围聚集于核心特征
函数介绍
SelectKBest: 移除那些除了评分最高的K个特征之外的所有特征,即保留前K个特征
SelectPercentile: 移除除了用户指定的最高得分百分比之外的所有特征
class sklearn.feature_selection.SelectPercentile/SelectKBest(
score_func = < function f_classif >:用于计算评分的统计方法
f_classif:ANOVA F-value , 用于类别预测
mutual_info_classif: 类别预测中的共同信息,非参方法,样本量要求高
chi2:卡方检验
f_regression: 回归分析中的F-value
mutual_info_regression:数值预测中的共同信息
precentile=10: 用于SelectPercentile,希望保留的特征比例
k = 10:用于SelectKBest,希望保留的特征数量
)
SelectPercentile/SelectKBest类的属性
scores_: array-like, shape=(n_features,)
pvalues_: array-like, shape=(n_features,)
代码解释
from sklearn import datasets
boston = datasets.load_boston()
boston.data[:2]
from sklearn.feature_selection import SelectKBest, f_regression
# 由于是连续变量,因此用f_regression
# k=2前两个最重要的变量
X2 = SelectKBest(f_regression, k=2).fit_transform(boston.data, boston.target)
X2[:2]
运行结果
2.2 基于检验误差进行筛选
在单变量的基础上对特征进行筛选
SelectFpr:基于假阳性率的大小进行筛选
SelectFdr:基于伪发现率的大小进行筛选
SelectFwe:基于族系误差进行筛选
函数介绍
class sklearn.feature_selection.SelectFpr/SelectFdr/SelectFwe(
score_func = < function f_classif >
alpha = 0.05
)
sklearn.feature_selection.SelectFpr/SelectFdr/SelectFwe类的属性
scores_: array-like, shape=(n_features,)
pvalues_: array-like, shape=(n_features,)
代码解释
from sklearn.feature_selection import SelectFpr, f_regression
SelFpr = SelectFpr(f_regression, alpha=10e-10).fit(boston.data, boston.target)
SelFpr.pvalues_
# 统计关联强度的评分,数值越小P值越大
SelFpr.scores_
# 过滤了P值高于alpha(设定)的值
SelFpr.transform(boston.data)[:2]
运行结果
2.3 统计量用于特征筛选的通用框架
GenericUnivariateSelect允许使用可配置方法来进行单变量特征选择
函数介绍
class sklearn.feature_selection.GenericUnivariateSelect(
score_func=< function f_classif >
mode=‘percentile’: 用于特征筛选的标准
‘percentile’,‘k-best’,‘fpr’,‘fdr’,‘fwe’
param=1e-05: float or int,对应上述筛选标准的阈值
)
代码解释
from sklearn.feature_selection import GenericUnivariateSelect, f_regression
GenSel = GenericUnivariateSelect(f_regression, mode='fpr', param=10e-10).fit(boston.data, boston.target)
GenSel.pvalues_
GenSel.transform(boston.data)[:2]
运行结果
可以看出运行结果与2.2中的一模一样,且此方法简单有效
class sklearn.feature_selection.SelecFromModel(
estimator: 用于评估变量重要性的估计器
该估计器在fit后必须要有feature_importances_或者coef_属性
threshold = None: string, float,用于筛选变量的阈值
float: 评分低于此阈值的变量将被剔除
string:‘median’, ‘mean’, ‘1.2*mean’等表示方式
None:有l1参数时为1e-5,否则为’mean’
prefit = False
norm_order = 1
)
SelecFromModel类的属性:
estimator_: 在评估变量重要性时所使用的估计器或是模型
thresold_:使用的具体的阈值
代码解释
boston.data[:2]
# 使用线性回归
from sklearn.linear_model import LinearRegression
reg = LinearRegression()
reg.fit(boston.data, boston.target)
# 显示系数
reg.coef_
# 使用上述的系数进行筛选
from sklearn.feature_selection import SelectFromModel
# 系数的值<=0.1,就会被剔除
sfm = SelectFromModel(reg, threshold=0.1)
sfm.fit(boston.data, boston.target)
sfm.transform(boston.data)[:2]
运行结果
表示的是我们已经成功建立了SelectFromModel这个实例
**注意:**在筛选数据时,需要理清用的是feature_importances_还是coef_属性,再根据所使用的属性来设定具体的阈值
解决变量间多重共线性问题——主成分分析
探讨变量内在联系和结构——因子分析
在sklearn中的PCA方法默认使用协方差阵,因此我们首先是要对数据做标化
函数介绍
class sklearn.decomposition.PCA(
n_components = None: int/float/None/string,希望保留的主成分数量;若为None,则所有主成分被保留,为’mle’时自动选择最佳数量
copy = True
whiten = False:输出的主成分是否*sqrt(n_samples)/特征根,即标准化。若是做了标准化,则所有主成分的标准差都为1,否则相应的标准差就是对应的平方根。
下面的一般都是使用默认的
svd_solver = ‘auto’: {‘auto’, ‘full’, ‘arpack’, ‘randomized’}
auto: 根据X.shape和n_components自动选择方法
full:完整的SVD解法,即LAPACK
arpack:ARPACK法,要求0randomized:Halko等提出的随机SVD法
tol = 0.0, iterated_power = ‘auto’, random_state = None
)
sklearn.decomposition.PCA类的属性
components_: array, 形如(n_components, n_features),主成分系数矩阵
explained_variance_: array, 形如(n_components,),各主成分解释的方差量
explained_variance_ratio_: array,形如(n_components,),解释方差比例
singular_values_: array,形如(n_components,),各主成分对应的奇异值
mean_:array,形如(n_features),各属性的均数,等价于X.mean(axis=1)
n_components: int
noise_variance_: float,剩余的噪声协方差
sklearn.decomposition.PCA类的方法
fit(X[, y])
fit_transform(X[, y])
get_covariance(): 给出模型的协方差阵
get_params([deep])
get_precision(): 给出协方差矩阵的逆矩阵
inverse_transform(X)
score(X[, y]): 给出样本的平均对数似然值
score_samples(X): 给出每个样本的对数似然值
set_params(**params)
transform(X)
代码解释
# 使用的时鸢尾花的数据集
from sklearn import preprocessing, datasets
iris = datasets.load_iris()
# 对数据做标化
X_scaled = preprocessing.scale(iris.data)
from sklearn.decomposition import PCA
# 提取2个主成分
pca = PCA(n_components=2)
# 使用标化以后的数据,等价于采用相关系数矩阵做PCA
pca.fit(X_scaled)
# 给出成分系数矩阵
pca.components_
# 各主成分的方差解释量(特征值)
pca.explained_variance_
# 换算后的各主成分的方差解释比例
pca.explained_variance_ratio_
运行结果
4列对应的是4个原始变量
两个数据分别表示的是携带了2.93808505个原始变量的信息量,近似的为3个;以及0.9201649个原始变量的信息量。
下图中的计算结果可以用这两条式子表示2.93808505/4 0.9201649/4
如何获取主成分
import pandas as pd
zdf = pd.DataFrame(X_scaled)
zdf['z1'] = 0.52106591 * zdf[0] - 0.26934744 * zdf[1] + 0.5804131 * zdf[2] + 0.56485654 * zdf[3]
zdf['z2'] = 0.37741762 * zdf[0] + 0.92329566 * zdf[1] + 0.02449161 * zdf[2] + 0.06694199 * zdf[3]
zdf.describe()
zdf.head()
# 各主成分相加时应当按携带信息量的大小进行加权
zdf['tot'] = zdf.z1 * 1.714084 + zdf.z2 * 0.9592523
zdf.head(10)
# 计算出主成分用于后续分析
pca.transform(X_scaled)[:5]