特征工程-特征筛选

特征筛选的重要性:

        在机器学习和数据科学领域,特征筛选是优化模型性能和提高计算效率的关键步骤。当数据集包含大量特征时,不仅增加了计算成本,还可能引入噪声和冗余信息,影响模型的泛化能力。因此,通过特征筛选,让我们能够从原始特征集中挑选出最具信息量的特征,提高模型的预测准确性和可解释性。

特征筛选的方法:

特征筛选方法可以分为三大类:过滤法(Filter)、包装法(Wrapper)、嵌入法(Embedded)。


1.过滤法——方差分析(ANOVA)

        方差分析是一种用于分析不同组之间是否存在显著性差异的统计方法。在特征选择中,我们使用ANOVA来衡量特征与目标变量之间的关联程度。

  • F统计量:ANOVA计算的F统计量衡量了特征对目标变量的影响程度。F统计量越大,表示特征与目标变量之间的关系越显著。
  • P值:P值表示观察到的统计量(如F统计量)的概率。在特征选择中,我们关注的是P值是否小于设定的显著性水平(通常为0.01或0.05)。小于显著性水平的特征被认为对目标变量有显著影响。
  • 自由度:在ANOVA F测试中,总自由度是组数减去1。每个组内部的自由度是组内的观测数减去1。
  • BH校正是一种常用的多重假设校正方法,在进行大量的假设检验时,由于多次比较可能导致错误的显著性结果,BH校正能够有效控制错误的发生率

1.1 SelectFdr的应用

在Scikit-learn中,SelectFdr是一种方便的工具,它通过同时应用BH校正过滤特征,快速选取显著的特征。

  1. 排序P值:首先将所有特征的P值按升序排列。
  2. 计算校正后的显著性水平:通过BH校正,我们根据排序后的P值和特征数量计算每个特征的校正显著性水平。
  3. 设定显著性水平:通过设定alpha参数,指定显著性水平。
  4. 选取显著特征:选取校正后显著水平小于设定显著性水平的特征。
  5. 拟合模型:使用SelectFdr拟合模型,自动进行BH校正和特征过滤。
  6. 获取结果:获取过滤后的特征集,用于训练模型

1.2 SelectKBest的应用

SelectKBest是另一种常用的特征选择方法,它选择评分最高的K个特征,忽略其余。

  1. 设定K值:通过设定k参数,选择希望保留的特征数量。
  2. 拟合模型:使用SelectKBest拟合模型,选择得分最高的K个特征。
  3. 获取结果:获取选择后的特征集,用于训练模型。
from ucimlrepo import fetch_ucirepo 

# 使用ucimlrepo库中的fetch_ucirepo函数加载了一个心脏梗死并发症的数据集
myocardial_infarction_complications = fetch_ucirepo(id=579) 

# data (as pandas dataframes) :将数据集拆分为特征(X)和目标变量(y)
X = myocardial_infarction_complications.data.features 
y = myocardial_infarction_complications.data.targets 

# metadata :数据集的元数据
print(myocardial_infarction_complications.metadata) 

# variable information :数据集的变量信息
print(myocardial_infarction_complications.variables)


# 导入Scikit-learn中的特征选择模块
from sklearn.feature_selection import SelectFdr, f_classif, SelectKBest
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
# 导入Scikit-learn中的数据缺失值处理模块
from sklearn.impute import SimpleImputer
# 预处理,包括填充缺失值和标准化
from sklearn.preprocessing import StandardScaler



# 设置随机数生成器的种子值为42
np.random.seed(42)

# 对y进行处理,选择目标变量的某一列('LET_IS')
y = y['LET_IS'] 
X = X

# 使用train_test_split将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y)

# 打印训练集和测试集的形状
print('X shape = {}'.format(X_train.shape) + '\ny shape = {}'.format(y_train.shape))
print('X shape = {}'.format(X_test.shape) + '\ny shape = {}'.format(y_test.shape))

# 缺失值填充
imp = SimpleImputer(strategy='median').fit(X_train)
X_train = imp.transform(X_train)
X_test = imp.transform(X_test)

# 数据标准化
scaler = StandardScaler().fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)

# 使用ANOVA计算F统计量和P值
anova_res = f_classif(X_train, y_train)
pvalues = anova_res[1]

