sklearn里的特征工程
https://www.jianshu.com/p/b3056d10a20f
http://www.sohu.com/a/340983395_654419
用sklearn中的feature_selection库来进行特征选择
Filter:
<1> 过滤法:
按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的 个数,选择特征。
方差选择法(VarianceThreshold)
去掉那些方差没有达到阈值的特征。默认情况下,删除零方差的特征,例如那些只有一个值的样本。
from sklearn import datasets
iris = datasets.load_iris()
print(iris.data)
# array([[5.1, 3.5, 1.4, 0.2], ...])
from sklearn.feature_selection import VarianceThreshold
#方差选择法,返回值为特征选择后的数据
#参数threshold为方差的阈值
vardata = VarianceThreshold(threshold= 3).fit_transform(iris.data)
print(vardata)
# array([[1.4],...])
# 筛选后删除了第一二四的特征,输出了第三个特征 petal length
相关系数法(SelectKBest)
使用相关系数法,先要计算各个特征对目标值的相关系数。用feature_selection库的SelectKBest类 结合相关系数来选择特征
- SelectBest 只保留 k 个最高分的特征;
- SelectPercentile 只保留用户指定百分比的最高得分的特征;
- 使用常见的单变量统计检验:假正率SelectFpr,错误发现率selectFdr,或者总体错误率SelectFwe;
- GenericUnivariateSelect 通过结构化策略进行特征选择,通过超参数搜索估计器进行特征选择。
举个例子,使用卡方检验选择两个最优特征:
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
X.shape
# (150, 4)
X_new = SelectKBest(chi2, k=2).fit_transform(X, y)
# X_new = SelectKBest(f_classif, k=20).fit_transform(X, y)
X_new.shape
# (150, 2)
-
对于回归:
f_regression 回归任务的标签/功能之间的F值
mutual_info_regression 共同目标的共同信息 -
对于分类:
chi2 分类任务的非负特征的卡方统计
f_classif 标签/功能之间的ANOVA F值用于分类任务
mutual_info_classif 离散目标的相互信息 -
其他方法:
SelectPercentile 根据最高分数的百分位数选择功能。
SelectFpr 根据误报率测试选择功能。
SelectFdr 根据估计的错误发现率选择功能。
SelectFwe 根据家庭错误率选择功能。
GenericUnivariateSelect 具有可配置模式的单变量特征选择器。
?什么是卡方检测 ? -- 特征与类之间的相关性
Wrapper:
包装法:根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征。
- 递归消除特征法:使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
#递归特征消除法,返回特征选择后的数据
#参数estimator为基模型
#参数n_features_ to_select为选择的特征个数
RFE(estimator=LogisticRegression(), n_features_to_select= 2).fit_transform(iris.data, iris.target)[:10]
Embedded嵌入法:
嵌入法:先使用某些机器学习的算法和模型进行训练,得到各个特征的权值 系数,根据系数从大到小选择特征。类似于Filter方法,但是是通过训练来确定特征的优劣。
- 基于惩罚项的特征选择法
使用带惩罚项的基模型,除了筛选出特征外,同时也进行了降维。使用L1范数的线性模型有一个稀疏解:许多估计系数都为0。当降维的目的是为了使用其他分类器,他们能和feature_selection.SelectFromModel一起使用选择非零系数。特别地,稀疏估计量对于回归中的 linear_model.Lasso、分类中的linear_model.LogisticRegression和svm.LinearSVC都很有用。
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)
model = SelectFromModel(lsvc, prefit=True)
X_new = model.transform(X)
X_new.shape
# (150,3)
- 基于树模型的特征选择法:
树模型中GBDT也可用来作为基模型进行特征选择,使用feature_selection库的SelectFromModel类 结合GBDT模型,来选择特征的代码如下:
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)