1、特征选择
特征选择是重要的数据预处理过程,特种选择有两个重要的原因:
- 1 如果属性过多,会造成维数灾难,也就是随着属性变多,总体的特征数量呈指数级增长
- 2 去除不相关的特征可以降低机器学习的难度。
2、子集搜索与评价
子集搜索
子集搜索方法包含:向前、向后、双向搜索。
采用贪心的思想,“向前”选取特征,特征集初没有参数,每一轮选取一个加入后模型最佳的特征,也可以“向后”选取特征,一开始选取所有的特征,每次减少一个。也可以采用双向的策略,一边增大一边减小,将两者集合起来。
子集评价
子集评价方法包含:信息增益,交叉熵,相关性,余弦相似度等评级准则。
3、特征选择方法
3.1、过滤式
过滤式是指在模型训练之前对特征进行筛选,其中Relief是一种著名的过滤式选择的方法,它第j个特征的评价指标是:
其中
sklearn上的方法:
3.1.1、利用方差
利用方差过滤,设定一个阈值,小于这个阈值的方差去掉。
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)
第一个特征基本全部是0,只有一个是1,区分度很低,会过滤掉。
3.1.2、单变量选择
单变量特征选择能够对每一个特征进行测试,衡量该特征和响应变量之间的关系,根据得分扔掉不好的特征。对于回归和分类问题可以采用卡方检验等方式对特征进行测试。
这种方法比较简单,易于运行,易于理解,通常对于理解数据有较好的效果(但对特征优化、提高泛化能力来说不一定有效);这种方法有许多改进的版本、变种。
卡方值选择特征
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
iris = load_iris()
X, y = iris.data, iris.target
# chi2是卡方检验,k=2意味着保留两个特征
X_new = SelectKBest(chi2, k=2).fit_transform(X, y)
3.1.3另外的方法:
- information gain(信息增益),决策树的算法
- correlation coefficient scores(相关系数)
3.2、包裹式
与过滤不同,过滤的方法不考虑训练时的情况,而包裹是用训练后的模型作为评价标准,量身定做出最优的特征子集,比过滤法要好,但同时也会加大很多的计算复杂度。利用交叉验证的方法对特征进行选择,经典的方法是LVW,在SKlearn上这类型的方法是:recursive feature elimination algorithm(递归特征消除算法)
选取一个基学习器,设定要保留参数个数
from sklearn.datasets import make_friedman1
from sklearn.feature_selection import RFE
from sklearn.svm import SVR
X, y = make_friedman1(n_samples=50, n_features=10, random_state=0)
estimator = SVR(kernel="linear")
selector = RFE(estimator, 5, step=1)
selector = selector.fit(X, y)
selector.support_
#array([ True, True, True, True, True, False, False, False, False, False], dtype=bool)
selector.ranking_
# array([1, 1, 1, 1, 1, 6, 4, 3, 2, 5])
3.3、嵌入式
包裹式选择和过滤式选择,模型训练和特征选择有明显的分开,而嵌入式选择是将选择融入到训练之中,最简单的是带L1正则项目的回归算法,在L1正则化中,能得到比较稀疏的解(一部分特征的系数为0),达到特征选择的目的。
3.3.1 L1 正则化
from sklearn.svm import LinearSVC
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectFromModel
iris = load_iris()
X, y = iris.data, iris.target
X.shape
# (150, 4)
lsvc = LinearSVC(C=0.01, penalty="l1", dual=False).fit(X, y)
# SelectFromModel(estimator, threshold=None, prefit=False, norm_order=1)
# prefit = True即是用训练好的模型进行特征选择
# 可以设定一个阈值threshold,不设定为默认值,L1正则化的默认值是1e-5。
model = SelectFromModel(lsvc, prefit=True)
X_new = model.transform(X)
X_new.shape
#(150, 3)
3.3.2 树模型为基础
from sklearn.ensemble import ExtraTreesClassifier
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectFromModel
iris = load_iris()
X, y = iris.data, iris.target
X.shape
# (150, 4)
clf = ExtraTreesClassifier()
clf = clf.fit(X, y)
clf.feature_importances_
array([ 0.04..., 0.05..., 0.4..., 0.4...])
model = SelectFromModel(clf, prefit=True)
X_new = model.transform(X)
X_new.shape
# (150, 2)
4、降维学习
还可以采用一些降维学习的方法降低特征的维度,如PCA、LDA。