# 检查小于0.01显著水平的P值数量
alpha = 0.01
print("ANOVA F统计量(未进行多重假设校正)中的重要特征数量:", sum(anova_res[1] < alpha))

# 打印进行BH校正前认为显著的最大P值
pvalues_taken_before_BH = pvalues[pvalues < alpha]
print("BH校正前认为显著的最大P值是:{:.4f}".format(pvalues_taken_before_BH.max()))

# 实施BH校正
pvalues_sorted = np.sort(anova_res[1])
pvalues_taken_using_BH = pvalues_sorted[pvalues_sorted <= np.arange(1, X_train.shape[1] + 1) * alpha / X_train.shape[1]]
print("ANOVA F统计量(进行BH校正后)中的重要特征数量:", len(pvalues_taken_using_BH))
print("BH校正后认为显著的最大P值是:{:.4f}".format(pvalues_taken_using_BH.max()))

# 使用SelectFdr同时应用BH校正和过滤特征
filter_fdr = SelectFdr(alpha=0.01).fit(X_train, y_train)
print("前20个特征的P值:\n", filter_fdr.pvalues_[0:20])
X_train_filtered_BH = filter_fdr.transform(X_train)
print("ANOVA F统计量(进行BH校正后)中的重要特征数量:", X_train_filtered_BH.shape[1])
X_test_filtered_BH = filter_fdr.transform(X_test)
print("测试集的形状(特征数量应与训练集相匹配):", X_test_filtered_BH.shape)

# 使用SelectKBest
filter_KBest = SelectKBest(k=50).fit(X_train, y_train)
X_train_filtered_KBest = filter_KBest.transform(X_train)
print("ANOVA F统计量(选择50个最佳特征)中的重要特征数量:", X_train_filtered_KBest.shape[1])
X_test_filtered_KBest = filter_KBest.transform(X_test)
print("测试集的形状(特征数量应与训练集相匹配):", X_test_filtered_KBest.shape)

        这段代码是一个完整的特征选择过程,使用了方差分析(ANOVA)进行特征选择,并结合了多重假设校正(BH校正)以及Scikit-learn中的SelectFdr和SelectKBest两种工具。代码展示了在处理心脏梗死并发症数据时,如何进行特征选择并应用统计学方法进行显著性检验,以提高模型的预测性能。以下是对代码运行的结果:

        使用柱状图可视化统计量和P值。左下侧图显示了各个特征的ANOVA F统计量,右下侧图显示了特征的P值的负对数(-log10)。通过这样的可视化,可以直观地了解每个特征在样本类别之间的方差以及其显著性程度,有助于进行特征选择和理解特征的重要性。

import matplotlib.pyplot as plt
import seaborn as sns

# 使用ANOVA计算F统计量和P值
anova_res = f_classif(X_train, y_train)
pvalues = anova_res[1]

# 将ANOVA F统计量和P值可视化
plt.figure(figsize=(12, 6))

# 绘制ANOVA F统计量的柱状图
plt.subplot(1, 2, 1)
sns.barplot(x=np.arange(1, len(anova_res[0]) + 1), y=anova_res[0], color='blue')
plt.xticks(rotation=45)  # 旋转刻度标签,以防止重叠
plt.title('ANOVA F Statistics for Features')
plt.xlabel('Feature Index')
plt.ylabel('ANOVA F Statistic')
# 设置x轴刻度显示一部分
x_ticks_selected = np.arange(1, len(anova_res[0]) + 1, 5)  # 每隔5个特征显示一个
plt.xticks(x_ticks_selected, rotation=45)


# 绘制P值的柱状图
plt.subplot(1, 2, 2)
sns.barplot(x=np.arange(1, len(pvalues) + 1), y=-np.log10(pvalues), color='green')
plt.xticks(rotation=45)  # 旋转刻度标签,以防止重叠
plt.title('Negative Log10 P-values for Features')
plt.xlabel('Feature Index')
plt.ylabel('-log10(P-value)')
# 设置x轴刻度显示一部分
x_ticks_selected = np.arange(1, len(pvalues) + 1, 5)  # 每隔5个特征显示一个
plt.xticks(x_ticks_selected, rotation=45)
plt.tight_layout()
plt.show()

