机器学习--特征选择(Python代码实现)

2023-10-30

转自 每日一Python 微信公众号

特征选择就是从原始特征中选取一些最有效的特征来降低维度,,提高模型泛化能力减低过拟合的过程,主要目的是剔除掉无关特征和冗余特征,选出最优特征子集;
常见的特征选择方法可以分为3类:过滤式(filter)、包裹式(wrapper)、嵌入式(embedding)。

1.过滤式filter:
通过方差选择法、相关系数法、卡方检验法、互信息法来对特征进行评分,设定阈值或者待选择的阈值的个数来选择;
1.1方差选择法
  计算各个特征的方差,剔除小于设定的阈值的特征,剔除特征值 波动较小的特征,例如一个特征的所有值都为1,那这个特征对于预测目标变量就没什么作用;方法很简单,但实际应用中只有少数变量才会存在只取某个值的情况,对特征选择作用比较小,可以当做数据预处理部分,之后再用其他方法进行特征选择。

from sklearn.feature_selection import VarianceThreshold
var = VarianceThreshold(threshold=0)
var.fit_transform(df)
df = df.iloc[var.get_support(True),:]
#VarianceThreshold返回已经提出方差为0的列,通过get_support[True]定位
剩余变量所在的列

1.2  单变量特征选择

1.2.1相关系数法

皮尔森相关系数衡量的是变量之间的线性相关性,取值范围在-1-+1之间,-1表示完全负相关,+1表示完全正相关,0表示线性无关;

可以使用scipy的pearsonr 计算皮尔森相关系数,且它还可以同时计算出p值

 

import numpy as np
from scipy.stats import pearsonr
x = np.random.normal(0,10,300)
y = x + np.random.normal(0,10,300)
pearsonr(x,y)

但是皮尔森相关系数只衡量线性关系,即使两个变量之间有较强的非线性关系,皮尔森系数也有可能接近为0;

1.2.2.卡方检验法

检验定性自变量对定性因变量的相关性,卡方公式为:

其中Ai为观测频数,Ei为期望频数

from sklearn.feature_selection import chi2
#chi2要求变量值非负,返回卡方值和P值
from sklearn.feature_selection import SelectKBest
from sklearn.datasets import load_iris

iris = load_iris()

model = SelectKBest(chi2, k=2)
model.fit_transform(iris.data,iris.target)
var = model.get_support(True)

1.2.3 互信息法和最大信息系数


互信息法也是评价定性自变量对定性因变量的相关性的,但是并不方便直接用于特征选择,一是因为它不属于度量方式,也没有办法进行归一化,在不同的数据上的结果无法做比较;二是因为对于连续变量的计算不是很方便,通常需要将变量离散化,而互信息的结果对离散化的方法很敏感;

因此引入了最大信息系数 。最大信息系数首先寻找一种最优的离散方式,然后把互信息取值转换成一种度量方式,取值区间在[0,1],minepy模块提供了MIC(最大信息系数)方法:

x = np.random.normal(0,10,300)
z = x *x
pearsonr(x,z)
#计算得皮尔森系数= -0.1
from minepy import MINE
m = MINE()
m.compute_score(x, z)
print(m.mic())
#mic系数= 1.0

1.2.4 距离相关系数法

距离相关系数是为了克服皮尔森相关系数只能衡量线性关系的弱点而生的。x和x^2的皮尔森相关系数可能接近于0,但是这两个变量并不是独立不相关的。使用距离相关系数就可以计算x和x^2的非线性关系,如果距离相关系数接近于0,就可以说两个变量之间是独立的。R语言的energy包提供了距离相关系数的函数,Python没有直接计算的包,可以查看https://gist.github.com/josef-pkt/2938402;

#R语言
x  <-  runif(300,1,10)
z <-  x**2
dcor(x, z)
计算得 x,x**2的距离相关系数为0.98

2.包裹式Wrapper
根据预测效果(AUC/MSE)或者其他方法对特征组合进行评分,主要方法有递归特征消除法;

递归特征消除法的主要思想是反复的构建模型,然后选出最好或最坏的特征,把选出的特征放到一边,然后在剩余的特征上重复这个过程,直到所有特征都遍历了。在这个过程中特征被消除的次序就是特征的排序。

