【机器学习】特征筛选:提升模型性能的关键步骤

news2024/11/17 10:53:47

一、引言

  在机器学习领域,特征筛选是一个至关重要的预处理步骤。随着数据集的日益庞大和复杂,特征的数量往往也随之激增。然而,并非所有的特征都对模型的性能提升有所贡献,有些特征甚至可能是冗余的、噪声较大的或者与目标变量无关的。因此,进行特征筛选是机器学习工作流程中不可或缺的一环。

1、特征筛选在机器学习中的重要性

  特征筛选的重要性主要体现在以下几个方面:

  首先,特征筛选有助于减少模型的复杂度。当特征数量过多时,模型需要学习的参数也会相应增加,这可能导致模型过于复杂,容易出现过拟合现象。通过筛选掉那些不重要的特征,可以简化模型结构,降低过拟合的风险。

  其次,特征筛选可以提高模型的性能。通过选择与目标变量相关性较高的特征,模型可以更加专注于学习那些真正对预测结果有影响的因素,从而提高预测准确率。此外,减少特征数量还可以加快模型的训练速度,降低计算成本。

  最后,特征筛选有助于提升模型的解释性。在某些应用场景下,我们不仅需要模型能够做出准确的预测,还需要能够理解模型是如何做出决策的。通过筛选掉那些不重要的特征,我们可以使模型更加简洁明了,便于理解和解释。

2、特征筛选的目标

  特征筛选的主要目标包括减少过拟合、提高模型性能以及加速训练过程。

  减少过拟合是特征筛选的一个重要目标。过拟合是指模型在训练集上表现良好,但在测试集或新数据上表现较差的现象。这通常是因为模型过于复杂,学习了一些训练数据中的噪声或异常值。通过特征筛选,我们可以去除那些与噪声或异常值高度相关的特征,从而降低过拟合的风险。

  提高模型性能是特征筛选的另一个核心目标。通过选择与目标变量相关性较高的特征,我们可以使模型更加专注于学习那些真正对预测结果有影响的因素。这样不仅可以提高预测准确率,还可以使模型更加稳健和可靠。

  加速训练过程也是特征筛选的一个重要目标。当特征数量过多时,模型的训练时间可能会显著增加。通过筛选掉那些不重要的特征,我们可以减少模型的复杂度,从而降低训练时间,提高计算效率。

3、博客内容概览

  在接下来的博客内容中,我们将深入探讨特征筛选的基本概念、方法以及实践步骤。我们将介绍不同类型的特征筛选方法,包括基于统计的方法、基于模型的方法和嵌入式方法等,并详细解释每种方法的原理和适用场景。此外,我们还将分享一些在实际项目中应用特征筛选的经验和案例,帮助读者更好地理解如何在实际问题中应用特征筛选技术。最后,我们将总结特征筛选在机器学习中的关键作用,并展望未来特征筛选技术的发展方向。

  通过本博客的学习,读者将能够掌握特征筛选的基本知识和实践技能,为提升机器学习模型的性能奠定坚实的基础。

二、特征筛选的基本概念

  在机器学习的流程中,特征筛选是一个核心步骤,它帮助我们识别并保留与目标变量最相关的特征,同时剔除那些对模型性能贡献不大或者没有贡献的特征。下面我们将深入探讨特征筛选的定义、它与特征工程的关系以及不同类型的特征筛选方法。

1、特征筛选的定义

  特征筛选,顾名思义,是指从原始特征集中选择出对于模型训练和目标预测最为重要的特征子集的过程。通过特征筛选,我们可以减少数据集的维度,降低模型的复杂度,提高模型的泛化能力,并加速模型的训练过程。特征筛选的核心在于评估每个特征与目标变量之间的相关性或重要性,并基于这些评估结果来选择特征。

2、特征筛选与特征工程的关系

  特征筛选是特征工程的一个重要组成部分。特征工程是一个更广泛的概念,它涵盖了从原始数据中提取和构造有意义的特征,以及对这些特征进行转换和筛选的整个过程。特征筛选则是特征工程中的一个关键步骤,它专注于从已有的特征集中选择出最有价值的特征。

  特征工程和特征筛选是相辅相成的。特征工程通过构造新的特征或转换现有特征来丰富特征集,为模型提供更多的信息。而特征筛选则在这些特征中挑选出最重要的特征,以简化模型并提高性能。因此,在进行机器学习建模时,我们通常需要先进行特征工程,再进行特征筛选,以充分利用数据的潜力并提升模型的性能。