2. 嵌入法—— 递归特征消除 RFE、 RFE-CV

        嵌入式方法是一种在构建预测模型后,可以利用模型结构进行特征选择的算法。换句话说,特征选择阶段被嵌入到模型训练中。在这方面,一旦模型训练完成,特征的重要性就可以通过学习器的属性来判断。

        例如,在归一化数据上训练的线性模型中,系数的大小可以被视为它们对目标变量的影响。现在,如果在相同的场景中一个特征的系数为零,这意味着在给定数据中该特征对目标变量没有影响。嵌入式方法分为两种类型:1) 非迭代型;2) 迭代型

2.1 非迭代型嵌入式方法

        非迭代型嵌入式方法不需要迭代搜索策略来选择特征。在这里,“迭代”并不指的是用于在给定一组固定特征的情况下构建基础预测模型的迭代优化方法。相反,指的是一种用于选择特征的迭代过程。

        一个非迭代型嵌入式方法的例子是基于L1正则化(Lasso)的逻辑回归,这个分类器具有在高维环境中选择特征的属性,因为它将许多特征的系数设为零。一些其他模型,如决策树和随机森林,也有内部机制来定义特征的“重要性”。

        举个例子,考虑一个支持向量机(SVM)分类器。非迭代型嵌入式方法可以是在训练过程中修改SVM的核函数,使得只有部分特征对分类有贡献。这样,在训练结束后,我们得到的是一个使用较少特征的SVM模型。这种方法不需要像迭代型嵌入式方法那样,反复迭代地搜索和选择特征。

        具体实现上,非迭代型嵌入式方法可以通过设置阈值使用惩罚项或者采用集成学习等方法来实现。这些方法在训练过程中直接对模型进行优化,以选择出最重要的特征。由于不需要迭代搜索,非迭代型嵌入式方法的计算效率通常较高,但可能不如迭代型方法在特征选择上的灵活性

2.2 迭代型嵌入式方法

        与计算添加或删除特征子集的多个性能评分的包装器相比,迭代型嵌入式方法通过与学习算法训练好的预测模型的结构相关的某些标准来引导搜索。

        例如其中一种前向选择过程,适用于使用梯度下降来优化对数损失的模型。在每次迭代中,该方法识别并添加在减小损失函数方面速度最快的特征(即相对于特征权重的损失函数梯度具有最大幅度的特征)。其中最流行的迭代型嵌入式特征选择方法之一是递归特征消除(Recursive Feature Elimination, RFE)。在这种方法中,使用与训练好的预测模型结构相关的特征排名标准,以递归方式删除排名最低的特征。

2.3 递归特征消除(Recursive Feature Elimination, RFE)

        RFE(Recursive Feature Elimination)属于迭代型的特征选择方法。在RFE中,特征的选择是通过反复的迭代过程完成的。具体而言,RFE的工作流程如下:

  • 初始阶段:使用所有特征训练模型。
  • 评估特征重要性:通过模型的特征权重或系数,识别对模型性能贡献较小的特征。
  • 剔除特征:剔除这些对模型贡献较小的特征。
  • 迭代:重复上述步骤,直到达到指定的特征数目或其他停止条件。

        这个迭代过程使得模型在每一轮迭代中都会选择对模型性能影响最小的特征并进行剔除,从而逐步降低特征数量。

        RFE-CV(Recursive Feature Elimination with Cross-Validation)是RFE的变体,引入了交叉验证来更可靠地评估特征子集的性能。虽然在评估上使用了交叉验证,但整体的特征选择过程仍然是迭代的。

2.4 代码实现

        Scikit-learn实现了两个用于RFE的类:RFERFECV,它们都位于sklearn.feature_selection模块中。

        在RFE中,需要设置n_features_to_select参数,该参数指示RFE选择的特征数量。目前,该参数的默认值为None,将返回特征数量的一半。另一方面,RFECV将从交叉验证中选择特征数量。例如,对于step=1,将计算p(特征数量)个CV分数,并选择导致最高分数的特征子集。

        RFE和RFECV类的另一个方便且有用的特性是它们都实现了predictscore方法,使用这些方法可以将提供的测试数据的特征减少到所选的特征数量,并进行预测和计算得分。

