大家好,欢迎来到IT知识分享网。
根据特征选择的形式可以将特征选择方法分为3种:
Filter:过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。
Wrapper:包装法,根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征。
Embedded:嵌入法,先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。类似于Filter方法,但是是通过训练来确定特征的优劣。
使用sklearn中的feature_selection库来进行特征选择:
Filter
一、方差选择法
使用方差选择法,先要计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征。使用feature_selection库的VarianceThreshold类来选择特征:
(1)其特征选择原理只关心特征变量X,而不需要数据中的输出结果y,因此可以被用于无监督学习。
(2)code:
from sklearn.feature_selection import VarianceThreshold
x=data(特征数据)
y=data_1(标签)
var=VarianceThreshold(threshold=3) #参数threshold为方差的阈值。threshold:可以有很多选择【特征中位数np.median(x.var.valuse);特征/特征均值:x/x.mean ;x.var().mean()等等】
var.fit_transform(x)#返回值为选择后的数据
var.feature_names_in_ #查看模型拟合时导入的特征名称
var.get_feature_names_out() #查看被留下特征的字符名称
var.variances_ #每个特征对应的方差值
(3)缺点:
每个特征的方差不一,其重要程度无法准确估量,用一个特征方差去评估另一个,风险太大。
二、相关系数法
使用相关系数法,先要计算各个特征对目标值的相关系数以及相关系数的P值。使用feature_selection库的SelectKBest类结合相关系数来选择特征的代码如下:
x=data (特征)
y=label(biaoqian)
SelectKBest(lambda X, Y: array(map(lambda x:pearsonr(x, Y), X.T)).T,k=2).fit_transform(x, y)
三、卡方检验
Wrapper
递归消除特征法使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。使用feature_selection库的RFE类来选择特征的代码如下:
x=data(特征)
Embedded
一、基于惩罚项的特征选择法
使用带惩罚项的基模型,除了筛选出特征外,同时也进行了降维。使用feature_selection库的SelectFromModel类结合带L1惩罚项的逻辑回归模型,来选择特征的代码如下:
L1惩罚项降维的原理在于保留多个对目标值具有同等相关性的特征中的一个,所以没选到的特征不代表不重要。故,可结合L2惩罚项来优化。
使用feature_selection库的SelectFromModel类结合带L1以及L2惩罚项的逻辑回归模型,来选择特征的代码如下:
二、基于树模型的特征选择法
树模型中GBDT也可用来作为基模型进行特征选择,使用feature_selection库的SelectFromModel类结合GBDT模型,来选择特征的代码如下:
当特征选择完成后,可以直接训练模型了,但是可能由于特征矩阵过大,导致计算量大,训练时间长的问题,要进行降低特征矩阵维度。
常见的降维方法除了以上提到的基于L1惩罚项的模型以外,另外还有主成分分析法(PCA)和线性判别分析(LDA),线性判别分析本身也是一个分类模型。
PCA和LDA有很多的相似点,其本质是要将原始的样本映射到维度更低的样本空间中,但是PCA和LDA的映射目标不一样:PCA是为了让映射后的样本具有最大的发散性;而LDA是为了让映射后的样本有最好的分类性能。所以说PCA是一种无监督的降维方法,而LDA是一种有监督的降维方法。
不管是数据预处理,还是特征选择,抑或降维,它们都是通过某个类的方法fit_transform完成的,fit_transform要不只带一个参数:特征矩阵,要不带两个参数:特征矩阵加目标向量。
特征筛选是指从所有特征中选出最重要的特征用于模型训练,以提高模型的准确性和泛化能力。以下是一些特征筛选方法的示例代码:
- 相关系数法:
import pandas as pd import numpy as np data = pd.read_csv('data.csv') corr_matrix = data.corr().abs() # 取出与目标特征相关系数大于等于0.5的特征 important_features = [col for col in corr_matrix.columns if any(corr_matrix[col] >= 0.5)]
- 方差选择法:
from sklearn.feature_selection import VarianceThreshold data = pd.read_csv('data.csv') # 特征方差小于0.1的特征将被删除 selector = VarianceThreshold(threshold=0.1) selector.fit_transform(data) important_features = [col for i, col in enumerate(data.columns) if selector.get_support()[i]]
- 卡方检验:
from sklearn.feature_selection import SelectKBest, chi2 data = pd.read_csv('data.csv') X = data.iloc[:, :-1] y = data.iloc[:, -1] # 选择前10个最重要的特征 selector = SelectKBest(chi2, k=10) selector.fit_transform(X, y) important_features = X.columns[selector.get_support()]
- 基于模型的特征选择:
from sklearn.ensemble import RandomForestClassifier data = pd.read_csv('data.csv') X = data.iloc[:, :-1] y = data.iloc[:, -1] # 使用随机森林模型进行特征选择 rf = RandomForestClassifier(n_estimators=100, random_state=42) rf.fit(X, y) important_features = X.columns[np.argsort(rf.feature_importances_)[::-1]][:10]
以上是一些特征筛选方法的示例代码,具体应该选择哪种方法取决于数据集的特点和实际情况。
补充:
特征筛选代码:
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/138316.html