DAY 19 特征筛选算法

  1. 方差筛选
  2. 皮尔逊相关系数筛选
  3. lasso筛选
  4. 树模型重要
  5. shap重要性
  6. 递归特征消除REF

作业:心脏病数据集完成特征筛选对比精度

输入

## 预处理流程回顾
#1. 导入库
import pandas as pd
import pandas as pd    #用于数据处理和分析,可处理表格数据。
import numpy as np     #用于数值计算,提供了高效的数组操作。
import matplotlib.pyplot as plt    #用于绘制各种类型的图表
import seaborn as sns   #基于matplotlib的高级绘图库,能绘制更美观的统计图形。

# 设置中文字体(解决中文显示问题)
plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置字体为黑体
plt.rcParams['axes.unicode_minus'] = False    # 正常显示负号

#2. 读取数据查看数据信息--理解数据
data = pd.read_csv(r'heart.csv')    #读取数据
print("数据基本信息:")
data.info()
print("\n数据前5行预览:")
print(data.head())

#3. 缺失值处理
# 先筛选字符串变量 
discrete_features = data.select_dtypes(include=['object']).columns.tolist()
print("\n离散变量:")
print(discrete_features)
# 依次查看内容
for feature in discrete_features:
    print(f"\n{feature}的唯一值:")
    print(data[feature].value_counts())
#本数据集中不纯在离散变量
# thal 标签编码
thal_mapping = {
    1: 1,
    2: 2,
    3: 3,
}
data['thal'] = data['thal'].map(thal_mapping)
# slope的独热编码,记得需要将bool类型转换为数值
data = pd.get_dummies(data, columns=['slope'])
data2 = pd.read_csv(r"heart.csv") # 重新读取数据,用来做列名对比
list_final = [] # 新建一个空列表,用于存放独热编码后新增的特征名
for i in data.columns:
    if i not in data2.columns:
       list_final.append(i) # 这里打印出来的就是独热编码后的特征名
for i in list_final:
    data[i] = data[i].astype(int) # 这里的i就是独热编码后的特征名
print(list_final) # 打印出来的就是独热编码后的特征名
# 布尔矩阵显示缺失值,这个方法返回一个布尔矩阵
print(data.isnull()) 
print(data.isnull().sum())   # 统计每一列缺失值的数量
#填补缺失值
continuous_features = data.select_dtypes(include=['int64', 'float64']).columns.tolist()  #把筛选出来的列名转换成列表
print("\n连续变量:")
print(continuous_features)

for feature in continuous_features:     
    mode_value = data[feature].mode()[0]            #获取该列的众数。
    data[feature] = data[feature].fillna(mode_value)          #用众数填充该列的缺失值,inplace=True表示直接在原数据上修改。
print(data.isnull().sum())   # 统计每一列缺失值的数量
# 4. 异常值处理
#异常值一般不处理,或者结合对照试验处理和不处理都尝试下,但是论文中要写这个,作为个工作量
data.info()  #查看数据基本信息
#此数据集无缺失值
#划分数据集
from sklearn.model_selection import train_test_split
X = data.drop('target', axis=1)  # 特征
y = data['target']  # 目标变量
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)  # 划分训练集和测试集,test_size表示测试集占比,random_state表示随机种子,保证每次划分结果一致。

from sklearn.ensemble import RandomForestClassifier #随机森林分类器

from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score # 用于评估分类器性能的指标
from sklearn.metrics import classification_report, confusion_matrix #用于生成分类报告和混淆矩阵
import warnings #用于忽略警告信息
warnings.filterwarnings("ignore") # 忽略所有警告信息
# --- 1. 默认参数的随机森林 ---
import time
print("--- 默认参数的随机森林 ---")
rf_model = RandomForestClassifier(random_state=42)  # 创建随机森林分类器实例,random_state=42确保结果可重复。
start_time = time.time()  # 记录开始时间,用于计算训练和预测的耗时。
rf_model.fit(X_train, y_train)  # 在训练集上训练模型。
rf_pred = rf_model.predict(X_test)  # 在测试集上进行预测。
end_time = time.time()  # 记录结束时间。
print(f"训练与预测耗时: {end_time - start_time:.4f} 秒")  # 打印训练和预测的耗时。
print("\n默认参数随机森林在测试集上的分类报告:")  # 打印分类报告,包括准确率、精确率、召回率和F1分数。
print(classification_report(y_test, rf_pred))  # 打印分类报告。
print("默认参数随机森林在测试集上的混淆矩阵:")  # 打印混淆矩阵,显示模型的预测结果。
print(confusion_matrix(y_test, rf_pred))  # 打印混淆矩阵。

