特征选择

本文深入探讨了特征选择的三种主要方法:Filter(过滤法)、Wrapper(包裹法)和Embedded(嵌入法)。详细介绍了每种方法下的具体算法,如方差阈值、相关系数法、卡方检验、互信息、递归特征消除法(RFE)、基于惩罚项的选择和基于树模型的选择。通过实例展示了如何使用sklearn库进行特征选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#特征选择
# (1)filter

#1.1 方差:先要计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征
from sklearn.feature_selection import VarianceThreshold
data_var=VarianceThreshold(threshold=3).fit_transform(iris.data)
# print('data_var',data_var)
#单变量选择:分类(卡方检验【定性自变量对定性因变量】,互信息)
# 回归(皮尔森相关系数【变量之间的线性相关性】)

#1.2 相关系数法:先要计算各个特征对目标值的相关系数以及相关系数的P值
#选择k个最好的特征,选择特征选择后的数据
#第一个参数为计算评估特征是否好的函数,该函数输入特征矩阵和目标向量,
# 输出二元组(评分,P值)的数组,数组第i项为第i个特征的评分和P值。在此定义为计算相关系数
from sklearn.feature_selection import SelectKBest
from scipy.stats import pearsonr
data_prear=SelectKBest(lambda X, Y: numpy.array(map(lambda x:pearsonr(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)
print('data_kbest',data_prear)


#1.3 卡方检验:自变量对定性因变量的相关性,卡方值越大,说明关联越强,特征越需要保留
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
data_chi2=SelectKBest(chi2,k=2).fit_transform(iris.data,iris.target)
# print(data_chi2)

#1.4 互信息和最大信息系数:定性自变量对定性因变量的相关性
from sklearn.feature_selection import SelectKBest
from minepy import MINE
import numpy


# 由于MINE的设计不是函数式的,定义mic方法将其为函数式的,返回一个二元组,二元组的第2项设置成固定的P值0.5
def mic(x, y):
m = MINE()
m.compute_score(x, y)
return (m.mic(), 0.5)

SelectKBest(lambda X, Y: numpy.array(map(lambda x: mic(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)


#(2) wrapper

# (一)RFE基本思想
#
# 1.将全部特征纳入模型中,得到特征对应的系数(即权重);
# 2.将取值最小的系数平方和对应的特征从模型中移除;
#
# 3.用剩下的特征在进行模型训练,在进行特征移除,直至没有特征;
#2.1 递归特征消除法:用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
data_rfe=RFE(estimator=LogisticRegression(),n_features_to_select=2).fit_transform(iris.data, iris.target)
#(3) Embedded

#3.1 基于惩罚项
from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression
data_l1=SelectFromModel(LogisticRegression(penalty='l1',C=0.1)).fit_transform(iris.data, iris.target)
# print('data_l1',data_l1)

#3.2 基于树模型
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import GradientBoostingClassifier
data_gbdt=SelectFromModel(GradientBoostingClassifier()).fit_transform(iris.data, iris.target)
# print('data_gbdt',data_gbdt)

转载于:https://www.cnblogs.com/hapyygril/p/9965374.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值