python文本特征选择,机器学习--特征选择(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)

f0e03ab4893e3b286a19161e391ce6c2.png

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

1.2.2.卡方检验法

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

53f7e978fb047ef91fc1e59a284b6f5c.png

其中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 互信息法和最大信息系数

1b7a8525b7440b79359c4f27c9bb63b8.png

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

因此引入了最大信息系数 。最大信息系数首先寻找一种最优的离散方式,然后把互信息取值转换成一种度量方式,取值区间在[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()

6cf7365fe896ffac28e00736e59837df.png

可以看出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_

f36a3fa691e68ad8b2c66851e3ffd72f.png

lasso = Lasso(alpha=0.5)

lasso.fit(x,y)

lasso.coef_

c1fc90ae9493cabc82601d5b2262e560.png

ridge = Ridge(alpha=10)

ridge.fit(x,y)

ridge.coef_

d921d42b93b33f21a0c33741bc102047.png

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

3.2树模型

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/527576.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用python画风车_python接口自动化()一)(实现一款简单的接口自动化框架)

python接口自动化一(设计一款自己的接口自动化框架) 一、起因: 前面学习过了python接口requests来进行接口测试,但是在框架选择上还是选择的unittest。当接口数量不怎么多时还好,但是当接口的量上去了,一切…

系统新模块增加需要哪些步骤_防锈高效型干式地暖模块解决了装修施工配合的哪些难点?...

通过前面的讲解,我们知道铝板干式地暖末端应用于地暖、辐射冷暖等系统的技术优势非常明显,即省层高、省费用、效果好、空调舒适、业主使用满意度高等,随着水泥黄沙的大幅涨价,其成本优势也突显出来,越来越多的暖通公司…

python爬取网站数据步骤_python怎么爬取数据

在学习python的过程中,学会获取网站的内容是我们必须要掌握的知识和技能,今天就分享一下爬虫的基本流程,只有了解了过程,我们再慢慢一步步的去掌握它所包含的知识Python网络爬虫大概需要以下几个步骤: 一、获取网站的地…

matlab chan算法定位,MATLAB实现基于Chan氏算法的三维TDOA定位

% 功能:基于chan算法的TDOA三维定位function [zp] Chan_3(Noise,MS)%基站数目BSN 7;%基站位置,每一列为一个基站位置BS [0, 2*sqrt(3), -2*sqrt(3), sqrt(3), -sqrt(3), -sqrt(3), sqrt(3);0, 0, 0, 3, 3, -3, -3;0, 0, 0, 0, 2, 2, 0];%无噪声情况下BS到MS的距离…

Redis源码精读:字符串

文章目录 前言代码位置核心类型SDS结构获取sds字符串的元数据的宏获取字符串长度重新设置sds长度创建字符串感悟最后 前言 Redis中实现了sds(simple dynamic string)这种字符串,它比c语言标准库的char*字符串更加实用 代码位置 src/sdc.h …

python自动化测试脚本可以测php吗_python unittest实现api自动化测试_python

这篇文章主要为大家详细介绍了python unittest实现api自动化测试的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 项目测试对于一个项目的重要性,大家应该都知道吧,写python的朋友,应该都写过自动化测试脚本。…

Linux服务器版本鼠标,安装GPM给Linux虚拟控制台提供配置鼠标支持

给你的 Linux 系统安装 GPM,这样我们就可以在虚拟控制台中配置鼠标,比如进行复制与粘贴操作。GPM 是一个守护程序,是通用鼠标的首字母的缩写,它可以帮助你配置 Linux 虚拟控制台的鼠标支持。GPM 在以下场景中特别有用:…

valgrind 内存泄漏_应用 AddressSanitizer 发现程序内存错误

应用 AddressSanitizer 发现程序内存错误作为 C/ C 工程师,在开发过程中会遇到各类问题,最常见便是内存使用问题,比如,越界,泄漏。过去常用的工具是 Valgrind,但使用 Valgrind 最大问题是它会极大地降低程序…

配置文件存int类型_Redis详解(五)------ redis的五大数据类型实现原理

> 本系列教程持续更新,可以微信搜索「 IT可乐 」第一时间阅读。回复《电子书》有我为大家特别筛选的书籍资料前面两篇博客,第一篇介绍了五大数据类型的基本用法,第二篇介绍了Redis底层的六种数据结构。在Redis中,并没有直接使用…

java list 占用内存不释放_性能不打折,内存占用减少90%,Facebook提出极致模型压缩方法Quant-Noise...