# 打印标题,表明这是方差筛选的部分
print("--- 方差筛选 (Variance Threshold) ---")
# 导入需要的工具库
from sklearn.feature_selection import VarianceThreshold  # 方差筛选工具,用于剔除方差小的特征
import time  # 用于记录代码运行时间,方便比较效率
# 记录开始时间,后面会计算整个过程耗时
start_time = time.time()
# 创建方差筛选器,设置方差阈值为0.01
# 阈值是指方差的最小值,低于这个值的特征会被删除(可以根据数据情况调整阈值)
selector = VarianceThreshold(threshold=0.01)
# 对训练数据进行方差筛选,fit_transform会计算每个特征的方差并剔除不满足阈值的特征
# X_train是原始训练数据,X_train_var是筛选后的训练数据
X_train_var = selector.fit_transform(X_train)
# 对测试数据应用同样的筛选规则,transform会直接用训练数据的筛选结果处理测试数据
# X_test是原始测试数据,X_test_var是筛选后的测试数据
X_test_var = selector.transform(X_test)
# 获取被保留下来的特征名称
# selector.get_support()返回一个布尔值列表,表示哪些特征被保留,这个是selector这个实例化的类的一个方法
# X_train.columns是特征的名称,结合布尔值列表可以提取保留特征的名字
selected_features_var = X_train.columns[selector.get_support()].tolist()
# 打印筛选后保留的特征数量和具体特征名称,方便查看结果
print(f"方差筛选后保留的特征数量: {len(selected_features_var)}")
print(f"保留的特征: {selected_features_var}")
# 创建一个随机森林分类模型,用于在筛选后的数据上进行训练和预测
# random_state=42是为了保证每次运行结果一致,方便教学和对比
rf_model_var = RandomForestClassifier(random_state=42)
# 在筛选后的训练数据上训练模型
# X_train_var是筛选后的特征数据,y_train是对应的目标标签
rf_model_var.fit(X_train_var, y_train)
# 使用训练好的模型对筛选后的测试数据进行预测
# X_test_var是筛选后的测试特征数据,rf_pred_var是预测结果
rf_pred_var = rf_model_var.predict(X_test_var)
# 记录结束时间,计算整个训练和预测过程的耗时
end_time = time.time()
print(f"训练与预测耗时: {end_time - start_time:.4f} 秒")
# 打印模型在测试集上的分类报告,展示模型的性能
# 分类报告包括精确率、召回率、F1分数等指标,帮助评估模型好坏
print("\n方差筛选后随机森林在测试集上的分类报告:")
print(classification_report(y_test, rf_pred_var))
# 打印混淆矩阵,展示模型预测的详细结果
# 混淆矩阵显示了真实标签和预测标签的对应情况,比如多少样本被正确分类,多少被错分
print("方差筛选后随机森林在测试集上的混淆矩阵:")
print(confusion_matrix(y_test, rf_pred_var))

print("--- 皮尔逊相关系数筛选 ---")
from sklearn.feature_selection import SelectKBest, f_classif
import time
# 记录开始时间,后面会计算整个过程耗时
start_time = time.time()
# 使用SelectKBest选择k个最佳特征,这里选择10个
selector = SelectKBest(f_classif, k=10)  # 使用f_classif作为评分函数
X_train_pearson = selector.fit_transform(X_train, y_train)  # 对训练数据进行特征选择
X_test_pearson = selector.transform(X_test)  # 对测试数据进行特征选择
# 获取选择的特征索引
selected_features_pearson = selector.get_support(indices=True)  # 获取选择的特征索引
# 打印选择的特征索引和对应的特征名称
print("选择的特征索引:", selected_features_pearson)  # 打印选择的特征索引
print("选择的特征名称:", X_train.columns[selected_features_pearson])  # 打印选择的特征名称
# 创建一个随机森林分类模型,用于在筛选后的数据上进行训练和预测
# random_state=42是为了保证每次运行结果一致,方便教学和对比
rf_model_pearson = RandomForestClassifier(random_state=42)
# 在筛选后的训练数据上训练模型
# X_train_pearson是筛选后的特征数据,y_train是对应的目标标签
rf_model_pearson.fit(X_train_pearson, y_train)
# 使用训练好的模型对筛选后的测试数据进行预测
# X_test_pearson是筛选后的测试特征数据,rf_pred_pearson是预测结果
rf_pred_pearson = rf_model_pearson.predict(X_test_pearson)
# 记录结束时间,计算整个训练和预测过程的耗时
end_time = time.time()
print(f"训练与预测耗时: {end_time - start_time:.4f} 秒")
# 打印模型在测试集上的分类报告,展示模型的性能
# 分类报告包括精确率、召回率、F1分数等指标,帮助评估模型好坏
print("\n皮尔逊相关系数筛选后随机森林在测试集上的分类报告:")
print(classification_report(y_test, rf_pred_pearson))
# 打印混淆矩阵,展示模型预测的详细结果
# 混淆矩阵显示了真实标签和预测标签的对应情况,比如多少样本被正确分类,多少被错分
print("皮尔逊相关系数筛选后随机森林在测试集上的混淆矩阵:")
print(confusion_matrix(y_test, rf_pred_pearson))

