您的当前位置:首页正文

toad.selection.stepwise函数

2025-01-09 来源:个人技术集锦

toad.selection.stepwise 函数概述

toad.selection.stepwisetoad 库中用于逐步特征选择(Stepwise Feature Selection) 的函数。逐步特征选择是一种结合了向前选择(Forward Selection)和向后剔除(Backward Elimination)的方法,通过迭代地添加或移除特征,以优化模型的性能指标(如 AIC、BIC 等)。

主要功能

  • 自动化特征选择:根据指定的统计模型和评价标准,自动选择最优的特征子集。
  • 支持多种选择策略:包括向前选择、向后剔除和双向选择。
  • 灵活的参数设置:允许用户自定义模型、阈值、迭代次数等,以适应不同的数据和业务需求。
  • 结合模型评估:在特征选择过程中,基于统计指标(如 AIC、BIC)评估模型性能,确保选择的特征能够提升模型的预测能力。

函数签名

toad.selection.stepwise(
    frame,
    target='target',
    estimator='ols',
    direction='both',
    criterion='aic',
    p_enter=0.01,
    p_remove=0.01,
    p_value_enter=0.2,
    intercept=False,
    max_iter=None,
    return_drop=False,
    exclude=None
)

参数详解

必选参数

  • frame (pd.DataFrame): 输入的数据集,必须是 Pandas 的 DataFrame 格式,包含特征和目标变量。

可选参数

  • target (str, 默认值 'target'): 目标变量的列名。用于计算特征与目标变量之间的关系。

  • estimator (str, 默认值 'ols'): 用于统计建模的估计器类型。常见选项包括:

    • 'ols':普通最小二乘回归,适用于线性回归任务。
    • 'lr':逻辑回归,适用于二分类任务。
    • 'lasso':lasso回归。
    • 'ridge':ridge回归
  • direction (str, 默认值 'both'): 特征选择的方向,支持以下选项:

    • 'forward':仅进行向前选择。
    • 'backward':仅进行向后剔除。
    • 'both':双向选择,结合向前选择和向后剔除。
  • criterion (str, 默认值 'aic'): 用于评价模型性能的统计标准,支持以下选项:

    • 'aic':赤池信息量准则(Akaike Information Criterion)。
    • 'bic':贝叶斯信息量准则(Bayesian Information Criterion)。
    • 还支持 'ks', 'auc'
  • p_enter (float, 默认值 0.01): 在向前选择和双向选择过程中,新增特征进入模型的 p 值阈值。如果特征的 p 值小于该阈值,则将其加入模型。

  • p_remove (float, 默认值 0.01): 在向后剔除和双向选择过程中,移除特征的 p 值阈值。如果特征的 p 值大于该阈值,则将其从模型中移除。

  • p_value_enter (float, 默认值 0.2): 在双向选择过程中,用于在添加特征后判断是否有特征需要被移除的 p 值阈值。

  • intercept (bool, 默认值 False): 指定模型是否包含截距项。如果为 True,模型将包括截距项。

  • max_iter (int, 默认值 None): 最大迭代次数,用于限制特征选择过程的迭代步数,防止算法运行过长时间。如果设置为 None,则不限制迭代次数。

  • return_drop (bool, 默认值 False): 是否返回被剔除的特征名称列表。如果为 True,返回的字典将包含被剔除的特征。

  • exclude (array-like, 默认值 None): 一组特征名称,这些特征将不会被剔除,即使它们满足剔除条件。

返回值

  • return_drop=True : 返回一个元组,包含两个值,第一个是筛选后保留的特征和目标构成的的DataFrame;第二个是被剔除的特征名称列表。
  • return_drop=False : 筛选后保留的特征和目标构成的的DataFrame。

使用示例

以下是一个具体的示例,演示如何使用 toad.selection.stepwise 进行逐步特征选择。

示例背景

假设我们有一个信用评分的数据集 credit_data.csv,包含多个特征和一个目标变量 target(0 表示非坏账,1 表示坏账)。我们希望通过逐步特征选择,筛选出对预测违约最有影响的特征,以优化模型性能。

示例代码

import pandas as pd
import toad as td

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

# 2. 查看数据基本信息
print(data.info())

# 3. 数据预处理
# 处理缺失值(示例:填充缺失值为中位数)
data = data.fillna(data.median())

# 处理类别变量(示例:独热编码)
categorical_features = ['SEX', 'EDUCATION', 'MARRIAGE']
# 使用 pandas 的 get_dummies 进行 one-hot 编码
data = pd.get_dummies(data, columns=categorical_features, dtype=float)
a = td.detect(data)

# 4. 逐步特征选择
final_data, drop_features = td.selection.stepwise(
    frame=data,
    target='default.payment.next.month',
    estimator='lr',        # 使用逻辑回归模型
    direction='both',         # 双向选择
    criterion='aic',          # 使用 AIC 作为评价标准
    p_enter=0.05,             # 新增特征的 p 值阈值
    p_remove=0.05,            # 移除特征的 p 值阈值
    p_value_enter=0.2,        # 双向选择中的 p 值阈值
    intercept=True,           # 包含截距项
    max_iter=1000,             # 最大迭代次数
    return_drop=True,         # 返回被剔除的特征名称
    exclude=['AGE']        # 保留 'AGE' 特征,不被剔除
)

# 5. 查看选择结果
print("保留的特征:", final_data.columns)
print("被剔除的特征:", drop_features)