3、特征筛选的几种类型

  特征筛选可以根据其筛选方式的不同分为过滤式、包裹式和嵌入式三种类型。

  过滤式特征筛选:这种方法主要依赖于统计测试或其他评估指标来度量特征与目标变量之间的相关性或重要性。它独立于任何机器学习算法,仅根据特征自身的性质进行筛选。常见的过滤式特征筛选方法包括方差阈值法(移除方差较小的特征)、相关性分析(计算特征与目标变量之间的相关系数)以及互信息法等。过滤式特征筛选的优点是计算效率高,可以快速剔除大量无关特征;缺点是可能忽略特征之间的交互作用,导致一些重要特征被误删。

  包裹式特征筛选:这种方法将特征选择过程与模型训练过程相结合,通过评估不同特征子集对模型性能的影响来选择特征。常见的包裹式特征筛选方法包括递归特征消除(通过递归地考虑越来越小的特征集来选择特征)和基于模型的特征重要性评估(如使用随机森林或梯度提升机等模型来评估特征的重要性)。包裹式特征筛选的优点是能够考虑特征之间的交互作用,选择出对模型性能贡献最大的特征;缺点是计算成本较高,尤其是在特征数量较多时。

  嵌入式特征筛选:这种方法在模型训练过程中自动进行特征选择。一些机器学习算法(如决策树、随机森林和深度学习模型等)具有内置的特征重要性评估机制,可以在训练过程中自动评估每个特征的重要性。嵌入式特征筛选的优点是计算效率高且能够考虑特征之间的交互作用;缺点是需要依赖于特定的机器学习算法,并且不同算法可能给出不同的特征重要性评估结果。

  在选择特征筛选方法时,我们需要根据具体的应用场景、数据集特点和计算资源等因素进行综合考虑。不同的方法各有优缺点,我们需要根据实际需求进行权衡和选择。

三、特征筛选的基本概念及主要方法

  在机器学习中,特征筛选是一个至关重要的步骤,旨在识别并保留与目标变量最相关的特征,同时去除那些对模型性能贡献不大或者没有贡献的特征。接下来,我们将详细介绍几种常用的特征筛选方法,包括基于统计的方法、基于模型的方法和嵌入式方法。

1. 基于统计的方法

  基于统计的特征筛选方法主要通过分析特征与目标变量之间的统计关系来确定哪些特征对模型性能影响较大。

  a) 方差阈值法

  方差阈值法是一种简单而有效的特征筛选方法。它通过计算每个特征的方差,并设置一个阈值来过滤掉方差较小的特征。方差较小的特征通常意味着这些特征在数据集中的取值变化不大,对模型的贡献也较小。

  示例代码实现:

from sklearn.feature_selection import VarianceThreshold

# 假设 X 是特征数据
selector = VarianceThreshold(threshold=0.8 * (1 - 0.8))  # 假设我们想要保留80%的方差
X_new = selector.fit_transform(X)

  b) 相关性分析

  相关性分析是另一种常用的基于统计的特征筛选方法。它通过计算特征与目标变量之间的相关系数(如皮尔逊相关系数)来评估特征的重要性。相关系数较高的特征与目标变量之间的线性关系较强,对模型的贡献也较大。

  示例代码实现:

import pandas as pd
import numpy as np

# 假设 df 是包含特征和目标变量的数据框
correlation_matrix = df.corr()
target_column = 'target'  # 目标变量的列名
important_features = correlation_matrix[target_column].abs().sort_values(ascending=False)

  c) 互信息法

  互信息法是一种基于信息论的特征筛选方法。它通过计算特征与目标变量之间的互信息值来评估特征的重要性。互信息值越大,说明特征与目标变量之间的关联性越强。在Python中,可以使用minepy库来计算互信息值。