import numpy as np
import matplotlib.pyplot as plt
# 从Scikit-Learn库中导入make_classification函数,用于生成分类问题的合成数据集
from sklearn.datasets import make_classification
# 从Scikit-Learn库中导入递归特征消除(RFE)方法
from sklearn.feature_selection import RFE
# 从Scikit-Learn库中导入递归特征消除交叉验证(RFECV)方法
from sklearn.feature_selection import RFECV
# 从Scikit-Learn库中导入StratifiedKFold,用于生成分层折叠的交叉验证数据集
from sklearn.model_selection import StratifiedKFold
from sklearn.model_selection import train_test_split
# 从Scikit-Learn库中导入线性判别分析(LDA)模型
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA

# 设置随机种子以确保结果的可重复性
np.random.seed(42)
# 定义特征的数量
n_features = 100
# 定义有信息性特征的数量
n_informative = 10
# 初始化线性判别分析(LDA)模型
lda = LDA()
# 生成分类问题的合成数据集
X, y = make_classification(  
    n_samples=1000,      # 生成1000个样本  
    n_features=n_features,  # 特征的数量由变量n_features决定  
    n_informative=n_informative,  # 有n_informative个特征是提供信息的  
    n_redundant=0,          # 没有冗余特征  
    n_repeated=0,           # 没有重复特征  
    n_classes=2,             # 生成2个类别的数据  
    n_clusters_per_class=1,   # 每个类别有一个聚类中心  
    class_sep=1,              # 类别的分离度为1  
    shuffle=False             # 不打乱数据  
)

# 划分数据集为训练集和测试集
X_train_full, X_test_full, y_train, y_test = train_test_split(
    X,
    y,
    stratify=y,  # 使用分层抽样以保持类别分布的一致性
    train_size=0.2
)

import time
# 记录代码执行开始时间
start = time.time()
# 初始化递归特征消除(RFE)对象,选择要保留的特征数量为10
rfe = RFE(lda, n_features_to_select=10)
rfe.fit(X_train_full, y_train)
print("RFE选择的特征掩码:", rfe.get_support())
print("RFE选择的真正有信息的特征数量:", sum(rfe.get_support()[:10]))
end = time.time()
print("RFE执行时间(秒):{:.4f}".format(end - start))
lda_score = rfe.score(X_test_full, y_test)
# 打印使用选定特征的LDA模型在测试数据上的得分
print("使用选定特征的LDA模型在测试数据上的得分:{:.4f}".format(lda_score))

# 绘制图像
selected_features = np.array(range(1, len(rfe.support_) + 1))[rfe.support_]
plt.figure(figsize=(10, 6))
plt.title('RFE feature selection results')
plt.xlabel('Feature index')
plt.ylabel('Selected or not')
plt.scatter(selected_features, np.ones(len(selected_features)), marker='o', label='Selected', color='blue')
plt.scatter(np.setdiff1d(range(1, len(rfe.support_) + 1), selected_features), np.zeros(len(np.setdiff1d(range(1, len(rfe.support_) + 1), selected_features))), marker='x', label='Un-selected', color='red')
plt.legend()
plt.grid(True)
plt.show()



在整个数据集上进行RFECV模型拟合的确可能导致过拟合的问题,为了避免过拟合,最好将特征选择过程嵌套在交叉验证的内部。这意味着在每个交叉验证折叠中,使用训练数据进行特征选择,而不是在整个数据集上进行。这样可以确保模型在每个折叠中都是基于相对独立的训练数据进行评估的,代码中RFECV的cv参数使用了strkfold,这是一个使用分层抽样的StratifiedKFold对象,有助于确保每个交叉验证折叠中都保持了类别的分布

# 初始化StratifiedKFold对象,用于生成分层折叠的交叉验证数据集
strkfold = StratifiedKFold(n_splits=5, shuffle=True)
import time
start = time.time()
# 初始化递归特征消除交叉验证(RFECV)对象,使用StratifiedKFold进行交叉验证,n_jobs=-1表示使用所有可用的CPU核心进行并行计算
rfecv = RFECV(lda, cv=strkfold, n_jobs=-1)
rfecv.fit(X, y)

print("RFECV选择的特征掩码:", rfecv.get_support())
# 打印RFECV选择的特征数量
print("RFECV选择的特征数量:", rfecv.n_features_)
print("RFECV选择的真正有信息的特征数量:", sum(rfecv.get_support()[:10]))
end = time.time()
print("RFECV执行时间(秒):{:.4f}".format(end - start))
# 使用RFECV选择的特征进行LDA模型的评估
lda_score = rfecv.score(X_test_full, y_test)
# 打印使用选定特征的LDA模型在测试数据上的得分
print("使用选定特征的LDA模型在测试数据上的得分:{:.4f}".format(lda_score))


