①特征选取之单变量统计、基于模型选择、迭代选择

简介: 特征选取之单变量统计、基于模型选择、迭代选择

单变量统计

方差分析

在单变量统计中,我们计算每个特征和目标值之间的关系是否存在统计显著性,然后选择具有最高置信度的特征。对于分类问题,这也被称为方差分析(analysis of variance,ANOVA)。


这些测试的一个关键性质就是它们是单变量的(univariate),即它们只单独考虑每个特征。因此,如果一个特征只有在与另一个特征合并时才具有信息量,那么这个特征将被舍弃。


单变量测试的计算速度通常很快,并且不需要构建模型。另一方面,它们完全独立于你可能想要在特征选择之后应用的模型。


注意:不需要构建模型,利用纯理论的数学思维去构建出来


想要在 scikit-learn 中使用单变量特征选择,你需要选择一项测试——对分类问题通常是 f_classif(默认值),对回归问题通常是 f_regression——然后基于测试中确定的 p 值来选择一种舍弃特征的方法。所有舍弃参数的方法都使用阈值来舍弃所有 p 值过大的特征(意味着它们不可能与目标值相关)。计算阈值的方法各有不同,最简单的是 SelectKBest和 SelectPercentile,前者选择固定数量的 k 个特征,后者选择固定百分比的特征。


代码实现

from sklearn.feature_selection import SelectPercentile
select=SelectPercentile(percentile=50)    #选取50%的特征
select.fit(X_train,y_train)
X_train_selected=select.transform(X_train)
print(X_train.shape)
print(X_train_selected.shape)

案例分析

import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.feature_selection import SelectPercentile    #SelectPercentile选择百分比,SelectKBest选择个数
from sklearn.model_selection import train_test_split
#使用sklearn自带的数据集
cancer=load_breast_cancer()
#向数据中添加噪声特征,前30个特征来自原数据集,后50个是噪声
rng=np.random.RandomState(42)
#构造噪声特征
noise=rng.normal(size=(len(cancer.data),50))
X_w_noise=np.hstack([cancer.data,noise])
#分割数据集用于测试和训练
X_train,X_test,y_train,y_test=train_test_split(X_w_noise,cancer.target,random_state=0,test_size=.5)
#特征选取
select=SelectPercentile(percentile=50)    #选取50%的特征
select.fit(X_train,y_train)
X_train_selected=select.transform(X_train)
print(X_train.shape)
print(X_train_selected.shape)

image.png

import pandas as pd 
import numpy as np
# 分类常用的
from sklearn.feature_selection import SelectKBest,f_classif,chi2,mutual_info_classif
# 分别是卡方检验,计算非负特征和类之间的卡方统计 chi
# 样本方差F值,f_classif
# 离散类别交互信息, mutual_info_classif
# 回归常用的
from sklearn.feature_selection import f_regression,mutual_info_regression

很明显的就发现特征变化了,而且是50%,还可以看看那些特征被选取


#查看哪些特征被选中
mask=select.get_support()
print(mask)
import matplotlib.pyplot as plt
plt.matshow(mask.reshape(1,-1),cmap='gray_r')
plt.xlabel('sample index')
plt.show()

这一类的特征选取方法比较的直接,也就是说直接保留多少占比的特征数量,在某些时候的模型训练中,我们需要根据特征的权重进行自定义的筛选。

SelectKBest特征选取

这类选取方法和相关系数选取比较的相似,可以通过这些对象的得分,选取重要的数据列

selector= SelectKBest(score_func= chi2,k=len(X.columns))
selector.fit(X,y)
score=-np.log10(selector.pvalues_)
# print(score)
score_index=np.argsort(score)[::-1]
for i in range(len(score)):
    print("%0.2f %s"%(score[score_index[i]],X.columns[score_index[i]]))

image.png


上述的数值大小代表着特征的重要性(下面有一个完整的代码实例)