2. 基于模型的方法

  基于模型的特征筛选方法通过在模型训练过程中评估特征的重要性来选择特征。

  a) 单变量特征选择

  单变量特征选择使用统计测试来选择最佳特征。它可以看作是对每个特征进行独立评估,而不是考虑特征之间的相互作用。

  示例代码实现:

from sklearn.feature_selection import SelectKBest, chi2

# 假设 X 是特征数据,y 是目标变量
X_new = SelectKBest(chi2, k=10).fit_transform(X, y)

  b) 递归特征消除

  递归特征消除通过递归地考虑越来越小的特征集来选择特征。它使用一个模型来评估特征集,并移除最不重要的特征,直到达到所需的特征数量。

  示例代码实现:

from sklearn.datasets import make_regression
from sklearn.feature_selection import RFE
from sklearn.linear_model import LinearRegression

# 构造回归问题的数据集
X, y = make_regression(n_samples=1000, n_features=20, noise=0.1)

# 初始化线性回归模型作为评估器
estimator = LinearRegression()

# 使用递归特征消除选择特征
selector = RFE(estimator, n_features_to_select=10, step=1)
X_new = selector.fit_transform(X, y)

  c) 基于树模型的特征重要性

  基于树模型(如决策树、随机森林)的特征重要性评估是一种常用的特征筛选方法。这些模型在训练过程中会计算每个特征对模型性能的贡献程度,从而得到特征的重要性评分。

  示例代码实现(使用随机森林):

from sklearn.ensemble import RandomForestRegressor
import pandas as pd

# 初始化随机森林模型
rf = RandomForestRegressor(n_estimators=100, random_state=0)
rf.fit(X, y)

# 获取特征重要性
importances = rf.feature_importances_
feature_importances_df = pd.DataFrame({'feature': X.columns, 'importance': importances})
feature_importances_df = feature_importances_df.sort_values(by='importance', ascending=False)

3. 嵌入式方法

  嵌入式方法将特征选择过程嵌入到模型训练过程中。

  a) 集成学习中的特征重要性

  集成学习算法(如随机森林、梯度提升机等)在训练过程中会自然地评估每个特征的重要性。通过查看这些重要性得分,我们可以确定哪些特征对模型预测的贡献最大。

  在随机森林中,特征重要性通常通过计算每个特征在树节点分裂时的平均不纯度减少量来衡量。不纯度减少量越大,说明该特征对模型预测的贡献越大。

  b) 深度学习中的特征选择

  在深度学习中,特征选择通常通过神经网络的自动学习来实现。神经网络在训练过程中会自动学习哪些特征对目标预测最有帮助,并赋予它们更高的权重。因此,我们可以通过检查神经网络层的权重或激活值来确定哪些特征更重要。

  尽管深度学习模型本身并不直接提供特征重要性的明确评分,但我们可以通过一些间接方法来评估特征的重要性。例如,我们可以观察在删除某个特征后模型性能的变化,或者使用敏感度分析等方法来评估特征对模型输出的影响。

  需要注意的是,嵌入式方法的特征选择过程与模型训练紧密相关,因此所选特征的有效性高度依赖于所使用的模型和训练数据。

  总的来说,特征筛选是机器学习建模过程中不可或缺的一步。通过选择适当的特征筛选方法,我们可以减少模型的复杂度,提高模型的泛化能力,并加速模型的训练过程。在实际应用中,我们应根据具体的数据集和问题特点来选择合适的特征筛选方法,并结合其他模型优化技术来进一步提升模型的性能。

四、特征筛选的实践步骤

1、数据准备与预处理

  特征筛选的第一步是数据准备和预处理。这包括数据加载、缺失值处理、异常值处理、数据标准化或归一化等步骤。预处理的目标是将原始数据转化为适合机器学习模型处理的格式。

import pandas as pd
from sklearn.preprocessing import StandardScaler

# 加载数据
data = pd.read_csv('data.csv')

# 处理缺失值,例如用均值填充
data.fillna(data.mean(), inplace=True)

# 数据标准化
scaler = StandardScaler()
scaled_data = scaler.fit_transform(data)

2、初步特征筛选:快速排除无关特征

  初步特征筛选旨在快速排除与目标变量相关性较低或明显无关的特征。这可以通过方差阈值法、相关性分析等方法实现。

from sklearn.feature_selection import VarianceThreshold

