第七章 变量选择
1、过滤法
过滤法变量选择是一种与模型无关的变量选择方法,先进行变量选择得到入模变量,再进行模型训练。
- 方差变量筛选(from sklearn.feature_selection import VarianceThreshold)
'''
删除所有低方差特征的特征选择器。
VarianceThreshold(SelectorMixin)
参数:SelectorMixin:训练集方差低于此阈值的要素将被删除。
默认设置是保留所有具有非零方差的特征,即删除所有样本中具有相同值的特征。
属性:variances_数组,形状(n_features,)个体特征的差异。
方法:
fit,transform,fit_transform,inverse_transform:sklearn统一使用方法,略
get_support():默认false,当True时,返回保留变量的索引
'''
X = np.array([[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]])
# [[0 2 0 3]
# [0 1 4 3]
# [0 1 1 3]]
selector = VarianceThreshold()
x_tran = selector.fit_transform(X)
# [[2 0]
# [1 4]
# [1 1]]
selector.variances_
# [0. 0.22222222 2.88888889 0. ]
selector.get_support(True)
# [1 2]
-
单变量选择方法(以SelectKBest为例)
SelectKBest提供了通过指标排序,给出得分最高的 K 个变量作为变量选择的结果;
from sklearn.datasets import load_digits
from sklearn.feature_selection import SelectKBest, chi2
'''
根据k个最高得分选择功能。
SelectKBest(score_func,k=10)
参数:score_func:用于计算输入变量与目标变量之间统计变量的函数,返回数组(scores,pvalues)或单个得分数组
常用的指标有:
chi2 卡方统计量用于分类任务;
f_classif 方差分析用于分类任务,默认就是该指标;
f_regression 计算特征与目标变量之间的 F 值,即用线性回归分析方法来计算统计指标,用于回归问题
k:保留前k个特征,默认10个
属性:scores_:用于查询变量选择时每个变量的得分
pvalues_:特征分数的p值;
方法同上
'''
X, y = load_digits(return_X_y=True)
X.shape
# (1797, 64)
model = SelectKBest(chi2, k=20)
X_new = model.fit_transform(X, y)
# (1797, 20)
print(model.scores_)
# nan 811.90700411 3501.28249552
print(model.pvalues_)
# nan 5.81310493e-169 0.00000000e+000
SelectPercentile提供了一种选择得分最高的前百分之几的特征作为变量选择的结果;
# 参数:percentile选取前10%的特征
from sklearn.datasets import load_digits
from sklearn.feature_selection import SelectPercentile, chi2
X, y = load_digits(return_X_y=True)
X.shape
# (1797, 64)
X_new = SelectPercentile(chi2, percentile=10).fit_transform(X, y)
X_new.shape
# (1797, 7)
2、包装法(以RFECV为例)
包装法是一种与模型相关的变量选择方法,即在特征空间中随机挑选特征子集,然后选择一个模型,采用交叉验证的方式测试不同特征子集上模型的表现。
sklearn虽然没有实现逐步回归的变量选择,但是提供了后向搜索方法的模型:递归消除方法(RFE)与带交叉验证的递归消除方法(RFECV)
'''
运行原理:
将所有特征传入模型,每次删除step个特征,得出评分。
如果删除特征后,评分变高说明删除的特征对模型没有影响,可以删除。
RFECV(estimator,step=1, min_features_to_select=1, cv=None,scoring=None, verbose=0, n_jobs=None)
常用参数:
estimator:一种监督学习估计器,其fit方法通过coef_ 属性或feature_importances_属性提供有关特征重要性的信息
step:如果大于或等于1,则step对应于每次迭代要删除的(整数)个特征。如果在(0.0,1.0)之内,则step对应于每次迭代要删除的要素的百分比(向下舍入)。请注意,最后一次迭代删除的要素少于step才能达到min_features_to_select。
cv:确定交叉验证拆分策略。none:要使用默认的5倍交叉验证
scoring:参数见下表
verboseint, (default=0):控制输出的详细程度。
n_jobs int或无,可选(默认=无):是一个整数,指定同时运行的工作程序的最大数量,-1表示使用所有处理器。
属性:
support_形状的数组[n_features]
所选功能的遮罩。
rank__形状的数组[n_features]
特征排名,从而ranking_[i] 与第i个特征的排名位置相对应。选定的(即最佳估计)特征分配给等级1。
'''
from sklearn.datasets import make_friedman1
from sklearn.feature_selection import RFECV
from sklearn.svm import SVR
X, y = make_friedman1(n_samples=50, n_features=10, random_state=0)
estimator = SVR(kernel="linear")
selector = RFECV(estimator, step=1, cv=5)
selector = selector.fit(X, y)
selector.get_support(True)
# [0 1 2 3 4]
selector.support_
# array([ True, True, True, True, True, False, False, False, False,False])
selector.ranking_
# array([1, 1, 1, 1, 1, 6, 4, 3, 2, 5])
selector.grid_scores_
# [0.2119209 0.34014969 0.32498071 0.39840786 0.44286114 0.42111785,0.38499244 0.393591 0.39398469 0.38667796]
scoring参数的选择:
3、嵌入法
与包装法类似,嵌入法同样是一种模型相关的变量选择方法,不同的是,嵌入法不需要多次构建模型,而是在模型训练时同步完成,不需要采用贪婪的方法构造特征子集并训练多次模型来得到最优变量子空间。
scikit-learn 的 feature_selection特征选择模块中SelectFromModel方法实现了嵌入法变量选择,用于根据重要度选择特征。
'''
SelectFromModel(estimator, threshold=None, prefit=False,norm_order=1, max_features=None)
参数:
estimator:用来构建变压器的基本估算器。既可以是拟合的(如果prefit设置为True),也可以是不拟合的估计量。拟合后,估计量必须具有 feature_importances_或coef_属性
threshold:用于特征选择的阈值,保留重要性更高或相等的要素,而其他要素则被丢弃,如果为None且估计器的参数惩罚显式或隐式设置为l1(例如Lasso),则使用的阈值为1e-5。否则,默认情况下使用“平均值”。
prefit:指定是否为预训练的模型,如果模型已经训练好,则将 prefit 置为 True。
max_features:可选要选择的最大功能数。若要仅基于选择max_features,请设置threshold=-np.inf。
'''
from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression
X = [[ 0.87, -1.34, 0.31 ],
[-2.79, -0.02, -0.85 ],
[-1.34, -0.48, -2.55 ],
[ 1.92, 1.48, 0.65 ]]
y = [0, 1, 0, 1]
selector = SelectFromModel(estimator=LogisticRegression()).fit(X, y)
selector.estimator_.coef_
# array([[-0.3252302 , 0.83462377, 0.49750423]])
print(selector.threshold_)
# 0.55245...
selector.get_support(True)
# [1]
selector.transform(X)
# array([[-1.34],
# [-0.02],
# [-0.48],
# [ 1.48]])
from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression
X = [[ 0.87, -1.34, 0.31 ],
[-2.79, -0.02, -0.85 ],
[-1.34, -0.48, -2.55 ],
[ 1.92, 1.48, 0.65 ]]
y = [0, 1, 0, 1]
selector = SelectFromModel(estimator=LogisticRegression()).fit(X, y)
selector.estimator_.coef_
# array([[-0.3252302 , 0.83462377, 0.49750423]])
selector.threshold_
# 0.55245...
selector.get_support(True)
# [1]
selector.transform(X)
# array([[-1.34],
# [-0.02],
# [-0.48],
# [ 1.48]])
变量选择常见问题:
1、常用的变量选择方法有哪三种?
答:过滤法、包装法、嵌入法。2、预测能力相关指标有哪四个?
答:信息增益、信息增益比、基尼系数和卡方值等。3、PSI 指标有哪两方面作用?
答:一方面可以用于评估模型上线后预测结果与建模时的结果是否存在偏差;另一方面也可以用于变量选择,衡量变量的稳定性。4、什么是包装法变量选择?
答:包装法变量选择是一种与模型相关的变量选择方法,即在特征空间中随机挑选特征子集,然后选择一个模型,采用交叉验证的方式测试不同特征子集上模型的表现。5、如果是一个标准评分卡,其建模变量不会超过多少个?
答:20个6、为什么分箱结果不宜过少?
答:由于每个箱内的变量默认是同质的,即风险等级相同,如果分箱过少,则会造成模型的辨识度过低。7、变量选择的过程一般是? "
答:(1)基于 IV 值进行初步筛选,(2)聚类分析,将不同特征进行聚类得到不同的簇,(3)相关性分析,计算变量编码后变量之间的相关性,给定阈值进行变量剔除,剔除时要注意在不同的簇中进行选择,(4)逐步回归变量选择,(5)随机森林或 Xgboost 模型变量重要性排序,得到最终的变量筛选结果。"
参考自:sklearn官网和《python金融风控大数据建模实战》