print("--- Lasso筛选 (L1正则化) ---")
from sklearn.linear_model import LassoCV  # LassoCV是Lasso回归的交叉验证版本,用于选择最佳的正则化参数
import time
# 记录开始时间,后面会计算整个过程耗时
start_time = time.time()
# 创建LassoCV模型,cv=5表示使用5折交叉验证
lasso_cv = LassoCV(cv=5, random_state=42)  # 创建LassoCV模型,cv=5表示使用5折交叉验证,random_state=42确保结果可重复
lasso_cv.fit(X_train, y_train)  # 在训练数据上训练模型
# 获取选择的特征索引,coef_非零的特征被认为是重要的
selected_features_lasso = np.where(lasso_cv.coef_ != 0)[0]  # 获取选择的特征索引,coef_非零的特征被认为是重要的
# 打印选择的特征索引和对应的特征名称
print("选择的特征索引:", selected_features_lasso)  # 打印选择的特征索引
print("选择的特征名称:", X_train.columns[selected_features_lasso])  # 打印选择的特征名称
# 创建一个随机森林分类模型,用于在筛选后的数据上进行训练和预测
# random_state=42是为了保证每次运行结果一致,方便教学和对比
rf_model_lasso = RandomForestClassifier(random_state=42)
# 在筛选后的训练数据上训练模型
# X_train_lasso是筛选后的特征数据,y_train是对应的目标标签
rf_model_lasso.fit(X_train.iloc[:, selected_features_lasso], y_train)  # 在筛选后的训练数据上训练模型
# 使用训练好的模型对筛选后的测试数据进行预测
# X_test_lasso是筛选后的测试特征数据,rf_pred_lasso是预测结果
rf_pred_lasso = rf_model_lasso.predict(X_test.iloc[:, selected_features_lasso])  # 使用训练好的模型对筛选后的测试数据进行预测
# 记录结束时间,计算整个训练和预测过程的耗时
end_time = time.time()
print(f"训练与预测耗时: {end_time - start_time:.4f} 秒")
# 打印模型在测试集上的分类报告,展示模型的性能
# 分类报告包括精确率、召回率、F1分数等指标,帮助评估模型好坏
print("\nLasso筛选后随机森林在测试集上的分类报告:")
print(classification_report(y_test, rf_pred_lasso))
# 打印混淆矩阵,展示模型预测的详细结果
# 混淆矩阵显示了真实标签和预测标签的对应情况,比如多少样本被正确分类,多少被错分
print("Lasso筛选后随机森林在测试集上的混淆矩阵:")
print(confusion_matrix(y_test, rf_pred_lasso))