# 使用方差阈值法筛选特征
selector = VarianceThreshold(threshold=(.8 * (1 - .8)))
X_new = selector.fit_transform(scaled_data)

3、特征重要性评估

  接下来,我们需要评估剩余特征的重要性。这可以通过基于模型的特征重要性评估方法实现,如使用随机森林或梯度提升机。

from sklearn.ensemble import RandomForestRegressor

# 使用随机森林评估特征重要性
rf = RandomForestRegressor(n_estimators=100, random_state=0)
rf.fit(X_new, y)
importances = rf.feature_importances_

# 将特征重要性转换为DataFrame,以便查看
feature_importances_df = pd.DataFrame({'feature': X_new.columns, 'importance': importances})
feature_importances_df = feature_importances_df.sort_values(by='importance', ascending=False)

4、确定筛选阈值或策略

  在评估了特征重要性之后,我们需要确定一个筛选阈值或策略,以决定保留哪些特征。这可以基于重要性得分的百分比、累计重要性得分或其他业务逻辑来决定。

# 假设我们保留重要性排名前80%的特征
threshold_percent = 0.8
num_features_to_select = int(len(feature_importances_df) * threshold_percent)
selected_features = feature_importances_df.head(num_features_to_select)['feature'].tolist()

5、验证特征筛选的效果

  最后,我们需要验证特征筛选的效果。这可以通过在筛选后的特征集上重新训练模型,并比较其性能与原始特征集上的性能来实现。

# 使用筛选后的特征集重新训练模型
X_selected = X_new[selected_features]
rf_selected = RandomForestRegressor(n_estimators=100, random_state=0)
rf_selected.fit(X_selected, y)

# 评估模型性能,例如计算R^2分数
from sklearn.metrics import r2_score
y_pred_selected = rf_selected.predict(X_selected)
r2_selected = r2_score(y, y_pred_selected)
print(f"R^2 score with selected features: {r2_selected}")

  通过比较筛选前后模型的性能,我们可以评估特征筛选是否有效地提高了模型的表现。如果筛选后的特征集能够保持或提高模型性能,那么特征筛选就是成功的。

  在实际应用中,特征筛选是一个迭代的过程,可能需要根据具体情况调整筛选阈值或策略,并重新评估模型的性能。此外,还可以使用交叉验证等技术来更稳健地评估特征筛选的效果。

五、案例分析

  在这个案例分析中,我们将选择一个具体的机器学习项目,并展示特征筛选在该项目中的应用过程。我们将以信用卡欺诈检测为例,通过特征筛选来提高分类模型的性能。

1、信用卡欺诈检测项目概述

  信用卡欺诈检测是一个典型的二分类问题,目的是从交易记录中识别出欺诈行为。数据集通常包含大量的交易特征,如交易金额、交易时间、交易地点等。我们的目标是通过特征筛选选择出对欺诈检测最有用的特征,以提高模型的预测精度。

2、特征筛选应用过程

  首先,我们需要加载并预处理数据。假设我们有一个名为creditcard.csv的数据集,本文代码数据集下载链接在此次,请点击我;其中包含信用卡交易记录。

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# 加载数据
data = pd.read_csv('creditcard.csv')

# 分离特征和标签
X = data.drop('Class', axis=1)
y = data['Class']

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 数据标准化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

  数据基本列的情况如下;
在这里插入图片描述

  接下来,我们使用随机森林模型进行初步的特征重要性评估。

from sklearn.ensemble import RandomForestClassifier

# 训练随机森林模型
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X_train_scaled, y_train)

# 获取特征重要性
importances = rf.feature_importances_
feature_importances_df = pd.DataFrame({'feature': X_train.columns, 'importance': importances})
feature_importances_df = feature_importances_df.sort_values(by='importance', ascending=False)

在这里插入图片描述

  为了可视化特征的重要性,我们可以绘制特征重要性的条形图。

import matplotlib.pyplot as plt

# 绘制特征重要性条形图
plt.figure(figsize=(10, 10))
plt.bar(feature_importances_df['feature'], feature_importances_df['importance'])
plt.xlabel('Features')
plt.ylabel('Importance')
plt.title('Feature Importances')
plt.xticks(rotation=90)
plt.tight_layout()
plt.show()

  特征重要度的条形图如下;