# 6. 准备训练数据
X = final_data.drop(columns = ["default.payment.next.month"])
y = final_data['default.payment.next.month']


# 7. 拆分训练集和测试集
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=42
)

# 8. 训练逻辑回归模型
from sklearn.linear_model import LogisticRegression
model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)

# 9. 预测概率
y_pred_prob = model.predict_proba(X_test)[:, 1]

# 10. 计算 AUC
from sklearn.metrics import roc_auc_score
auc = roc_auc_score(y_test, y_pred_prob)
print(f'AUC: {auc}')

示例解释

示例输出

保留的特征: Index(['LIMIT_BAL', 'AGE', 'PAY_0', 'PAY_3', 'PAY_6', 'PAY_AMT1', 'default.payment.next.month'], dtype='object')
被剔除的特征: ['BILL_AMT4', 'ID', 'PAY_2', 'PAY_4', 'PAY_5', 'BILL_AMT1', 'BILL_AMT2', 'BILL_AMT3', 'BILL_AMT5', 'BILL_AMT6', 'PAY_AMT2', 'PAY_AMT3', 'PAY_AMT4', 'PAY_AMT5', 'PAY_AMT6', 'SEX_1', 'SEX_2', 'EDUCATION_0', 'EDUCATION_1', 'EDUCATION_2', 'EDUCATION_3', 'EDUCATION_4', 'EDUCATION_5', 'EDUCATION_6', 'MARRIAGE_0', 'MARRIAGE_1', 'MARRIAGE_2', 'MARRIAGE_3']
AUC: 0.7187278959879406

工作原理

toad.selection.stepwise 通过以下步骤实现逐步特征选择:

  1. 初始化模型:根据指定的 estimator(如逻辑回归)初始化统计模型。
  2. 评估当前模型:在当前特征子集上训练模型,并计算指定的评价标准(如 AIC)。
  3. 特征添加与移除
    • 向前选择
      • 尝试将未包含的特征添加到模型中。
      • 计算添加后的模型的评价标准(如 AIC)。
      • 如果添加某个特征能显著降低 AIC(即模型性能提升),则将该特征加入模型。
    • 向后剔除
      • 尝试从当前模型中移除某个特征。
      • 计算移除后的模型的评价标准。
      • 如果移除某个特征能显著降低 AIC,或其 p 值高于 p_remove 阈值,则将该特征从模型中移除。
    • 双向选择:结合向前选择和向后剔除,迭代地优化特征子集。
  4. 迭代优化:重复评估、添加与移除特征的过程,直到达到最大迭代次数(max_iter)或无法进一步优化模型性能。
  5. 返回结果:根据 return_drop 参数,返回保留的数据和被剔除的特征名称列表。

注意事项与建议

  1. 选择合适的估计器

    • 根据任务类型选择适当的统计模型。例如,逻辑回归(lr)适用于二分类任务,线性回归(ols)适用于回归任务。
  2. 评价标准的选择

    • AICBIC 都是用于模型选择的统计指标,但它们的惩罚项不同。AIC 更倾向于选择复杂模型,而 BIC 更倾向于选择简洁模型。根据具体需求选择合适的评价标准。
  3. p 值阈值的设置

    • p_enterp_remove:这些阈值控制了特征进入和移除模型的严格程度。较低的阈值意味着更严格的特征选择,避免过拟合;较高的阈值可能保留更多特征,但增加了过拟合的风险。
    • p_value_enter:在双向选择中,用于判断是否需要移除已添加的特征。设置得当可以平衡模型复杂度和性能。
  4. 迭代次数的控制

    • max_iter:设置合理的最大迭代次数,防止算法在特征选择过程中无限循环。根据数据规模和特征数量调整此参数。
  5. 排除关键特征

    • exclude:确保业务关键特征不会被自动剔除,特别是在这些特征对模型解释性和业务决策至关重要的情况下。
  6. 避免多重共线性

    • 在特征选择过程中,注意特征之间的相关性,避免高相关性的特征同时存在于模型中,导致多重共线性问题。
  7. 结合业务知识

    • 自动化的特征选择方法高效,但结合业务知识手动调整特征选择结果,往往能提升模型的解释性和实际应用效果。
  8. 模型评估与验证

    • 特征选择后,使用交叉验证等方法评估模型的泛化能力,确保选择的特征在不同数据子集上表现一致。

总结

toad.selection.stepwise 是一个功能强大且灵活的逐步特征选择工具,结合了统计模型和逐步回归的方法,能够自动筛选出最具预测能力的特征子集。通过合理设置参数和结合业务知识,stepwise 函数能够显著提升模型的性能和解释性,特别适用于信用评分卡建模和金融风控等领域。

关键点回顾

  • 估计器选择:根据任务类型选择合适的统计模型(如逻辑回归用于分类任务)。
  • 评价标准:使用 AIC 或 BIC 作为模型性能的评价标准,根据业务需求选择合适的标准。
  • 阈值设置:合理设置 p_enter, p_remove, p_value_enter 等阈值,平衡模型复杂度和性能。
  • 迭代控制:通过 max_iter 控制特征选择过程的迭代步数,防止算法运行过长时间。
  • 排除关键特征:使用 exclude 参数确保业务关键特征不会被自动剔除。
  • 结果分析:通过 return_drop 参数获取被剔除的特征名称,便于进一步分析和记录。

通过上述步骤和注意事项,toad.selection.stepwise 能够帮助你高效地进行特征选择,提升模型的预测能力和稳定性。

显示全文