plt.figure(figsize=(10, 6))
plt.title('RFECV feature ranking change curve')
plt.xlabel('Number of features')
plt.ylabel('Cross validation score')
plt.plot(range(1, len(rfecv.cv_results_['mean_test_score']) + 1), rfecv.cv_results_['mean_test_score'])
plt.grid(True)
plt.show()


3. 封装法—— SFS、SBS

        特征选择中的封装法(Wrapper Methods)是一种通过反复训练模型来评估特征子集性能的方法,与过滤法(Filter Methods)和嵌入法(Embedded Methods)不同,封装法使用了一个实际的机器学习模型来评估特征的贡献,以此来选择最佳的特征子集。

3.1 封装法的主要特点

  • 创建候选特征子集:封装法从初始的特征集合中生成不同的特征子集,可能包含不同数量的特征。
  • 训练模型:对于每个特征子集,一个实际的机器学习模型(例如,分类器或回归器)被训练。
  • 评估性能:使用训练好的模型,对特征子集的性能进行评估,性能指标可以是模型的准确性、误差、精度等,具体取决于任务类型。
  • 选择最佳子集:根据性能评估,选择性能最好的特征子集作为最终的特征集合。

3.2 常见的封装法

  • 详尽搜索(Exhaustive Search)

    概述: 详尽搜索是一种直接穷举所有可能的特征子集的方法,然后通过交叉验证或其他性能评价指标来评估每个特征子集的性能,选择表现最好的特征子集。

    优点: 能够找到最优的特征子集,确保不会遗漏任何可能的组合。

    缺点: 随着特征数量的增加,计算成本呈指数增长,不适用于大规模特征空间。

  • 顺序前向搜索(Sequential Forward Search,SFS)

    概述: 顺序前向搜索从空特征集开始,逐步地添加一个特征,每次选择能够最大程度提升性能的特征,直到达到预定的特征数量或性能指标。

    优点: 相对于详尽搜索,计算开销较小,尤其适用于大规模特征空间。

    缺点: 可能会错过全局最优解,因为每次添加特征时只考虑当前最佳选择。

  • 顺序后向搜索(Sequential Backward Search,SBS)

    概述: 顺序后向搜索与顺序前向搜索相反,从全特征集开始,每次移除一个特征,选择能够最小程度降低性能的特征,直到达到预定的特征数量或性能指标。

    优点: 相对于详尽搜索,计算开销较小,且可以在某些情况下更快地找到较好的特征子集。

    缺点: 可能会错过全局最优解,因为每次移除特征时只考虑当前最佳选择。

这些封装法的选择取决于问题的规模、计算资源的可用性以及对最终特征子集性能的要求。

3.3 SFS 与 SBS 实现

       我们生成一组合成数据。数据集包含10个信息特征和90个无关噪声特征,然后,我们使用SFS和SBS选择10个特征,并查看其中有多少个是信息性特征。


import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.model_selection import StratifiedKFold, train_test_split
from sklearn.feature_selection import SequentialFeatureSelector
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA

# 设置随机种子以保证可重复性
np.random.seed(42)

# 生成合成数据集
n_features = 100
n_informative = 10
lda = LDA()
X, y = make_classification(n_samples=1000, n_features=n_features, n_informative=10, n_redundant=0, n_repeated=0, n_classes=2, n_clusters_per_class=1, class_sep=1, shuffle=False)

# 将数据集分为训练集和测试集
X_train_full, X_test_full, y_train, y_test = train_test_split(X, y, stratify=y, train_size=0.2)

# 定义分层K折交叉验证对象
strkfold = StratifiedKFold(n_splits=5, shuffle=True)

# 顺序特征选择(SFS)
sfs = SequentialFeatureSelector(lda, n_features_to_select=10, cv=strkfold, n_jobs=-1)
sfs.fit(X_train_full, y_train)

# 打印SFS选择的特征和真正信息特征的数量
print("SFS选择的特征:", sfs.get_support())
print("SFS选择的真正信息特征数:", sum(sfs.get_support()[:10]))
print("SFS选择的错误信息特征数:", sum(sfs.get_support()[10::]))