在这里插入图片描述

  根据特征重要性条形图,我们可以选择保留前N个最重要的特征或设定一个重要性阈值来筛选特征。

# 假设我们保留重要性排名前15的特征
num_features_to_select = 15
selected_features = feature_importances_df.head(num_features_to_select)['feature'].tolist()
selected_features_index = [data.columns.tolist().index(item) for item in selected_features]

  现在,我们使用筛选后的特征集重新训练模型,并评估其性能。

# 使用筛选后的特征集
X_train_selected = X_train_scaled[:,selected_features_index]
X_test_selected = X_test_scaled[:,selected_features_index]

# 重新训练随机森林模型
rf_selected = RandomForestClassifier(n_estimators=100, random_state=42)
rf_selected.fit(X_train_selected, y_train)

# 评估模型性能
from sklearn.metrics import roc_auc_score
y_pred_prob_selected = rf_selected.predict_proba(X_test_selected)[:, 1]
roc_auc_selected = roc_auc_score(y_test, y_pred_prob_selected)
print(f"ROC-AUC score with selected features: {roc_auc_selected}")

  进行特征筛选后的ROC-AUC score with selected features值为0.9477,效果还是非常不错的;
在这里插入图片描述

3、分析特征筛选对模型性能的影响
3、绘制ROC曲线并比较性能

# 使用全部特征训练随机森林模型并计算ROC-AUC
from sklearn.metrics import roc_curve, auc 

rf_all_features = RandomForestClassifier(n_estimators=100, random_state=42)
rf_all_features.fit(X_train_scaled, y_train)
y_pred_prob_all = rf_all_features.predict_proba(X_test_scaled)[:, 1]
fpr_all, tpr_all, thresholds_all = roc_curve(y_test, y_pred_prob_all)
roc_auc_all = auc(fpr_all, tpr_all)

# 使用筛选后的特征训练随机森林模型并计算ROC-AUC
rf_selected_features = RandomForestClassifier(n_estimators=100, random_state=42)
rf_selected_features.fit(X_train_selected, y_train)
y_pred_prob_selected = rf_selected_features.predict_proba(X_test_selected)[:, 1]
fpr_selected, tpr_selected, thresholds_selected = roc_curve(y_test, y_pred_prob_selected)
roc_auc_selected = auc(fpr_selected, tpr_selected)

# 绘制ROC曲线
plt.figure(figsize=(10, 6))
plt.plot(fpr_all, tpr_all, label='All Features (AUC = %0.2f)' % roc_auc_all)
plt.plot(fpr_selected, tpr_selected, label='Selected Features (AUC = %0.2f)' % roc_auc_selected)
plt.plot([0, 1], [0, 1], 'r--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve Comparison')
plt.legend(loc="lower right")
plt.show()

在这里插入图片描述

  通过比较筛选前后模型的ROC-AUC分数,我们可以分析特征筛选对模型性能的影响。如果筛选后的特征集能够保持或提高ROC-AUC分数,那么特征筛选就是有效的,大大降低了模型的训练时间和推理时间。

  在实际项目中,我们可能还需要进行交叉验证、调整模型参数等步骤来进一步优化模型的性能。此外,还可以使用其他评估指标(如精确度、召回率、F1分数等)来全面评估模型的性能。

  需要注意的是,特征筛选虽然可以提高模型的性能,但也可能导致一些有用的信息丢失。因此,在进行特征筛选时,我们需要综合考虑模型的性能提升和信息损失之间的权衡。

4、结果分析

  通过比较特征筛选前后的ROC曲线和AUC值,我们可以得出以下结论:

  如果筛选后的特征集ROC曲线在筛选前的ROC曲线上方,并且AUC值更高,则说明特征筛选提高了模型的性能。这可能是因为筛选后的特征集更加精简且包含了重要的预测信息。
  如果两条ROC曲线接近或重叠,并且AUC值相差不大,则说明特征筛选对模型性能的影响较小。这可能是因为原始特征集中已经包含了足够的预测信息,或者筛选方法未能有效区分重要特征和冗余特征。
  如果筛选后的特征集ROC曲线在筛选前的ROC曲线下方,并且AUC值更低,则说明特征筛选降低了模型的性能。这可能是因为筛选过程中错误地排除了重要的特征,或者筛选方法不适用于该数据集。
  在本案例中,我们假设筛选后的特征集ROC曲线在筛选前的ROC曲线上方,并且AUC值更高。这表明通过特征筛选,我们成功地提高了信用卡欺诈检测模型的性能。