print("--- 随机森林自带的重要性筛选 ---")
from sklearn.feature_selection import SelectFromModel
import time
# 记录开始时间,后面会计算整个过程耗时
start_time = time.time()
# 创建随机森林模型
rf_selector = RandomForestClassifier(random_state=42)
# 使用SelectFromModel选择特征,threshold='mean'表示选择特征的重要性平均值以上的特征
selector = SelectFromModel(rf_selector, threshold='mean')  # 使用SelectFromModel选择特征,threshold='mean'表示选择特征的重要性平均值以上的特征
selector.fit(X_train, y_train)  # 在训练数据上训练模型
# 获取选择的特征索引,get_support()返回一个布尔值列表,表示哪些特征被选择
selected_features_rf = selector.get_support(indices=True)  # 获取选择的特征索引,get_support()返回一个布尔值列表,表示哪些特征被选择
# 打印选择的特征索引和对应的特征名称
print("选择的特征索引:", selected_features_rf)  # 打印选择的特征索引
print("选择的特征名称:", X_train.columns[selected_features_rf])  # 打印选择的特征名称
# 创建一个随机森林分类模型,用于在筛选后的数据上进行训练和预测
# random_state=42是为了保证每次运行结果一致,方便教学和对比
rf_model_rf = RandomForestClassifier(random_state=42)
# 在筛选后的训练数据上训练模型
# X_train_rf是筛选后的特征数据,y_train是对应的目标标签
rf_model_rf.fit(X_train.iloc[:, selected_features_rf], y_train)  # 在筛选后的训练数据上训练模型
# 使用训练好的模型对筛选后的测试数据进行预测
# X_test_rf是筛选后的测试特征数据,rf_pred_rf是预测结果
rf_pred_rf = rf_model_rf.predict(X_test.iloc[:, selected_features_rf])  # 使用训练好的模型对筛选后的测试数据进行预测
# 记录结束时间,计算整个训练和预测过程的耗时
end_time = time.time()
print(f"训练与预测耗时: {end_time - start_time:.4f} 秒")
# 打印模型在测试集上的分类报告,展示模型的性能
# 分类报告包括精确率、召回率、F1分数等指标,帮助评估模型好坏
print("\n随机森林自带的重要性筛选后随机森林在测试集上的分类报告:")
print(classification_report(y_test, rf_pred_rf))
# 打印混淆矩阵,展示模型预测的详细结果
# 混淆矩阵显示了真实标签和预测标签的对应情况,比如多少样本被正确分类,多少被错分
print("随机森林自带的重要性筛选后随机森林在测试集上的混淆矩阵:")
print(confusion_matrix(y_test, rf_pred_rf))


print("--- SHAP重要性筛选 ---")
import shap  # SHAP是一种解释机器学习模型预测的方法,用于解释模型的输出
import time
# 记录开始时间,后面会计算整个过程耗时
start_time = time.time()
# 创建一个随机森林分类模型,用于解释
rf_model_shap = RandomForestClassifier(random_state=42)  # 创建一个随机森林分类模型,用于解释
rf_model_shap.fit(X_train, y_train)  # 在训练数据上训练模型
# 使用SHAP解释器解释模型
explainer = shap.TreeExplainer(rf_model_shap)  # 使用SHAP解释器解释模型
shap_values = explainer.shap_values(X_train)  # 计算SHAP值

# 处理 shap_values 为列表的情况(分类问题)
if isinstance(shap_values, list):
    # 对于二分类问题,通常取类别 1 的 SHAP 值
    if len(shap_values) == 2:
        shap_values = shap_values[1]
    else:
        # 多分类问题取平均值
        shap_values = np.mean(shap_values, axis=0)

# 确保 shap_values 是二维数组
if shap_values.ndim == 3:
    shap_values = shap_values.mean(axis=0)

# 计算每个特征的SHAP值绝对值的平均值作为重要性
feature_importance = np.abs(shap_values).mean(axis=0)  # 计算每个特征的SHAP值绝对值的平均值作为重要性
# 获取选择的特征索引,确保为一维数组
selected_features_shap = np.argsort(feature_importance)[::-1][:10]  # 获取选择的特征索引,选择前10个特征
# 打印选择的特征索引和对应的特征名称
print("选择的特征索引:", selected_features_shap)  # 打印选择的特征索引
print("选择的特征名称:", X_train.columns[selected_features_shap])  # 打印选择的特征名称
# 创建一个随机森林分类模型,用于在筛选后的数据上进行训练和预测
# random_state=42是为了保证每次运行结果一致,方便教学和对比
rf_model_shap = RandomForestClassifier(random_state=42)
# 在筛选后的训练数据上训练模型
# X_train_shap是筛选后的特征数据,y_train是对应的目标标签
rf_model_shap.fit(X_train.iloc[:, selected_features_shap], y_train)  # 在筛选后的训练数据上训练模型
# 使用训练好的模型对筛选后的测试数据进行预测
# X_test_shap是筛选后的测试特征数据,rf_pred_shap是预测结果
rf_pred_shap = rf_model_shap.predict(X_test.iloc[:, selected_features_shap])  # 使用训练好的模型对筛选后的测试数据进行预测
# 记录结束时间,计算整个训练和预测过程的耗时
end_time = time.time()
print(f"训练与预测耗时: {end_time - start_time:.4f} 秒")
# 打印模型在测试集上的分类报告,展示模型的性能
# 分类报告包括精确率、召回率、F1分数等指标,帮助评估模型好坏
print("\nSHAP重要性筛选后随机森林在测试集上的分类报告:")
print(classification_report(y_test, rf_pred_shap))
# 打印混淆矩阵,展示模型预测的详细结果
# 混淆矩阵显示了真实标签和预测标签的对应情况,比如多少样本被正确分类,多少被错分
print("SHAP重要性筛选后随机森林在测试集上的混淆矩阵:")
print(confusion_matrix(y_test, rf_pred_shap))

