特征选择就是从原始特征中选取一些最有效的特征来降低维度,,提高模型泛化能力减低过拟合的过程,主要目的是剔除掉无关特征和冗余特征,选出最优特征子集;

常见的特征选择方法可以分为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

z

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

python文本特征选择,机器学习--特征选择(Python实现)相关推荐

  1. python学习音频-机器学习利用Python进行音频数据增强

    2019-09-24 机器学习利用Python进行音频数据增强 数据增强通常用于机器学习和深度学习,以便在训练产生大量数据后获得良好的性能. 在这篇文章中,我将展示如何用一些音频增强技术使用输入音频文 ...

  2. python 文本分析_使用Python进行文本分析–书评

    python 文本分析 This is a book review of Text Analytics with Python: A Practical Real-World Approach to ...

  3. python 文本框_重置Python中的文本框

    几个星期前,我在制作重置按钮时要求一些帮助,我是python的新手,还有一个Noob,主要是我在c& c#也是SQL反正我正在为游戏制作一个重置按钮,我无法让它工作.这是代码.问题似乎是它在发 ...

  4. python文本筛选_使用python对多个txt文件中的数据进行筛选的方法

    使用python对多个txt文件中的数据进行筛选的方法 一.问题描述 筛选出多个txt文件中需要的数据 二.数据准备 这是我自己建立的要处理的文件,里面是随意写的一些数字和字母 三.程序编写 impo ...

  5. 01、python数据分析与机器学习实战——Python数据可视化库-Matplotlib

    Matplotlib介绍 Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形. Matplotlib基础 1.折线图绘制 假设,我 ...

  6. 01、python数据分析与机器学习实战——python数据分析处理库-Pandas

    pandas介绍 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的. Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具. panda ...

  7. 01、python数据分析与机器学习实战——Python科学计算库-Numpy

    深度学习--学习目录 NumPy介绍 NumPy系统是Python的一种开源的数值计算扩展. 这种工具可用来存储和处理大型矩阵, 比Python自身的嵌套列表(nested list structur ...

  8. python文本提取_使用Python从HTML文件中提取文本

    翻翻过去那场雪 我发现最好的一段代码用于提取文本,而不需要javascript或不需要的东西:import urllibfrom bs4 import BeautifulSoupurl = " ...

  9. python文本清洗_【python】TXT文本数据清洗和英文分词、词性标注

    删除空白行def clean_line (raw_file_name save_file_name):张开(raw_file_name, r +)作为f_r,开放(save_file_name, w ...

最新文章

  1. 广度深度都要,亚马逊是如何推动 Alexa 内生成长的?
  2. Linux安装minikube命令整理
  3. 读《白帽子讲Web安全》之客户端脚本安全(一)
  4. Web安全之权限攻击
  5. mysql meb安装_用meb搭建MySQL Master/Slave
  6. AppWidget实现机制分析--什么是桌面插件
  7. [jQuery]Great Ways to Learn jQuery
  8. [翻译]WPF控件库 MaterialDesignInXamlToolkit (2) Brush Names
  9. Codeforces 1169A Circle Metro
  10. 辞职日记----记录31岁的程序员跳槽心态
  11. IPFS BZZ Chia,项目这么多,怎么选择?
  12. 高中数学解题技巧:平面解析几何-圆锥曲线的综合问题
  13. office2016显示已经激活,但每次打开都跳出激活页面
  14. JVM内存管理及垃圾回收
  15. 二进制安装K8S集群-上
  16. Python笔记: 执行run.py文件
  17. 托福经验分享:20天从93分考到105分
  18. linux cp命令的-f 参数
  19. Python 修改AD账号密码(三)- 简易网页版
  20. Linux学习笔记_5_文件目录类指令日期,时间

热门文章

  1. uDevice Center - IoT弹性在线多设备开发平台
  2. 2017双11技术揭秘—千亿级流量来袭,如何用硬件加速技术为CPU减负?
  3. 到底什么是“无源物联网”?
  4. Serverless 在大规模数据处理中的实践
  5. Docker 存储选型,这些年我们遇到的坑
  6. 要闻君说:facebook迎来“全球宕机”惊险时刻;吸引大牛!拼多多成立了技术委员会;胡晓明卸任庚接任,阿里云计算迎来法人变更...
  7. 控制台服务编写 Linux,一步步搭建ubuntu server console(控制台,字符模式)开发环境...
  8. python依赖注入_如何做依赖注入python方式?
  9. 显微镜下的大明内容_平凡故事展现炮火下人性光辉,李少红《解放·终局营救》创作全解...
  10. 运行项目到 微信开发者工具和浏览器