5、总结

  特征筛选是机器学习项目中提高模型性能的关键步骤之一。通过比较特征筛选前后的ROC曲线和AUC值,我们可以评估特征筛选对模型性能的影响。在实际应用中,我们应该根据具体的数据集和项目需求选择合适的特征筛选方法,并进行充分的实验验证。

六、结论与展望

  特征筛选作为机器学习流程中的关键步骤,对于提升模型性能具有不可忽视的作用。通过有效地筛选特征,我们能够降低模型的复杂度,提高预测准确性,并增强模型的可解释性。

  展望未来,特征筛选技术的发展将更加注重自动化和智能化。随着深度学习和强化学习等技术的不断进步,我们可以期待更加高效和精确的特征选择方法。此外,随着大数据和云计算的普及,实时特征筛选和动态特征选择也将成为未来研究的重点。

  在未来的机器学习应用中,特征筛选将继续发挥重要作用,帮助我们从海量数据中提取出有价值的信息,构建出更加高效和准确的预测模型。

七、参考文献

Pedregosa, F., Varoquaux, G., Gramfort, A., Michel, V., Thirion, B., Grisel, O., … & Duchesnay, E. (2011). Scikit-learn: Machine Learning in Python. Journal of Machine Learning Research, 12, 2825-2830.

Guyon, I., & Elisseeff, A. (2003). An introduction to variable and feature selection. Journal of machine learning research, 3(Mar), 1157-11

附录:本案例完整代码如下

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import roc_curve, auc 

# 加载数据
data = pd.read_csv('creditcard.csv')

# 分离特征和标签
X = data.drop('Class', axis=1)
y = data['Class']

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 数据标准化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

from sklearn.ensemble import RandomForestClassifier

# 训练随机森林模型
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X_train_scaled, y_train)

# 获取特征重要性
importances = rf.feature_importances_
feature_importances_df = pd.DataFrame({'feature': X_train.columns, 'importance': importances})
feature_importances_df = feature_importances_df.sort_values(by='importance', ascending=False)


import matplotlib.pyplot as plt

# 绘制特征重要性条形图
plt.figure(figsize=(10, 10))
plt.bar(feature_importances_df['feature'], feature_importances_df['importance'])
plt.xlabel('Features')
plt.ylabel('Importance')
plt.title('Feature Importances')
plt.xticks(rotation=90)
plt.tight_layout()
plt.show()

# 假设我们保留重要性排名前15的特征
num_features_to_select = 15
selected_features = feature_importances_df.head(num_features_to_select)['feature'].tolist()
selected_features_index = [data.columns.tolist().index(item) for item in selected_features]

# 使用筛选后的特征集
X_train_selected = X_train_scaled[:,selected_features_index]
X_test_selected = X_test_scaled[:,selected_features_index]

# 重新训练随机森林模型
rf_selected = RandomForestClassifier(n_estimators=100, random_state=42)
rf_selected.fit(X_train_selected, y_train)

# 评估模型性能
from sklearn.metrics import roc_auc_score
y_pred_prob_selected = rf_selected.predict_proba(X_test_selected)[:, 1]
roc_auc_selected = roc_auc_score(y_test, y_pred_prob_selected)
print(f"ROC-AUC score with selected features: {roc_auc_selected}")

# 使用全部特征训练随机森林模型并计算ROC-AUC
rf_all_features = RandomForestClassifier(n_estimators=100, random_state=42)
rf_all_features.fit(X_train_scaled, y_train)
y_pred_prob_all = rf_all_features.predict_proba(X_test_scaled)[:, 1]
fpr_all, tpr_all, thresholds_all = roc_curve(y_test, y_pred_prob_all)
roc_auc_all = auc(fpr_all, tpr_all)