from sklearn.feature_selection import RFE
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
rfe = RFE(lr, n_features_to_select=2)
rfe.fit(iris.data, iris.target)
var = rfe.get_support(True)

3.嵌入式Embedded

3.1正则化

正则化主要包括L1正则化和L2正则化:

L1正则化将系数W的L1范数作为惩罚项加到损失函数中,L1正则方法具有稀疏解的特性,因此天然具有特征选择的特性,但是不代表没被选到的特征就不重要,有可能是因为两个高度相关的特征最后只保留了一个;另外L1正则化和非正则化模型一样是不稳定的,如果特征集合中具有相关联的特征,当数据发生细微变化时也有可能导致很大的模型差异。

from sklearn.linear_model import Lasso
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
x = scaler.fit_transform(iris.data)
y = iris.target
lasso = Lasso(alpha=0.2)
lasso.fit(x,y)
lasso.coef_

L2正则化将系数向量的L2范数添加到损失函数中,由于L2惩罚项中的系数是二次方的,会让系数的取值变得平均,对于有相关性的变量,会得到相近的系数;L2正则化也较L1稳定;

 

import pandas as pd
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Lasso
from sklearn.linear_model import Ridge
iris = load_iris()
#看一下各变量之间的相关性
data = pd.DataFrame(iris.data)
data.corr()

可以看出2和3、0和2、3变量之间有较强的关联性,然后看一下分别使用线性回归、L1正则化和L2正则化后的变量系数:

 

scaler = StandardScaler()
x = scaler.fit_transform(iris.data)
y = iris.target
lr = LinearRegression()
lr.fit(x,y)
lr.coef_

lasso = Lasso(alpha=0.5)
lasso.fit(x,y)
lasso.coef_

ridge = Ridge(alpha=10)
ridge.fit(x,y)

ridge.coef_

可以看出L1正则化后容易得到一个稀疏矩阵,L2正则化后系数会趋于平均。

3.2树模型

可以利用随机森林或者GBDT模型进行特征选择,之前我有一篇博文讲的这个,这里不再详细说明;上一篇随机森林筛选变量的链接:https://mp.weixin.qq.com/s/6gc3H2y6SnOzdyx_L2WBwg

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

机器学习--特征选择(Python代码实现) 的相关文章

