特征选择:方差选择法、卡方检验、互信息法、递归特征消除、L1范数、树模型
转载:https://www.cnblogs.com/jasonfreak/p/5448385.html
特征选择主要从两个方面入手:
- 特征是否发散:特征发散说明特征的方差大,能够根据取值的差异化度量目标信息.
- 特征与目标相关性:优先选取与目标高度相关性的.
- 对于特征选择,有时候我们需要考虑分类变量和连续变量的不同.
1.过滤法:按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数选择特征
方差选择法:建议作为数值特征的筛选方法
计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征
from sklearn.feature_selection import VarianceThreshold
from sklearn.datasets import load_iris
import pandas as pd X,y = load_iris(return_X_y=True)
X_df = pd.DataFrame(X,columns=list("ABCD")) #建议作为数值特征的筛选方法,对于分类特征可以考虑每个类别的占比问题
ts = 0.5
vt = VarianceThreshold(threshold=ts)
vt.fit(X_df) #查看各个特征的方差
dict_variance = {}
for i,j in zip(X_df.columns.values,vt.variances_):
dict_variance[i] = j
#获取保留了的特征的特征名
ls = list()
for i,j in dict_variance.items():
if j >= ts:
ls.append(i)
X_new = pd.DataFrame(vt.fit_transform(X_df),columns=ls)
卡方检验:建议作为分类问题的分类变量的筛选方法
经典的卡方检验是检验定性自变量对定性因变量的相关性。假设自变量有N种取值,因变量有M种取值,考虑自变量等于i且因变量等于j的样本频数的观察值与期望的差距,构建统计量:

from sklearn.feature_selection import VarianceThreshold,SelectKBest,chi2
from sklearn.datasets import load_iris
import pandas as pd X,y = load_iris(return_X_y=True)
X_df = pd.DataFrame(X,columns=list("ABCD")) (chi2,pval) = chi2(X_df,y) dict_feature = {}
for i,j in zip(X_df.columns.values,chi2):
dict_feature[i]=j #对字典按照values排序
ls = sorted(dict_feature.items(),key=lambda item:item[1],reverse=True) #特征选取数量
k =2
ls_new_feature=[]
for i in range(k):
ls_new_feature.append(ls[i][0]) X_new = X_df[ls_new_feature]
互信息法:建议作为分类问题的分类变量的筛选方法
经典的互信息也是评价定性自变量对定性因变量的相关性的,为了处理定量数据,最大信息系数法被提出,互信息计算公式如下:

from sklearn.feature_selection import VarianceThreshold,SelectKBest,chi2
from sklearn.datasets import load_iris
import pandas as pd
from sklearn.feature_selection import mutual_info_classif #用于度量特征和离散目标的互信息
X,y = load_iris(return_X_y=True)
X_df = pd.DataFrame(X,columns=list("ABCD")) feature_cat = ["A","D"]
discrete_features = []
feature = X_df.columns.values.tolist()
for k in feature_cat:
if k in feature:
discrete_features.append(feature.index(k)) mu = mutual_info_classif(X_df,y,discrete_features=discrete_features,
n_neighbors=3, copy=True, random_state=None) dict_feature = {}
for i,j in zip(X_df.columns.values,mu):
dict_feature[i]=j #对字典按照values排序
ls = sorted(dict_feature.items(),key=lambda item:item[1],reverse=True) #特征选取数量
k =2
ls_new_feature=[]
for i in range(k):
ls_new_feature.append(ls[i][0]) X_new = X_df[ls_new_feature]
from sklearn.feature_selection import VarianceThreshold,SelectKBest,chi2
from sklearn.datasets import load_iris
import pandas as pd
from sklearn.feature_selection import mutual_info_classif,mutual_info_regression #用于度量特征和连续目标的互信息
X,y = load_iris(return_X_y=True)
X_df = pd.DataFrame(X,columns=list("ABCD")) feature_cat = ["A","D"]
discrete_features = []
feature = X_df.columns.values.tolist()
for k in feature_cat:
if k in feature:
discrete_features.append(feature.index(k)) mu = mutual_info_regression(X_df,y,discrete_features=discrete_features,
n_neighbors=3, copy=True, random_state=None) dict_feature = {}
for i,j in zip(X_df.columns.values,mu):
dict_feature[i]=j #对字典按照values排序
ls = sorted(dict_feature.items(),key=lambda item:item[1],reverse=True) #特征选取数量
k =2
ls_new_feature=[]
for i in range(k):
ls_new_feature.append(ls[i][0]) X_new = X_df[ls_new_feature]
2.包装法
递归特征消除法:用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练
from sklearn.datasets import load_iris
import pandas as pd
from sklearn.feature_selection import RFE,RFECV
from sklearn.ensemble import RandomForestClassifier X,y = load_iris(return_X_y=True)
X_df = pd.DataFrame(X,columns=list("ABCD")) refCV = RFECV(estimator=RandomForestClassifier(),
step=0.5,
cv =5,
scoring=None,
n_jobs=-1) refCV.fit(X_df,y) #保留特征的数量
refCV.n_features_
#保留特征的False、True标记
refCV.support_
feature_new = X_df.columns.values[refCV.support_]
#交叉验证分数
refCV.grid_scores_
3.嵌入的方法
基于L1范数:使用带惩罚项的基模型,除了筛选出特征外,同时也进行了降维
from sklearn.datasets import load_iris
import pandas as pd
from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression X,y = load_iris(return_X_y=True)
X_df = pd.DataFrame(X,columns=list("ABCD")) sf = SelectFromModel(estimator=LogisticRegression(penalty="l1", C=0.1),
threshold=None,
prefit=False,
norm_order=1) sf.fit(X_df,y) X_new = X_df[X_df.columns.values[sf.get_support()]]
基于树模型的特征选择法:
树模型中GBDT也可用来作为基模型进行特征选择,使用feature_selection库的SelectFromModel类结合GBDT模型
from sklearn.datasets import load_iris
import pandas as pd
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import GradientBoostingClassifier X,y = load_iris(return_X_y=True)
X_df = pd.DataFrame(X,columns=list("ABCD")) sf = SelectFromModel(estimator=GradientBoostingClassifier(),
threshold=None,
prefit=False,
norm_order=1) sf.fit(X_df,y) X_new = X_df[X_df.columns.values[sf.get_support()]]
特征选择:方差选择法、卡方检验、互信息法、递归特征消除、L1范数、树模型的更多相关文章
- 选择排序法、冒泡排序法、插入排序法、系统提供的底层sort方法排序之毫秒级比较
我的代码: package PlaneGame;/** * 选择排序法.冒泡排序法.插入排序法.系统提供的底层sort方法排序之毫秒级比较 * @author Administrator */impo ...
- C# 冒泡排序法、插入排序法、选择排序法
冒泡排序法 是数组等线性排列的数字从大到小或从小到大排序. 以从小到大排序为例. 数据 11, 35, 39, 30, 7, 36, 22, 13, 1, 38, 26, 18, 12, 5, 45, ...
- 基于R实现k-means法与k-medoids法
k-means法与k-medoids法都是基于距离判别的聚类算法.本文将使用iris数据集,在R语言中实现k-means算法与k-medoids算法. k-means聚类 首先删去iris中的Spec ...
- Abaqus 子模型法 和 子结构法
目录 1 子模型法 1.2 子模型法应用考虑因素 1.3 子模型法关键技术 1.3.1 单元选择 1.3.2 驱动变量 1.3.3 链接整体模型和子模型 1.4 仿真过程 1.4.1 问题描述 1.4 ...
- 关于Java中的选择排序法和冒泡排序法
一,这种方法是直接传入一个数组进行排序(选择排序法) public static void selectSort(int arr[]){ for (int i = 0; i < arr.leng ...
- 【Java基础】选择排序、冒泡法排序、二分法查找
1.选择排序: //改进后的选择排序,减少交换的次数 public static void sortSelect(int arr[]) { //用于存放最小数的下标 int s; for (int i ...
- c/c++ 算法之快速排序法 冒泡排序法,选择排序法,插入排序法
本文详细叙述和实现了快速排序算法,冒泡排序 选择排序 插入排序比较简单,原理在这里不再详述,直接用代码进行了实现. 快速排序法(quicksort)是目前所公认最快的排序方法之一(视解题的对象而定), ...
- 自适应阈值二值化之最大类间方差法(大津法,OTSU)
最大类间方差法是由日本学者大津(Nobuyuki Otsu)于1979年提出的,是一种自适应的阈值确定的方法,又叫大津法,简称OTSU.它是按图像的灰度特性,将图像分成背景和目标2部分.背景和目标之间 ...
- c语言:简单排序:冒泡排序法、选择排序法、插入排序法(待写)
1.冒泡排序法: 假设有n个数需要按从小到大排序,冒泡排序的原理是,在这一排数字中,将第一个数与第二个数比较大小,如果后面的比前面的小,就将他们交换位置.然后再比较第二个和第三个,再交换,直到第n-1 ...
随机推荐
- WebGL编程指南案例解析之平移和旋转的math库实现
这里说的math库实现,指的是,通过一般的加减乘除(角度计算)来更新坐标值. 因为涉及到坐标的变化,所以这里都是基于对顶点着色器的修改 平移: var vShader = ` attribute ve ...
- Mac 活动监视器 闪退 pro发热耗电过快问题解决,亲测可用解决
该解决办法转载 Mac 活动监视器 闪退 pro发热耗电过快问题解决 这个月新买了mac,升级了系统,出现CPU发热,高负荷运转问题,始终找不到问题解决办法, ,这个过程太痛苦了,也不知道是什么原因. ...
- ScrollView在布局中的作用
ScrollView就是滚动一个View,将View里面的内容滚动起来. 但是由于scroolview只能有一个孩子,因此我们可以在ScrollView中在定义一个布局. 这样的话,我们就会直接滚动整 ...
- CodeForces - 140E:New Year Garland (组合数&&DP)
As Gerald, Alexander, Sergey and Gennady are already busy with the usual New Year chores, Edward has ...
- 51Nod:活动安排问题(区间问题)
X轴上有N条线段,每条线段有1个起点S和终点E.最多能够选出多少条互不重叠的线段.(注:起点或终点重叠,不算重叠). 例如:[1 5][2 3][3 6],可以选[2 3][3 6],这2条线段互不重 ...
- Visual Studio Code打造Markdown编辑器
1.准备工作: OS:Windows10 专业版或企业版 安装:Visua Studio Code,版本 1.23 (2018-5-3) 官网下载:https://github.com/Microso ...
- JPEG文件格式
格式:JFIF(JPEG档的交换格式)压缩:JPEG(灰阶影像压缩比约为10:1:彩色影像约为20:1)以JPEG文件格式保存的图像实际上是2个不同格式的混合物:JPEG格式规范本身,用来定义图像的压 ...
- javascript : location 对象
window.location: window的location对象 window.location.href 整个URl字符串(在浏览器中就是完整的地址栏) window.location.prot ...
- 实习第二天-今年第一场雨-方法的重载(马上想到println()函数和abs(函数))
在C语言中 调用函数abs()返回一个整数的绝对值, fabs(返回一个单精度浮点型的绝对值)若要返回这些数的绝对值,则必须记住这些函数的名字 java可以用方法的重载:即是方法名必须相同,参数必须不 ...
- android 学习过程中登陆失效的个人理解
今天在学习的过程中,要做登陆失效的功能,所以就找了些资料.好好看了一下.研究了一番,慢慢的做出来了! 比方:你在一个手机端登陆了账号,在另外的一个手机端也登陆了账号,此时.前一个手机端的账号会提示登陆 ...