# 使用筛选后的特征训练随机森林模型并计算ROC-AUC
rf_selected_features = RandomForestClassifier(n_estimators=100, random_state=42)
rf_selected_features.fit(X_train_selected, y_train)
y_pred_prob_selected = rf_selected_features.predict_proba(X_test_selected)[:, 1]
fpr_selected, tpr_selected, thresholds_selected = roc_curve(y_test, y_pred_prob_selected)
roc_auc_selected = auc(fpr_selected, tpr_selected)

# 绘制ROC曲线
plt.figure(figsize=(10, 6))
plt.plot(fpr_all, tpr_all, label='All Features (AUC = %0.2f)' % roc_auc_all)
plt.plot(fpr_selected, tpr_selected, label='Selected Features (AUC = %0.2f)' % roc_auc_selected)
plt.plot([0, 1], [0, 1], 'r--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve Comparison')
plt.legend(loc="lower right")
plt.show()

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

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

相关文章

STM32定时器编码器模式

定时器编码器模式: Timer -mode Cubemx配置项: 定时器编码模式选择: Encode: mode: TI1: 通道1上升沿使计数器1 TI2: 通道2上升沿使计数器1 TI1 and TI2: 1 和 2 都会1 EX: 获取 编码器正反转数值 数值demo: int Read_Spee…

claude3国内注册

claude3国内注册 Claude 3 作为大型语言模型的强大之处在于其先进的算法设计和大规模训练数据的应用,能够执行复杂和多样化的任务。以下是 Claude 3 主要的强项: 接近人类的理解能力:Claude 3 能够更加深入地理解文本的含义,包括…

7.Prism框架之对话框服务

文章目录 一. 目标二. 技能介绍① 什么是Dialog?② Prism中Dialog的实现方式③ Dialog使用案例一 (修改器)④ Dialog使用案例2(异常显示窗口) 一. 目标 1. 什么是Dialog?2. 传统的Dialog如何实现?3. Prism中Dialog实现方式4. 使用Dialog实现一个异常信息弹出框 二. 技能介…

python编写一个简单的课时记录系统

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 使用Python创建一个简单的课时记录系统 在学习过程中,跟踪课时的进度是非常重要…

LeetCode in Python 69. Sqrt(x) (x的平方根)

求x的平方根,第一想法可能是遍历0~x,求其平方,找到或且但其时间复杂度为O(n),或是想到遍历0~M即可,其中M x // 2,将时间复杂度降至O()。本文利用二分思想,给出一种时间复…

python--pyQt5 进度条:QProgressBar

https://www.cnblogs.com/itwangqiang/articles/14959401.html https://blog.csdn.net/weixin_43990846/article/details/123880081 进度条用于向用户指示操作的进度,并向他们保证应用程序仍在运行 例 1 import sys from PyQt5.QtWidgets import QApplication, QWi…

(十六)C++自制植物大战僵尸游戏的宏定义讲解

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/uzrnw 宏定义 在游戏代码中为了方便,定义了许多宏定义。使用宏定义简化代码并提高可读性。下面将讲解游戏中用到的宏定义。 代码位置 代码所在位置是Class\Scenes\GameScene文件夹中。具体如下图所示。 Define.h …

尝试给笔记本超频

超频(英语:overclocking)是把一个电子配件的时脉速度提升至高于厂方所定的速度运作,从而提升性能的方法,但此举有可能导致该配件稳定性以及配件寿命下降。 笔记本配置为: 处理器 AMD Ryzen 7 7730U wit…

学习部分排序,插入排序,冒泡排序以及希尔排序

1.插入排序 <1>.首先我们举个例子 我们要把6进行前面的插入&#xff0c;那我们要进行比较&#xff0c;首先确定一个end的指针&#xff0c;然后他指向的数字就是我们需要比较的&#xff0c;如果end指向的数比我们end1 的大的话&#xff0c;那我们就往前挪一个&#xff0c…

四六级英语听力考试音频无线发射系统在安顺学院的成功应用分析

四六级英语听力考试音频无线发射系统在安顺学院的成功应用分析 由北京海特伟业科技任洪卓发布于2024年4月22日 安顺学院为了提高学生的外语听力水平&#xff0c;并确保英语四六级听力考试的稳定可靠进行&#xff0c;决定对传统的英语听力音频传输系统进行改造&#xff0c;以提供…