对于动辄上百 M 大小的神经网络来说,模型压缩能够减少它们的内存占用、通信带宽和计算复杂度等,以便更好地进行应用部署。最近,来自 Facebook AI 的研究者提出了一种新的模型量化压缩技术 Quant-Noise,让神经网络在不降低性能的前…

苹果系统安装python环境_如何在mac下配置python虚拟环境

安装python虚拟环境核心目的就是为了复制一个python环境,这样新项目下载的所有包,都会存放在虚拟环境下的python site-package 中 首先安装 1. sudo pip install virtualenv # 安装虚拟环境 2. sudo pip install virtualenvwrapper # 安装虚拟环境扩展包 3. vim .bash_profile …

linux程序无法获取cpu资源,Linux系统编程获取系统的CPU资源

还是纯干货&#xff0c;代码拿来&#xff1a;#include #include #include #include #include #include #include void work(){FILE *f;int i;double x 4.5;f tmpfile();for(i 0; i < 10000;i){fprintf(f,"Do some output\n");if (ferror(f)){fprintf(stderr,&q…

dbnetlib sqlserver不存在或拒绝访问_404:对不起,您访问的网页不存在

404&#xff1a;对不起您访问的网页不存在https://www.zhihu.com/video/1101123296195723264你可能在上网时也好奇过&#xff0c;为什么点开一个无法显示信息的页面&#xff0c;上面会出现数字404&#xff1f;要解释这个问题&#xff0c;我们需要从互联网诞生之初说起。20世纪8…

linux中控和安卓中控哪个比较好,原厂中控和改装中控有什么区别?哪个更好?...

很多人都喜欢车辆上有一个大屏的中控。那种大屏的中控不仅功能很多&#xff0c;而且还很实用。但是有很多车需要高配才能有中控。而且还需要加钱。很多人在买车的时候都会选择一些低配的车&#xff0c;然后自己去安装中控。有些人认为原厂的中控不仅价格贵&#xff0c;而且还有…

bufferedreader读取中文乱码_python之pandas模块关于csv文件乱码问题解决

介绍相信部分小伙伴们在处理windows系统生成的csv文件时会遇到中文显示乱码的问题&#xff0c;尤其是使用Excel打开这类文件时这类问题尤为突出。解决如图&#xff0c;我们通过Excel工具打开该csv文件时&#xff0c;中文展示为乱码。此时&#xff0c;只需要我们通过功能强大的数…

linux mint python3.6,Linux 上如何安装并切换最新版本的 Python 3.6

原标题&#xff1a;Linux 上如何安装并切换最新版本的 Python 3.6如果你安装了 Linux 系统&#xff0c;正在学习 Python 并想要使用最新的版本的话&#xff0c;那么这篇文章就是为你而写的。-- ShekinPython是 Linux 中一种最流行的编程语言。它被写成了各种工具和库。除此之外…

centos 卸载软件_Linux服务器运维必备技能 软件包和启动项超详细整理

一、RedHat/CentOS包管理1. 包管理工具RPM(1) 简介最早用在 RedHat的包管理器&#xff0c;现在已经成为Linux常见的包管理系统。RPM包有两种类型&#xff1a;二进制RPM包源码RPM包可以在www.rpmfind.net网站查询软件包&#xff0c;也可以查到其依赖项&#xff1a;(2) RPM包命名…

linux内存分配器类型,内核早期内存分配器:memblock

原标题&#xff1a;内核早期内存分配器&#xff1a;memblock本文转载自Linux爱好者本文来自 程雪涛的自荐投稿Linux内核使用伙伴系统管理内存&#xff0c;那么在伙伴系统工作前&#xff0c;如何管理内存&#xff1f;答案是memblock。memblock在系统启动阶段进行简单的内存管理&…

java substring截取字符串_java基础教程之字符串的介绍,比较重要的一个知识点【下】...

字符串操作1、获取子字符串通过String类的substring()方法可对字符串进行截取。这些方法的共同点就是都是利用字符串的下标进行截取。应明确字符串下标是从0开始的。substring()方法被两种不同的方法重载&#xff0c;来满足不同的需要。(1)substring(intbeginIndex)该方法返回的…

在linux环境下安装wiringpi库,wiringPi库的pwm配置及使用说明

本文介绍树莓派(raspberry pi)在linux c 环境下的硬件pwm配置及使用方法。1. 下载安装wiringPi此步骤建议参考官网指南&#xff0c;wiringPi提供了对树莓派的硬件IO访问&#xff0c;包括GPIO/I2C/PWM等&#xff0c;下载安装后本地会出现wiringPi文件夹&#xff0c;根目录下有/e…