print("--- 递归特征消除 (RFE) ---")
from sklearn.feature_selection import RFE  # RFE是一种递归特征消除方法,用于选择特征
import time
# 记录开始时间,后面会计算整个过程耗时
start_time = time.time()
# 创建一个随机森林分类模型,用于解释
rf_selector = RandomForestClassifier(random_state=42)  # 创建一个随机森林分类模型,用于解释
# 使用RFE选择特征,n_features_to_select=10表示选择10个特征
rfe = RFE(rf_selector, n_features_to_select=10)  # 使用RFE选择特征,n_features_to_select=10表示选择10个特征
rfe.fit(X_train, y_train)  # 在训练数据上训练模型
# 获取选择的特征索引,get_support()返回一个布尔值列表,表示哪些特征被选择
selected_features_rfe = rfe.get_support(indices=True)  # 获取选择的特征索引,get_support()返回一个布尔值列表,表示哪些特征被选择
# 打印选择的特征索引和对应的特征名称
print("选择的特征索引:", selected_features_rfe)  # 打印选择的特征索引
print("选择的特征名称:", X_train.columns[selected_features_rfe])  # 打印选择的特征名称
# 创建一个随机森林分类模型,用于在筛选后的数据上进行训练和预测
# random_state=42是为了保证每次运行结果一致,方便教学和对比
rf_model_rfe = RandomForestClassifier(random_state=42)
# 在筛选后的训练数据上训练模型
# X_train_rfe是筛选后的特征数据,y_train是对应的目标标签
rf_model_rfe.fit(X_train.iloc[:, selected_features_rfe], y_train)  # 在筛选后的训练数据上训练模型
# 使用训练好的模型对筛选后的测试数据进行预测
# X_test_rfe是筛选后的测试特征数据,rf_pred_rfe是预测结果
rf_pred_rfe = rf_model_rfe.predict(X_test.iloc[:, selected_features_rfe])  # 使用训练好的模型对筛选后的测试数据进行预测
# 记录结束时间,计算整个训练和预测过程的耗时
end_time = time.time()
print(f"训练与预测耗时: {end_time - start_time:.4f} 秒")
# 打印模型在测试集上的分类报告,展示模型的性能
# 分类报告包括精确率、召回率、F1分数等指标,帮助评估模型好坏
print("\nRFE筛选后随机森林在测试集上的分类报告:")
print(classification_report(y_test, rf_pred_rfe))
# 打印混淆矩阵,展示模型预测的详细结果
# 混淆矩阵显示了真实标签和预测标签的对应情况,比如多少样本被正确分类,多少被错分
print("RFE筛选后随机森林在测试集上的混淆矩阵:")
print(confusion_matrix(y_test, rf_pred_rfe))

输出节选:

--- 默认参数的随机森林 ---
训练与预测耗时: 0.1399 秒

默认参数随机森林在测试集上的分类报告:
              precision    recall  f1-score   support

           0       0.89      0.83      0.86        29
           1       0.85      0.91      0.88        32

    accuracy                           0.87        61
   macro avg       0.87      0.87      0.87        61
weighted avg       0.87      0.87      0.87        61

默认参数随机森林在测试集上的混淆矩阵:
[[24  5]
 [ 3 29]]
--- 方差筛选 (Variance Threshold) ---
方差筛选后保留的特征数量: 15
保留的特征: ['age', 'sex', 'cp', 'trestbps', 'chol', 'fbs', 'restecg', 'thalach', 'exang', 'oldpeak', 'ca', 'thal', 'slope_0', 'slope_1', 'slope_2']
训练与预测耗时: 0.1251 秒

