Sklearn —– Feature_Selection
文章只介绍sklearn框架中提供的特征选择的方法的使用情况,至于提取的原理,过后再专门详细阐述。
特征选取是机器学习领域非常重要的一个方向。
主要有两个功能:
(1)减少特征数量、降维,使模型泛化能力更强,减少过拟合
(2)增强特征和特征值之间的理解
清除低方差的特征
这应该是最简单的特征选择方法了:假设某特征的特征值只有0和1,并且在所有输入样本中,95%的实例的该特征取值都是1,那就可以认为这个特征作用不大。如果100%都是1,那这个特征就没意义了。当特征值都是离散型变量的时候这种方法才能用,如果是连续型变量,就需要将连续变量离散化之后才能用,而且实际当中,一般不太会有95%以上都取某个值的特征存在,所以这种方法虽然简单但是不太好用。
可以把它作为特征选择的预处理,先去掉那些取值变化小的特征,然后再从接下来提到的的特征选择方法中选择合适的进行进一步的特征选择。
sklearn.feature_selection.VarianceThreshold(threshold=0.0)
from sklearn.feature_selection import VarianceThreshold
X = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]]
sel = VarianceThreshold(threshold=(.8 * (1 - .8)))
sel.fit_transform(X)
#array([[0, 1],
[1, 0],
[0, 0],
[1, 1],
[1, 0],
[1, 1]])
代码说明:1 VarianceThreshold() 传入参数代表设定的方差的阈值,默认情况下只把方差为0的删除
2 fit_transform() 这个方式是数据预处理里面的重要方法,具体讲解在数据预处理章节一起讲述。这里只需要知道它自动把不满足阈值的特征给去除掉,并且重组就可以了。
单变量特征选择
基于单变量统计测试。(不太懂啊,该补补统计分析的课程啦)
单变量特征选择能够对每一个特征进行测试,衡量该特征和响应变量之间的关系,根据得分扔掉不好的特征。对于回归和分类问题可以采用卡方检验等方式对特征进行测试。
方法简单,易于运行,易于理解,通常对于理解数据有较好的效果(但对特征优化、提高泛化能力来说不一定有效);这种方法有许多改进的版本、变种。
1 选择前k个分数较高的特征,其他的丢弃
2 score_function中的参数:
f_regression(单因素线性回归试验)用作回归
chi2卡方检验 和 f_classif(方差分析的F值)等用作分类
3 重点补充一个调用关系,当初始化这个方法后。拿着这个方法去调用其他的方法。首先可以这样调用:
selector = SelectKBest(f_classif, k=5)
selector.fit(titanic[predictors], titanic["Survived"])
这种调用无法直接选出特征,返回的是包含scores, pvalues(数理统计里面的p-value的概念)的两个数组,可以通过selector.pvalues_或者selector.scores访问,但值不同大概是数理统计里面有个转换关系吧。
我们也会使用fit_transform()来直接返回这个特征选择后的结果。
注:
API中的标准:
scores_ : array-like, shape=(n_features,)
Scores of features.
pvalues_ : array-like, shape=(n_features,)
p-values of feature scores, None if score_func returned only scores.
sklearn.feature_selection.SelectKBest(score_func=<function f_classif>, k=10)
-----------------------------------------------------------
eg:
selector = SelectKBest(f_classif, k=5)
selector.fit(titanic[predictors], titanic["Survived"])
scores = -np.log10(selector.pvalues_)
选择一定百分比的最高的评分的特征
sklearn.feature_selection.SelectFpr(score_func=<function f_classif>, alpha=0.05)
根据配置的参选搜索??
sklearn.feature_selection.GenericUnivariateSelect(score_func=<function f_classif>, mode='percentile', param=1e-05
递归特征消除
递归特征消除的主要思想是反复的构建模型(如SVM或者回归模型)然后选出最好的(或者最差的)的特征(可以根据系数来选),把选出来的特征选择出来,然后在剩余的特征上重复这个过程,直到所有特征都遍历了。这个过程中特征被消除的次序就是特征的排序。因此,这是一种寻找最优特征子集的贪心算法。
RFE的稳定性很大程度上取决于在迭代的时候底层用哪种模型。例如,假如RFE采用的普通的回归,没有经过正则化的回归是不稳定的,那么RFE就是不稳定的;假如采用的是Ridge,而用Ridge正则化的回归是稳定的,那么RFE就是稳定的。(作为一名研究僧,宁死补数学啊!!!)
class sklearn.feature_selection.RFE(estimator, n_features_to_select=None, step=1, verbose=0)
from sklearn.svm import SVC
from sklearn.datasets import load_digits
from sklearn.feature_selection import RFE
import matplotlib.pyplot as plt
digits = load_digits()
X = digits.images.reshape((len(digits.images), -1))
y = digits.target
svc = SVC(kernel="linear", C=1)
rfe = RFE(estimator=svc, n_features_to_select=1, step=1)
rfe.fit(X, y)
ranking = rfe.ranking_.reshape(digits.images[0].shape)
plt.matshow(ranking, cmap=plt.cm.Blues)
plt.colorbar()
plt.title("Ranking of pixels with RFE")
plt.show()
关于特征选择就先看到这里吧,后面的方法等学习完相应章节后再回来补充吧。