随机推荐

  • 剑指 Offer(专项突击版)- 剑指 Offer II 064. 神奇的字典(20220809)

    设计一个使用单词列表进行初始化的数据结构 单词列表中的单词 互不相同 如果给出一个单词 请判定能否只将这个单词中一个字母换成另一个字母 使得所形成的新单词存在于已构建的神奇字典中 实现 MagicDictionary 类 MagicDict
  • cpp: Visitor Pattern

    file Gold h brief 访问者模式 Visitor Pattern C 14 行为模式 2023年6月8日 涂聚文 Geovin Du Visual Studio 2022 edit 文章来源 C 新经典设计模式 王健伟编著 清
  • 来看21届IT学子应该如何备战秋招?

    写在前面 今天是2020年7月14 离正式秋招可能就两个月时间了 睡了个午觉醒来脑子里突然就在想怎样才能在秋招中找到一份满意的工作 决定把自己所想写下来 这篇文章写给自己同时也写给即将找工作的2021届各位幸运宝宝 一 有计划有目标的提高自
  • android项目迁移到androidX:类映射(android.arch.*)

    android arch core 支持库类 AndroidX 类 core executor AppToolkitTaskExecutor androidx arch core executor AppToolkitTaskExecuto
  • pytorch3d安装遇到的一些坑和解决过程

    最近为了安装pytorch3d 折腾了两天 足足两天 要注意 安装pytorch3d之前 必须先安装pytorch torchvision Pytorch3d官方 是建议用conda install的方式来安装 也可以用pip来安装 pip
  • 如何实现一个IAM系统

    IAM Identity and Access Management 的缩写 即 身份识别与访问管理 它提供单点登录 强大的认证管理 集中的授权和审计 帮助企业安全 高效地管理IT系统账号和资源权限 产品简介 赛赋Cipher IDaaS是
  • Pandas的read_excel函数学习

    excel表的读取在python中是非常重要的 为了方便今后的使用 我将我学习用python读取excel表的过程记录下来 以便今后回顾时能快速想起各种方法 下图为示例中使用的excel表中的内容 sheet1 学生的信息 sheet2 成
  • windows:ngix无法绑定80端口

    问题 cmd运行ngix提示 nginx emerg bind to 0 0 0 0 80 failed 10013 An attempt was made to access a socket in a way forbidden by
  • vue 默认选中复选框案例

  • JFrame的一些简单操作

    前几天在Java课上 老师有一段代码用到了Jframe和Jbutton这两个东西 起初我以为这是我们老师自己写的类 但是之后我一查发现这是Java中用于操控一个小窗口而封装的类 于是我去了解一下这个类 然后写了一个非常简陋的窗口 publi
  • 紫外光刻胶 AR-N 4400/电子束光刻胶 AR-N7700/AR-P617 电子束光刻胶

    光刻胶又称抗蚀剂 是指通过紫外光 电子束 离子束 射线等的照射或辐射 其性质发生变化的耐蚀刻薄膜材料 按曝光光源和辐射源的不同 又分为紫外光刻胶 包括紫外正性光刻胶 紫外负性光刻胶 深紫外光刻胶 电子束胶 射线胶 离子束胶等 AR N 44
  • 微信小程序框架——uni-app

    文章目录 uni app介绍 1 什么是uni app 2 上线的产品 3 uni app的社区和规模 uni app基础 1 uni app初体验 2 项目结构介绍 3 样式和sass 4 基本语法 5 事件 6 组件 7 生命周期 补充
  • python笔记:数组的一些操作

    目录 1 对数组求指数和对数 2 数组的最值及其索引 3 按照行或者列求均值 求和 最大值 最小值 标准差 方差 4 取对角线元素 5 取两个数组对应的最大或最小值 6 对数组重新排列 1 对数组求指数和对数 参考 指数 math exp
  • React.lazy懒加载组件

    1 React lazy的用法 React lazy方法可以异步加载组件文件 const Foo React lazy gt import componets ChildComponent React lazy不能单独使用 需要配合Reac
  • mysql关于mysql.server

    1 mysql server服务端工具 主要作用就是为了方便启动和关闭mysql服务 这个脚本中调用mysqld safe来启动mysqld 2 RPM包安装时 发现 etc rc d init d mysql和 usr share mys
  • 使用pip安装package的时候,如何不使用cache的文件,重新下载(防止package之间版本不匹配)

    我们在使用pip安装某一个package的时候 如果安装的有问题向卸载之后重新安装 卸载 pip uninstall mediapipe 重新安装 pip install mediapipe 但是 执行命令之后发现使用了cached的whe
  • CSerialPort教程4.3.x (2) - CSerialPort源码简介

    CSerialPort教程4 3 x 2 CSerialPort源码简介 前言 CSerialPort项目是一个基于C C 的轻量级开源跨平台串口类库 可以轻松实现跨平台多操作系统的串口读写 同时还支持C Java Python Node
  • 位运算符介绍(二):Java位运算符

    Java语言提供了7个位操作运算符 这些运算符只能用于整型操作数 这些整数操作数包括long int short char和byte 这里注意 相对于C C Java多了一个位运算符 gt gt gt 整型操作数也多了一个byte类型 C
  • 【建议收藏】机器学习模型构建(一)——建模调参(内附代码)

    引言 在前一阶段的学习中 我们完成了数据预处理等上游操作 接下来就要开始进行模型的构建 构建模型 sklearn中提供各种机器学习模型的类供我们使用 我们要根据我们的业务逻辑进行相关的筛选进行构建调参 在本例中我将使用sklearn内置的数
  • 机器学习--特征选择(Python代码实现)

    转自 每日一Python 微信公众号 特征选择就是从原始特征中选取一些最有效的特征来降低维度 提高模型泛化能力减低过拟合的过程 主要目的是剔除掉无关特征和冗余特征 选出最优特征子集 常见的特征选择方法可以分为3类 过滤式 filter 包裹