# 逆序特征选择(SBS)
sbs = SequentialFeatureSelector(lda, n_features_to_select=10, cv=strkfold, direction='backward', n_jobs=-1)
sbs.fit(X_train_full, y_train)

# 打印SBS选择的特征和真正信息特征的数量
print("SBS选择的特征:", sbs.get_support())
print("SBS选择的真正信息特征数:", sum(sbs.get_support()[:10]))
print("SBS选择的错误信息特征数:", sum(sbs.get_support()[10::]))

# 可视化特征选择结果
selected_features_sfs = np.arange(1, n_features+1)[sfs.get_support()]  # 获取SFS选择的特征的索引
selected_features_sbs = np.arange(1, n_features+1)[sbs.get_support()]  # 获取SBS选择的特征的索引

# 找到SFS和SBS共同选择的特征的索引
common_features = np.intersect1d(selected_features_sfs, selected_features_sbs)

plt.figure(figsize=(12, 6))

# 绘制SFS选择的特征
plt.bar(selected_features_sfs, sfs.get_support()[sfs.get_support()], color='b', label='SFS Selected Features', alpha=0.7)

# 绘制SBS选择的特征
plt.bar(selected_features_sbs, sbs.get_support()[sbs.get_support()], color='g', label='SBS Selected Features', alpha=0.7)

# 绘制共同选择的特征,使用红色表示
plt.bar(common_features, np.logical_and(sfs.get_support()[common_features-1], sbs.get_support()[common_features-1]), color='r', label='Commonly Selected Features', alpha=0.7)

plt.xlabel('Feature Index')
plt.ylabel('Selection Status')
plt.title('Sequential Feature Selection (SFS and SBS) Result')
# 设置x轴刻度显示一部分
x_ticks_selected = np.arange(1, len(np.arange(1, n_features+1)) + 1, 5)  # 每隔5个特征显示一个
plt.xticks(x_ticks_selected, rotation=45)

plt.legend()
plt.show()

        视觉化特征选择结果:以上的代码段通过绘制柱状图,生动地展示了 SFS 和 SBS 选择的特征,以及它们之间的共同选择。不同颜色的柱形图清晰地表示了每种选择的特征,而红色柱形图则标识了这两者共同选择的特征。横坐标是特征的索引,纵坐标表示特征的选择状态。

4.总结

        在机器学习中,特征选择是提升模型性能的关键一步。我们介绍了三种神奇的特征选择思路:过滤法、嵌入法以及封装法。并且每种方法都给出了相应的代码予以距离说明,这些方法帮助模型更好地理解数据,提高了模型的解释性和泛化能力。读者可以通过本文学习如何灵活运用并在实际项目中应用这些技术,以优化模型的性能。

  • 24
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
XGBoost是一种强大的机器学习算法,在各大数据挖掘比赛中表现出色。对于XGBoost的特征工程,可以采用特征选择的方法来筛选出更加有效的特征,并将其代入XGBoost模型中。特征选择是指从原始特征中选择出对目标变量有较大影响的特征,以提高模型的性能和泛化能力。 在使用XGBoost进行特征选择时,可以考虑以下几个步骤: 1. 数据预处理:对于离散特征,需要将其转化为数值型特征。可以使用独热编码或者标签编码等方法将离散特征转化为数值型特征。 2. 特征工程:根据数据集的特点和领域知识,进行特征的构造和变换。可以通过组合特征、提取统计特征、进行数据归一化等方式来改善特征的表达能力。 3. 利用XGBoost进行特征选择:可以使用XGBoost的内置特征选择方法,如基于特征重要性的方法。XGBoost通过计算特征在模型中的分裂次数或者分裂增益来评估特征的重要性,从而筛选出对目标变量有较大影响的特征。 4. 调参:在进行特征选择时,还可以通过调整XGBoost模型的参数来进一步提高特征选择的效果。例如,可以调整树的深度、学习率、正则化参数等。 总结起来,XGBoost的特征工程包括数据预处理、特征构造和变换,以及利用XGBoost进行特征选择。通过这些步骤,可以筛选出对目标变量有较大影响的特征,提高模型的性能和泛化能力。\[1\]\[2\] #### 引用[.reference_title] - *1* *2* *3* [xgboost特征工程](https://blog.csdn.net/jinruoyanxu/article/details/53668726)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值