【YOLOv9】实战二:手把手教你使用TensorRT实现YOLOv9实时目标检测(含源码)

‍‍&#x1f3e1;博客主页&#xff1a; virobotics(仪酷智能)&#xff1a;LabVIEW深度学习、人工智能博主 &#x1f384;所属专栏&#xff1a;『LabVIEW深度学习实战』 &#x1f4d1;上期文章&#xff1a;『【YOLOv9】实战一&#xff1a;在 Windows 上使用LabVIEW OpenVINO工具…

gitlab 16.x - ERR unknown command ‘HELLO‘

现象 gitlab部分操作报错500。通过Rails日志发现以下报错&#xff1a; 报错&#xff1a; RedisClient::CommandError ERR unknown command HELLO {"severity": "ERROR","time": "2024-04-22T02:50:16.906Z","correlation_id&quo…

3667B芯茂微SOP7封装5V1A 5W适配器/充电器芯片

3667B是一款高度集成的隔离型适配器和充电器的自供电PSR控制芯片&#xff0c;外部设计极其简单。LP3667 固定原边峰值电流&#xff0c;通过变压器原副边匝比来设置输出恒流点&#xff1b;通过设定一个FB 电阻来设置输出恒压点。为了实现系统成本的简化&#xff0c;LP3667 内置启…

CSS基础常用属性之字体属性(如果想知道CSS的字体属性知识点,那么只看这一篇就足够了!)

前言&#xff1a;在我们学习CSS的时候&#xff0c;主要学习选择器和常用的属性&#xff0c;而这篇文章讲解的就是最基础的属性之一——文字属性。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 废话不多说&#xff0c;让我们直…

删除二叉树的子树:假设二叉树中的结点均不相等,采用二叉链存储,设计递归算法删除根结点值为x的子树。(C语言)

目录 实验内容&#xff1a; 实验过程&#xff1a; 1.算法设计 2.程序清单 3.复杂度分析 4.运行结果 实验内容&#xff1a; 删除二叉树的子树:假设二叉树中的结点均不相等&#xff0c;采用二叉链存储&#xff0c;设计递归算法删除根结点值为x的子树。 实验过程&#xff1…

web前端(简洁版)

0. 开发环境 && 安装插件 这里我使用的是vscode开发环境 Auto Rename Tag是语法自动补齐view-in-browser是快速在浏览器中打开live server实时网页刷新 1. HTML 文件基本结构 <html><head><title>第一个页面</title></head><body&g…

PCIe系统阻抗控制85还是100的验证

高速先生成员--周伟 还记得上次的文章&#xff0c;PCIe阻抗控制&#xff0c;85ohm和100ohm哪个好&#xff0c;文章里面只讲到目前的主要问题&#xff0c;但没有给出具体怎么解决这个问题&#xff0c;今天我们就通过无源仿真的方式来聊聊上次那个问题的最终解决方案。 目前我们看…

lvgl图形化设计工具GUI Guider结合使用

前言 上篇博客整合了lvgl到项目中&#xff0c;采用的是自己编写源码的方式&#xff0c;实现了个简单的界面。实际过程中一般情况开发界面都借助设计工具&#xff0c;这里使用的是gui guider来进行示例记录 项目结构&#xff08;生成代码路径依然放到项目路径下&#xff09; C…

Hack The Box-Runner

总体思路 子域名扫描->CVE-2023-42793利用->获取敏感信息->user->端口转发->CVE-2024-21626利用->root 信息收集&端口利用 nmap -sSVC 10.10.11.13目标开放22、80、8000端口&#xff0c;这里先将runner.htb加入到hosts文件后&#xff0c;访问之 查看源…

腾讯后端一面:当 TCP 建立连接之后,TCP 和 UDP 的实时性是不是就差不多了?

更多大厂面试内容可见 -> http://11come.cn 腾讯后端一面&#xff1a;当 TCP 建立连接之后&#xff0c;TCP 和 UDP 的实时性是不是就差不多了&#xff1f; 项目相关 面试官可能是 Go 方向的&#xff0c;我面试的是 Java 方向的&#xff0c;所以面试官也没有问我简历上的项…