方差筛选后随机森林在测试集上的分类报告:
              precision    recall  f1-score   support

           0       0.89      0.83      0.86        29
           1       0.85      0.91      0.88        32

    accuracy                           0.87        61
   macro avg       0.87      0.87      0.87        61
weighted avg       0.87      0.87      0.87        61

方差筛选后随机森林在测试集上的混淆矩阵:
[[24  5]
 [ 3 29]]
--- 皮尔逊相关系数筛选 ---
选择的特征索引: [ 0  1  2  7  8  9 10 11 13 14]
选择的特征名称: Index(['age', 'sex', 'cp', 'thalach', 'exang', 'oldpeak', 'ca', 'thal',
       'slope_1', 'slope_2'],
      dtype='object')
训练与预测耗时: 0.1700 秒

皮尔逊相关系数筛选后随机森林在测试集上的分类报告:
              precision    recall  f1-score   support

           0       0.83      0.83      0.83        29
           1       0.84      0.84      0.84        32

    accuracy                           0.84        61
   macro avg       0.84      0.84      0.84        61
weighted avg       0.84      0.84      0.84        61

皮尔逊相关系数筛选后随机森林在测试集上的混淆矩阵:
[[24  5]
 [ 5 27]]
--- Lasso筛选 (L1正则化) ---
选择的特征索引: [ 0  1  2  3  4  6  7  8  9 10 11 13 14]
选择的特征名称: Index(['age', 'sex', 'cp', 'trestbps', 'chol', 'restecg', 'thalach', 'exang',
       'oldpeak', 'ca', 'thal', 'slope_1', 'slope_2'],
      dtype='object')
训练与预测耗时: 0.2422 秒

Lasso筛选后随机森林在测试集上的分类报告:
              precision    recall  f1-score   support

           0       0.89      0.83      0.86        29
           1       0.85      0.91      0.88        32

    accuracy                           0.87        61
   macro avg       0.87      0.87      0.87        61
weighted avg       0.87      0.87      0.87        61

Lasso筛选后随机森林在测试集上的混淆矩阵:
[[24  5]
 [ 3 29]]
--- 随机森林自带的重要性筛选 ---
选择的特征索引: [ 0  2  3  4  7  8  9 10 11]
选择的特征名称: Index(['age', 'cp', 'trestbps', 'chol', 'thalach', 'exang', 'oldpeak', 'ca',
       'thal'],
      dtype='object')
训练与预测耗时: 0.3874 秒

随机森林自带的重要性筛选后随机森林在测试集上的分类报告:
              precision    recall  f1-score   support

           0       0.86      0.83      0.84        29
           1       0.85      0.88      0.86        32

    accuracy                           0.85        61
   macro avg       0.85      0.85      0.85        61
weighted avg       0.85      0.85      0.85        61

随机森林自带的重要性筛选后随机森林在测试集上的混淆矩阵:
[[24  5]
 [ 4 28]]
--- SHAP重要性筛选 ---
选择的特征索引: [1 0]
选择的特征名称: Index(['sex', 'age'], dtype='object')
训练与预测耗时: 0.2908 秒

SHAP重要性筛选后随机森林在测试集上的分类报告:
              precision    recall  f1-score   support

           0       0.61      0.66      0.63        29
           1       0.67      0.62      0.65        32

    accuracy                           0.64        61
   macro avg       0.64      0.64      0.64        61
weighted avg       0.64      0.64      0.64        61

SHAP重要性筛选后随机森林在测试集上的混淆矩阵:
[[19 10]
 [12 20]]
--- 递归特征消除 (RFE) ---
选择的特征索引: [ 0  2  3  4  7  8  9 10 11 14]
选择的特征名称: Index(['age', 'cp', 'trestbps', 'chol', 'thalach', 'exang', 'oldpeak', 'ca',
       'thal', 'slope_2'],
      dtype='object')
训练与预测耗时: 0.5865 秒

RFE筛选后随机森林在测试集上的分类报告:
              precision    recall  f1-score   support

           0       0.83      0.83      0.83        29
           1       0.84      0.84      0.84        32

    accuracy                           0.84        61
   macro avg       0.84      0.84      0.84        61
weighted avg       0.84      0.84      0.84        61

RFE筛选后随机森林在测试集上的混淆矩阵:
[[24  5]
 [ 5 27]]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值