点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达 ![]()
极市导读
详解三大类特征选择方法。
特征选择
是特征工程
里的一个重要问题,其目标是寻找最优特征子集。特征选择能剔除不相关(irrelevant)或冗余(redundant )的特征,从而达到减少特征个数,提高模型精确度,减少运行时间的目的。另一方面,选取出真正相关的特征简化模型,协助理解数据产生的过程。并且常能听到“数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已”,由此可见其重要性。但是它几乎很少出现于机器学习书本里面的某一章。然而在机器学习方面的成功很大程度上在于如果使用特征工程。
之所以要考虑特征选择,是因为机器学习经常面临过拟合的问题。过拟合的表现是模型参数太贴合训练集数据,模型在训练集上效果很好而在测试集上表现不好,也就是在高方差。简言之模型的泛化能力差。过拟合的原因是模型对于训练集数据来说太复杂,要解决过拟合问题,一般考虑如下方法:
-
收集更多数据 -
通过正则化引入对复杂度的惩罚 -
选择更少参数的简单模型 -
对数据降维(降维有两种方式:特征选择和特征抽取)
其中第1条一般是很难做到的,一般主要采用第2和第4点
特征选择的一般过程:
-
生成子集:搜索特征子集,为评价函数提供特征子集 -
评价函数:评价特征子集的好坏 -
停止准则:与评价函数相关,一般是阈值,评价函数达到一定标准后就可停止搜索 -
验证过程:在验证数据集上验证选出来的特征子集的有效性
但是, 当特征数量很大的时候, 这个搜索空间会很大,如何找最优特征还是需要一些经验结论。
根据特征选择的形式,可分为三大类:
-
Filter(过滤法):按照 发散性
或相关性
对各个特征进行评分,设定阈值或者待选择特征的个数进行筛选 -
Wrapper(包装法):根据目标函数(往往是预测效果评分),每次选择若干特征,或者排除若干特征 -
Embedded(嵌入法):先使用某些机器学习的模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征(类似于Filter,只不过系数是通过训练得来的)
基本想法是:分别对每个特征 x_i ,计算 x_i 相对于类别标签 y 的信息量 S(i) ,得到 n 个结果。然后将 n 个 S(i) 按照从大到小排序,输出前 k 个特征。显然,这样复杂度大大降低。那么关键的问题就是使用什么样的方法来度量 S(i) ,我们的目标是选取与 y 关联最密切的一些 特征x_i 。
-
Pearson相关系数 -
卡方验证 -
互信息和最大信息系数 -
距离相关系数 -
方差选择法
皮尔森相关系数是一种最简单的,能帮助理解特征和响应变量之间关系的方法,衡量的是变量之间的线性相关性,结果的取值区间为[-1,1] , -1 表示完全的负相关(这个变量下降,那个就会上升), +1 表示完全的正相关, 0 表示没有线性相关性。Pearson Correlation速度快、易于计算,经常在拿到数据(经过清洗和特征提取之后的)之后第一时间就执行。Scipy的pearsonr方法能够同时计算相关系数和p-value
import numpy as np
from scipy.stats import pearsonr
np.random.seed(0)
size = 300
x = np.random.normal(0, 1, size)
print("Lower noise:", pearsonr(x, x + np.random.normal(0, 1, size)))
print("Higher noise:", pearsonr(x, x + np.random.normal(0, 10, size)))
from sklearn.feature_selection import SelectKBest
# 选择K个最好的特征,返回选择特征后的数据
# 第一个参数为计算评估特征是否好的函数,该函数输入特征矩阵和目标向量,输出二元组(评分,P值)的数组,数组第i项为第i个特征的评分和P值。在此定义为计算相关系数
# 参数k为选择的特征个数
SelectKBest(lambda X, Y: array(map(lambda x:pearsonr(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)
Pearson相关系数的一个明显缺陷是,作为特征排序机制,他只对线性关系敏感。如果关系是非线性的,即便两个变量具有一一对应的关系,Pearson相关性也可能会接近 0 。
经典的卡方检验是检验类别型变量对类别型变量的相关性。假设自变量有N种取值,因变量有M种取值,考虑自变量等于i且因变量等于j的样本频数的观察值与期望的差距,构建统计量:
不难发现,这个统计量的含义简而言之就是自变量对因变量的相关性。用sklearn中feature_selection库的SelectKBest类结合卡方检验来选择特征的代码如下:
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 #iris数据集
#选择K个最好的特征,返回选择特征后的数据
X_new = SelectKBest(chi2, k=2).fit_transform(X, y)
sklearn.feature_selection (https://scikit-learn.org/stable/modules/classes.html%23module-sklearn.feature_selection)模块中的类可以用于样本集中的特征选择/维数降低,以提高估计器的准确度分数或提高其在非常高维数据集上的性能
经典的互信息也是评价类别型变量对类别型变量的相关性的,互信息公式如下:
p data-tool="mdnice编辑器" style="font-family: mp-quote, apple-system-font, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, "sans-serif";word-break: break-all;line-height: 26px;letter-spacing: 0.8px;color: rgb(26, 26, 26);font-size: 15px;padding-top: 10px;padding-bottom: 10px;caret-color: rgb(26, 26, 26);">当x_i是0/1离散值的时候, 这个公式如上。很容易推广到 x_i 是多个离散值的情况。这里的 p (x_i,y) ,
和
都是从训练集上得到的。若问这个 MI 公式如何得来, 请看它的 KL 距离 (Kullback-Leibler) 表述:
也就是说,
衡量的是
和
的独立性。如果它俩独立
, 那么 KL 距离值为 0 , 也就是
和
不相关了, 可以去除
。相反, 如果两者密切相关, 那么 MI 值会很大。在对 MI 进行排名后, 最后剩 余的问题就是如何选择
个值(前
个
)。(后面将会提到此方法)我们继续使用交叉验证的方法, 将
从 1 扫描到
, 取评分最高的
。不过这次复杂度是线性的了。比如, 在使用朴素贝叶斯分类文本的时候, 词表长度
很大。使用filiter特征选择方法, 能够增加分类器精度。
克服了这两个问题。它首先寻找一种最优的离散化方式,然后把互信息取值转换成一种度量方式,取值区间在 [0,1] 。minepy(https://minepy.readthedocs.io/en/latest/)提供了MIC功能。
code style="overflow-x: auto;padding: 16px;color: #383a42;background: #fafafa;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;border-radius: 0px;font-size: 12px;-webkit-overflow-scrolling: touch;display: -webkit-box !important;">
fromminepy
importMINE
m = MINE()
x = np.random.uniform(
-1,
1,
10000)
m.compute_score(x, x
2)
print(m.mic())
from
sklearn.feature_selection
importSelectKBest
#由于MINE的设计不是函数式的,定义mic方法将其为函数式的,返回一个二元组,二元组的第2项设置成固定的P值0.5
def mic(x, y):
m = MINE()
m.compute_score(x, y)
return
(m.mic(),
0.5)
# 选择K个最好的特征,返回特征选择后的数据
SelectKBest(
lambdaX, Y: array(map(
lambdax:mic(x, Y), X.T)).T, k=
2).fit_transform(iris.data, iris.target)
/code>
code style="overflow-x: auto;padding: 16px;color: #383a42;background: #fafafa;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;border-radius: 0px;font-size: 12px;-webkit-overflow-scrolling: touch;display: -webkit-box !important;"># R-code
> x = runif (1000, -1, 1)
> dcor(x, x2)
[1] 0.
/code>
section role="presentation" data-formula="\operatorname{Var}[X]=p(1-p)
" data-formula-type="block-equation" style="text-align: center;overflow: auto;">
/section>
code style="overflow-x: auto;padding: 16px;color: #383a42;background: #fafafa;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;border-radius: 0px;font-size: 12px;-webkit-overflow-scrolling: touch;display: -webkit-box !important;">
fromsklearn.feature_selection
importVarianceThreshold
X = [[
0,
0,
1], [
0,
1,
0], [
1,
0,
0], [
0,
1,
1], [
0,
1,
0], [
0,
1,
1]]
# 方差选择法,返回值为特征选择后的数据
# 参数threshold为方差的阈值
sel = VarianceThreshold(threshold=(
.8* (
1-
.8)))
print(sel.fit_transform(X))
# VarianceThreshold(threshold=3).fit_transform(iris.data)
/code>
随着学习器(评估器)的改变,最佳特征组合可能会改变
section role="presentation" data-formula="O(n+(n-1)+(n-2)+\ldots+1)=O\left(n^2\right)
" data-formula-type="block-equation" style="text-align: center;overflow: auto;">
/section>
code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb(30, 107, 184);background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;">基模型
/code>来进行多轮训练,每轮训练后通过学习器返回的 coef_ 或者feature_importances_ 消除若干权重较低的特征,再基于新的特征集进行下一轮训练。
code style="overflow-x: auto;padding: 16px;color: #383a42;background: #fafafa;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;border-radius: 0px;font-size: 12px;-webkit-overflow-scrolling: touch;display: -webkit-box !important;">
fromsklearn.feature_selection
importRFE
from
sklearn.linear_model
importLogisticRegression
#递归特征消除法,返回特征选择后的数据
#参数estimator为基模型
#参数n_features_to_select为选择的特征个数
RFE(estimator=LogisticRegression(), n_features_to_select=
2).fit_transform(iris.data, iris.target)
/code>
code style="overflow-x: auto;padding: 16px;color: #383a42;background: #fafafa;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;border-radius: 0px;font-size: 12px;-webkit-overflow-scrolling: touch;display: -webkit-box !important;">
fromsklearn.feature_selection
importSelectFromModel
from
sklearn.linear_model
importLogisticRegression
#带L1惩罚项的逻辑回归作为基模型的特征选择
SelectFromModel(LogisticRegression(penalty=
"l1", C=
0.1)).fit_transform(iris.data, iris.target)
/code>
code style="overflow-x: auto;padding: 16px;color: #383a42;background: #fafafa;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;border-radius: 0px;font-size: 12px;-webkit-overflow-scrolling: touch;display: -webkit-box !important;">
fromsklearn.feature_selection
importSelectFromModel
#带L1和L2惩罚项的逻辑回归作为基模型的特征选择
#参数threshold为权值系数之差的阈值
SelectFromModel(LR(threshold=
0.5, C=
0.1)).fit_transform(iris.data, iris.target)
/code>
的例子:
code style="overflow-x: auto;padding: 16px;color: #383a42;background: #fafafa;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;border-radius: 0px;font-size: 12px;-webkit-overflow-scrolling: touch;display: -webkit-box !important;">
fromsklearn.cross_validation
importcross_val_score, ShuffleSplit
from
sklearn.datasets
importload_boston
from
sklearn.ensemble
importRandomForestRegressor
#加载波士顿房价作为数据集
boston = load_boston()
X = boston[
"data"]
Y = boston[
"target"]
names = boston[
"feature_names"]
#n_estimators为森林中树木数量,max_depth树的最大深度
rf = RandomForestRegressor(n_estimators=
20, max_depth=
4)
scores = []
for
i
inrange(X.shape[
1]):
#每次选择一个特征,进行交叉验证,训练集和测试集为7:3的比例进行分配,
#ShuffleSplit()函数用于随机抽样(数据集总数,迭代次数,test所占比例)
score = cross_val_score(rf, X[:, i:i+
1], Y, scoring=
"r2",
cv=ShuffleSplit(len(X),
3,
.3))
scores.append((round(np.mean(score),
3), names[i]))
#打印出各个特征所对应的得分
print(sorted(scores, reverse=
True))
/code>
section mpa-from-tpl="t" style="outline: 0px;font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;white-space: normal;orphans: 4;text-align: left;word-spacing: 1px;caret-color: rgb(38, 17, 32);min-height: 1em;color: rgba(0, 0, 0, 0.8);visibility: visible;">
下载1:OpenCV-Contrib扩展模块中文版教程/section>
section mpa-from-tpl="t" style="outline: 0px;font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;white-space: normal;orphans: 4;text-align: left;word-spacing: 1px;caret-color: rgb(38, 17, 32);min-height: 1em;color: rgba(0, 0, 0, 0.8);visibility: visible;">
在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。/section>
section mpa-from-tpl="t" style="outline: 0px;font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;white-space: normal;orphans: 4;text-align: left;word-spacing: 1px;caret-color: rgb(38, 17, 32);min-height: 1em;color: rgba(0, 0, 0, 0.8);visibility: visible;">
/section>
section mpa-from-tpl="t" style="outline: 0px;font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;white-space: normal;orphans: 4;text-align: left;word-spacing: 1px;caret-color: rgb(38, 17, 32);min-height: 1em;color: rgba(0, 0, 0, 0.8);visibility: visible;">
下载2:Python视觉实战项目52讲/section>
section mpa-from-tpl="t" style="outline: 0px;font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;white-space: normal;orphans: 4;text-align: left;word-spacing: 1px;caret-color: rgb(38, 17, 32);min-height: 1em;color: rgba(0, 0, 0, 0.8);visibility: visible;">
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。/section>
section mpa-from-tpl="t" style="outline: 0px;font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;white-space: normal;orphans: 4;text-align: left;word-spacing: 1px;caret-color: rgb(38, 17, 32);min-height: 1em;color: rgba(0, 0, 0, 0.8);">
/section>
section mpa-from-tpl="t" style="outline: 0px;font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;white-space: normal;orphans: 4;text-align: left;word-spacing: 1px;caret-color: rgb(38, 17, 32);min-height: 1em;color: rgba(0, 0, 0, 0.8);">
下载3:OpenCV实战项目20讲/section>
section mpa-from-tpl="t" style="outline: 0px;font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;white-space: normal;orphans: 4;text-align: left;word-spacing: 1px;caret-color: rgb(38, 17, 32);min-height: 1em;color: rgba(0, 0, 0, 0.8);">
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。/section>
section mpa-from-tpl="t" style="outline: 0px;font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;white-space: normal;orphans: 4;text-align: left;word-spacing: 1px;caret-color: rgb(38, 17, 32);min-height: 1em;color: rgba(0, 0, 0, 0.8);">
/section>
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/kjbd-gc/73467.html