from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
from sklearn.datasets import load_iris
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from  scipy.stats import chi2_contingency
import numpy as np
model = SelectKBest(chi2, k=8)#选择k个最佳特征
X_new = model.fit_transform(X, y)
#feature_data是特征数据,label_data是标签数据,该函数可以选择出k个特征 
print("model shape: ",X_new.shape)
scores = model.scores_
print('model scores:', scores)  # 得分越高,特征越重要
p_values = model.pvalues_
print('model p-values', p_values)  # p-values 越小,置信度越高,特征越重要
# 按重要性排序,选出最重要的 k 个
indices = np.argsort(scores)[::-1]
k_best_features = list(X.columns.values[indices[0:8]])
print('k best features are:\n ',k_best_features)
print(k_best_features)

简而言之,使用SelectKBest选取,可以调整里面的参数值,最终确定最重要的几个特征

相关文章
|
9月前
GET与POST之间的差异:为何GET请求的参数在浏览器历史记录中被完整保留,而POST的不被保留?
基于以上,我们可以得出结论:GET请求的参数在浏览器历史记录中之所以能被完整保存,系其请求设计之本质。另一方面,POST请求的参数不被保存,也同样源于其设计目标和工作原理的考虑。
289 12
|
机器学习/深度学习 运维 数据可视化
Python时间序列分析:使用TSFresh进行自动化特征提取
TSFresh 是一个专门用于时间序列数据特征自动提取的框架,支持分类、回归和异常检测等机器学习任务。它通过自动化特征工程流程,处理数百个统计特征(如均值、方差、自相关性等),并通过假设检验筛选显著特征,提升分析效率。TSFresh 支持单变量和多变量时间序列数据,能够与 scikit-learn 等库无缝集成,适用于大规模时间序列数据的特征提取与模型训练。其工作流程包括数据格式转换、特征提取和选择,并提供可视化工具帮助理解特征分布及与目标变量的关系。
1120 16
Python时间序列分析:使用TSFresh进行自动化特征提取
|
机器学习/深度学习 自然语言处理 算法
深度学习基础知识:介绍深度学习的发展历程、基本概念和主要应用
深度学习基础知识:介绍深度学习的发展历程、基本概念和主要应用
7158 0
|
Web App开发 移动开发 安全
h5页面的优缺点(浅谈)
H5页面优点包括:跨平台性,易于传播,丰富的多媒体支持,开发成本低,更新便捷,良好的交互性。缺点则有:性能受限,功能受限,高度依赖网络,存在安全风险,用户体验一致性差。确保H5页面在不同设备上的兼容性,需遵循HTML5标准,使用响应式设计,并进行多设备测试。优化H5页面性能的方法包括减少HTTP请求,压缩文件大小,利用缓存机制,优化代码执行效率等。
|
缓存 NoSQL Redis
Redis 如何批量设置过期时间?PIPLINE的使用
不要说在foreach中通过set()函数批量设置过期时间 我们引入redis的PIPLINE,来解决批量设置过期时间的问题。
1022 0
Redis 如何批量设置过期时间?PIPLINE的使用
|
人工智能 Serverless
AI助理精准匹配,为您推荐方案——如何添加一个Stable Difussion图像生成应用
介绍了一种利用AI助手快速获取并搭建Stable Diffusion图像生成应用的方法。用户只需在阿里云官网向AI助手提出需求,即可获得详细的实施方案。随后,按照AI助手提供的方案,通过函数计算部署应用,并进行测试。此过程显著提升了开发效率。
1130 2
AI助理精准匹配,为您推荐方案——如何添加一个Stable Difussion图像生成应用
|
Windows 存储 Cloud Native
C++Qt windows系统托盘增加图标和功能
C++Qt windows系统托盘增加图标和功能
|
机器学习/深度学习 人工智能 自然语言处理
从零构建医疗领域知识图谱的KBQA问答系统:其中7类实体,约3.7万实体,21万实体关系。
从零构建医疗领域知识图谱的KBQA问答系统:其中7类实体,约3.7万实体,21万实体关系。
从零构建医疗领域知识图谱的KBQA问答系统:其中7类实体,约3.7万实体,21万实体关系。
|
弹性计算 网络协议 Linux
手动搭建FTP站点(CentOS 7)
本教程介绍如何在Linux实例上安装并配置vsftpd。

热门文章

最新文章