toad.selection.stepwise
函数概述toad.selection.stepwise
是 toad
库中用于逐步特征选择(Stepwise Feature Selection) 的函数。逐步特征选择是一种结合了向前选择(Forward Selection)和向后剔除(Backward Elimination)的方法,通过迭代地添加或移除特征,以优化模型的性能指标(如 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
通过以下步骤实现逐步特征选择:
estimator
(如逻辑回归)初始化统计模型。p_remove
阈值,则将该特征从模型中移除。max_iter
)或无法进一步优化模型性能。return_drop
参数,返回保留的数据和被剔除的特征名称列表。选择合适的估计器:
lr
)适用于二分类任务,线性回归(ols
)适用于回归任务。评价标准的选择:
p 值阈值的设置:
p_enter
和 p_remove
:这些阈值控制了特征进入和移除模型的严格程度。较低的阈值意味着更严格的特征选择,避免过拟合;较高的阈值可能保留更多特征,但增加了过拟合的风险。p_value_enter
:在双向选择中,用于判断是否需要移除已添加的特征。设置得当可以平衡模型复杂度和性能。迭代次数的控制:
max_iter
:设置合理的最大迭代次数,防止算法在特征选择过程中无限循环。根据数据规模和特征数量调整此参数。排除关键特征:
exclude
:确保业务关键特征不会被自动剔除,特别是在这些特征对模型解释性和业务决策至关重要的情况下。避免多重共线性:
结合业务知识:
模型评估与验证:
toad.selection.stepwise
是一个功能强大且灵活的逐步特征选择工具,结合了统计模型和逐步回归的方法,能够自动筛选出最具预测能力的特征子集。通过合理设置参数和结合业务知识,stepwise
函数能够显著提升模型的性能和解释性,特别适用于信用评分卡建模和金融风控等领域。
p_enter
, p_remove
, p_value_enter
等阈值,平衡模型复杂度和性能。max_iter
控制特征选择过程的迭代步数,防止算法运行过长时间。exclude
参数确保业务关键特征不会被自动剔除。return_drop
参数获取被剔除的特征名称,便于进一步分析和记录。通过上述步骤和注意事项,toad.selection.stepwise
能够帮助你高效地进行特征选择,提升模型的预测能力和稳定性。