机器学习--特征选择

1、特征选择

特征选择是重要的数据预处理过程,特种选择有两个重要的原因:

  • 1 如果属性过多,会造成维数灾难,也就是随着属性变多,总体的特征数量呈指数级增长
  • 2 去除不相关的特征可以降低机器学习的难度。

2、子集搜索与评价

子集搜索

子集搜索方法包含:向前、向后、双向搜索。
采用贪心的思想,“向前”选取特征,特征集初没有参数,每一轮选取一个加入后模型最佳的特征,也可以“向后”选取特征,一开始选取所有的特征,每次减少一个。也可以采用双向的策略,一边增大一边减小,将两者集合起来。

子集评价

子集评价方法包含:信息增益,交叉熵,相关性,余弦相似度等评级准则。

3、特征选择方法

3.1、过滤式

过滤式是指在模型训练之前对特征进行筛选,其中Relief是一种著名的过滤式选择的方法,它第j个特征的评价指标是:

δj=idiff(xji,xji,nh)2+diff(xji,xii,nm)2

其中 diff(xji,xji,nh) 是每个样本点离属于这个类型的样本点同类中最近的一个点, diff(xji,xji,nm) 是每个样本点离不属于这个类型的样本点同类中最近的一个点,可以看到如果 δ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。

猜你喜欢

转载自blog.csdn.net/xiayto/article/details/79877329