特征筛选 hscredit.core.selectors
23 种特征筛选器,覆盖缺失率、众数率、方差、相关性、VIF、IV、Lift、PSI、模型重要性、
逐步回归、Boruta、组合筛选等维度。SelectionReportCollector 可手动聚合多个已拟合
筛选器的报告,生成统一中文摘要。
特征筛选模块.
提供多种特征筛选方法,从多个维度评估和筛选特征。
筛选方法分类
过滤法: 方差、相关性、VIF、缺失率、单一值率、基数、IV、Lift、PSI
包装法: 穷举搜索、逐步回归、Boruta
嵌入法: 特征重要性、Lasso、树模型重要性、Permutation Importance
通用特性
独立使用: fit/transform 接口
sklearn Pipeline 集成
统一的中文筛选报告
参考样例
>>> from hscredit.core.selectors import VarianceSelector, IVSelector, CorrSelector
>>> from hscredit.core.selectors.base import SelectionReportCollector
>>> import pandas as pd
>>> import numpy as np
>>> np.random.seed(42)
>>> X = pd.DataFrame(np.random.randn(1000, 10), columns=[f'f{i}' for i in range(10)])
>>> y = pd.Series(np.random.randint(0, 2, 1000))
>>> selector = VarianceSelector(threshold=0.01)
>>> selector.fit(X, y)
VarianceSelector(...)
>>> report = selector.get_selection_report()
>>> print(f"输入特征数: {report['输入特征数']}, 选中特征数: {report['选中特征数']}")
- class hscredit.core.selectors.BaseFeatureSelector(target='target', include=None, exclude=None, binner=None, binning_params=None, threshold=0.0, n_jobs=-1, force_drop=None, parallel_backend=None, parallel_config=None)[源代码]
基类:
ParallelizableMixin,TransformerMixin,BaseEstimator,ABC特征筛选器基类.
所有特征筛选器都继承此类,实现统一的 fit/transform 接口。 支持中文筛选报告生成。支持可选的分箱器,在筛选前对数据进行分箱处理。
参数
- 参数:
target (str) -- 目标变量列名,默认为 'target'。在 scorecardpipeline 风格中用于 从 DataFrame 中提取目标列;在 sklearn 风格中若 fit 传入了 y 参数则优先使用 y
include (List[str] | None) -- 强制保留的特征列表,这些特征无论如何都会被保留
exclude (List[str] | None) -- 强制剔除的特征列表,这些特征无论如何都会被剔除
binner (Any | None) -- 可选的已配置分箱器实例,支持已训练或待训练状态,不接受分箱器类
binning_params (Dict[str, Any] | None) -- 可选的
OptimalBinning构造参数字典。未传入binner时, 基类使用该字典创建分箱器;同时传入时binner优先threshold (float | int | str) -- 筛选阈值,不同筛选器含义不同
n_jobs (int | float | None) -- 并行工作数,默认为 -1;None 沿用旧串行行为
force_drop (List[str] | None) -- 强制剔除的特征列表,效果与 exclude 合并
parallel_backend (str | None) -- joblib 并行后端,默认为 None
parallel_config (Mapping[str, Any] | None) -- joblib 扩展配置,默认为 None
属性
selected_features_: 选中保留的特征列表removed_features_: 被剔除的特征列表dropped_: 被剔除的特征及原因 DataFrame,包含 '特征' 和 '剔除原因' 两列scores_: 各特征的筛选得分的 Seriesn_features_in_: fit 时输入的特征数量forced_dropped_: 被强制剔除的特征列表include_: 处理后的强制保留特征列表(字符串会被转为单元素列表)exclude_: 处理后的强制剔除特征列表(包含 force_drop 的合并结果)
参考样例
sklearn 风格(推荐用于纯特征矩阵)
>>> from hscredit.core.selectors import VarianceSelector >>> import pandas as pd >>> import numpy as np >>> np.random.seed(42) >>> X = pd.DataFrame(np.random.randn(100, 5), columns=[f'feat_{i}' for i in range(5)]) >>> y = pd.Series(np.random.randint(0, 2, 100)) >>> selector = VarianceSelector(threshold=0.1, include=['feat_0'], exclude=['feat_4']) >>> selector.fit(X, y) VarianceSelector(...) >>> print(selector.selected_features_) ['feat_0', ...]
scorecardpipeline 风格(推荐用于完整数据框)
>>> from hscredit.core.selectors import IVSelector >>> import pandas as pd >>> import numpy as np >>> np.random.seed(42) >>> df = pd.DataFrame({ ... 'feat1': np.random.randn(1000), ... 'feat2': [1] * 1000, # 低方差,会被剔除 ... 'target': np.random.randint(0, 2, 1000) ... }) >>> selector = IVSelector(threshold=0.02, target='target') >>> selector.fit(df) IVSelector(...) >>> report = selector.get_selection_report() >>> print(f"输入: {report['输入特征数']}, 输出: {report['选中特征数']}") 输入: 2, 输出: 1
- fit(X, y=None)[源代码]
事务式拟合筛选器,失败时恢复进入本次拟合前的完整状态。
- 参数:
X (DataFrame | ndarray)
y (ndarray | Series | None)
- 返回类型:
- fit_transform(X, y=None)[源代码]
拟合并转换数据。
等价于依次调用 fit(X, y) 和 transform(X)。
参数
- 参数:
X (DataFrame | ndarray) -- 输入特征矩阵(DataFrame 或 numpy 数组),或包含目标列的完整数据框
y (ndarray | Series | None) -- 目标变量,可选
- 返回:
筛选后的特征数据
- 返回类型:
DataFrame | ndarray
- get_dropped_df()[源代码]
获取被剔除特征的 DataFrame。
返回 DataFrame 列说明
特征 (str): 被剔除的特征名称
剔除原因 (str): 特征被剔除的原因描述
- 返回:
包含被剔除特征及原因的 DataFrame,无数据时返回仅含列名的空 DataFrame
- 返回类型:
DataFrame
参考样例
>>> from hscredit.core.selectors import VarianceSelector >>> import pandas as pd >>> import numpy as np >>> np.random.seed(42) >>> X = pd.DataFrame(np.random.randn(100, 5), columns=[f'f{i}' for i in range(5)]) >>> y = pd.Series(np.random.randint(0, 2, 100)) >>> selector = VarianceSelector(threshold=0.1) >>> selector.fit(X, y) VarianceSelector(...) >>> dropped_df = selector.get_dropped_df() >>> print(f"共剔除 {len(dropped_df)} 个特征")
- get_scores_df()[源代码]
获取特征得分的 DataFrame。
返回 DataFrame 列说明
特征 (str): 特征名称
得分 (float): 特征在筛选器中的得分
状态 (str): 特征状态,取值为 '选中' 或 '剔除'
DataFrame 按得分降序排列。
- 返回:
包含特征得分的 DataFrame,无得分时返回仅含列名的空 DataFrame
- 返回类型:
DataFrame
参考样例
>>> from hscredit.core.selectors import VarianceSelector >>> import pandas as pd >>> import numpy as np >>> np.random.seed(42) >>> X = pd.DataFrame(np.random.randn(100, 5), columns=[f'f{i}' for i in range(5)]) >>> y = pd.Series(np.random.randint(0, 2, 100)) >>> selector = VarianceSelector(threshold=0.1) >>> selector.fit(X, y) VarianceSelector(...) >>> scores_df = selector.get_scores_df() >>> print(scores_df.head())
- get_selection_report()[源代码]
获取中文筛选报告。
报告包含筛选器的基础信息、统计信息、选中/剔除特征列表及特征得分。
返回字典键值说明
筛选器 (str): 筛选器类名
筛选方法 (str): 筛选方法名称
时间戳 (str): 报告生成时间,格式为 YYYY-MM-DD HH:MM:SS
阈值 (Any): 筛选阈值
参数 (Dict): 筛选器初始化参数(过滤后的有效参数)
强制操作 (Dict | None): 强制保留/剔除的特征信息
输入特征数 (int): fit 时的输入特征数量
选中特征数 (int): 选中的特征数量
剔除特征数 (int): 被剔除的特征数量
特征保留率 (str): 保留比例,格式为 "XX.XX%"
选中特征 (List[str]): 选中特征名称列表
剔除特征 (List[str],可选): 被剔除特征名称列表
剔除原因 (List[str],可选): 各剔除特征对应的原因
剔除详情 (List[Dict],可选): 剔除特征的详细信息
特征得分 (Dict): 各特征得分的字典
得分统计 (Dict,可选): 得分的统计摘要(最大值、最小值、平均值、中位数)
- 返回:
包含筛选结果的字典,未拟合时返回包含 "状态" 和 "message" 的字典
- 返回类型:
Dict[str, Any]
参考样例
>>> from hscredit.core.selectors import VarianceSelector >>> import pandas as pd >>> import numpy as np >>> np.random.seed(42) >>> X = pd.DataFrame(np.random.randn(100, 5), columns=[f'f{i}' for i in range(5)]) >>> y = pd.Series(np.random.randint(0, 2, 100)) >>> selector = VarianceSelector(threshold=0.1) >>> selector.fit(X, y) VarianceSelector(...) >>> report = selector.get_selection_report() >>> print(f"输入: {report['输入特征数']}, 选中: {report['选中特征数']}") 输入: 5, 选中: ...
- get_selection_report_df()[源代码]
获取简化的 DataFrame 格式报告。
适用于快速查看和导出到 Excel 等场景。
返回 DataFrame 列说明
筛选器 (str): 筛选器类名
筛选方法 (str): 筛选方法名称
阈值 (Any): 筛选阈值
输入特征数 (int): 输入特征数量
选中特征数 (int): 选中特征数量
剔除特征数 (int): 剔除特征数量
保留率 (str): 特征保留比例
- 返回:
包含筛选报告关键指标的 DataFrame(单行)
- 返回类型:
DataFrame
参考样例
>>> from hscredit.core.selectors import VarianceSelector >>> import pandas as pd >>> import numpy as np >>> np.random.seed(42) >>> X = pd.DataFrame(np.random.randn(100, 5), columns=[f'f{i}' for i in range(5)]) >>> y = pd.Series(np.random.randint(0, 2, 100)) >>> selector = VarianceSelector(threshold=0.1) >>> selector.fit(X, y) VarianceSelector(...) >>> report_df = selector.get_selection_report_df() >>> print(report_df)
- get_support_mask()[源代码]
获取特征选择掩码。
返回一个布尔数组,长度为输入特征数,True 表示该特征被选中。
- 返回:
布尔 numpy 数组,True 对应选中特征的下标
- 抛出:
NotFittedError -- 当筛选器尚未拟合时
- 返回类型:
ndarray
参考样例
>>> from hscredit.core.selectors import VarianceSelector >>> import pandas as pd >>> import numpy as np >>> np.random.seed(42) >>> X = pd.DataFrame(np.random.randn(100, 5), columns=[f'f{i}' for i in range(5)]) >>> y = pd.Series(np.random.randint(0, 2, 100)) >>> selector = VarianceSelector(threshold=0.1) >>> selector.fit(X, y) VarianceSelector(...) >>> mask = selector.get_support_mask() >>> mask.sum() == len(selector.selected_features_) True
- transform(X)[源代码]
根据筛选结果转换数据。
根据 fit 阶段选中的特征,对输入数据进行筛选。
参数
- 参数:
X (DataFrame | ndarray | List[str]) -- 输入数据,支持 DataFrame、numpy 数组或特征名列表
- 返回:
筛选后的数据,类型与输入一致 - DataFrame/ndarray 输入:返回仅包含选中特征的 DataFrame(若包含 target 列则透传) - 列表输入:返回筛选后的特征名列表
- 抛出:
NotFittedError -- 当筛选器尚未拟合时
- 返回类型:
DataFrame | ndarray | List[str]
参考样例
>>> from hscredit.core.selectors import VarianceSelector >>> import pandas as pd >>> import numpy as np >>> np.random.seed(42) >>> X = pd.DataFrame(np.random.randn(100, 5), columns=[f'f{i}' for i in range(5)]) >>> y = pd.Series(np.random.randint(0, 2, 100)) >>> selector = VarianceSelector(threshold=0.1) >>> selector.fit(X, y) VarianceSelector(...) >>> X_selected = selector.transform(X) >>> X_selected.shape[1] < X.shape[1] True
- class hscredit.core.selectors.SelectionReportCollector(name='特征筛选流程')[源代码]
基类:
object特征筛选报告收集器.
聚合多个已拟合筛选器的结果并生成汇总报告。 当前通过
add_report手动添加,不会自动挂接 sklearn Pipeline。使用方式
>>> from hscredit.core.selection import ( ... SelectionReportCollector, ... VarianceSelector, ... CorrSelector ... ) >>> collector = SelectionReportCollector() >>> >>> # 方式1: 手动添加筛选器 >>> selector1 = VarianceSelector(threshold=0.1) >>> selector1.fit(X) >>> collector.add_report(selector1) >>> >>> selector2 = CorrSelector(threshold=0.8) >>> selector2.fit(X, y) >>> collector.add_report(selector2) >>> >>> # 获取汇总报告 >>> summary = collector.get_summary() >>> print(summary) >>> >>> # 导出为DataFrame >>> df = collector.to_dataframe()
- 参数:
name (str)
- add_report(selector, stage_name=None)[源代码]
添加筛选器报告。
将已拟合的筛选器结果添加到收集器中,并生成阶段名称。阶段名称默认为"阶段{序号}"。
参数
- 参数:
selector (BaseFeatureSelector) -- 已拟合的筛选器对象,必须实现 get_selection_report() 方法
stage_name (str | None) -- 阶段名称,如 '粗筛'、'精筛' 等,默认根据已有报告数量自动生成
- 返回:
self(支持链式调用)
- 抛出:
ValidationError -- 当 selector 未实现 get_selection_report() 方法时
- 返回类型:
参考样例
>>> from hscredit.core.selectors.base import SelectionReportCollector >>> from hscredit.core.selectors import VarianceSelector >>> import pandas as pd >>> import numpy as np >>> np.random.seed(42) >>> X = pd.DataFrame(np.random.randn(100, 5), columns=[f'f{i}' for i in range(5)]) >>> y = pd.Series(np.random.randint(0, 2, 100)) >>> collector = SelectionReportCollector() >>> selector = VarianceSelector(threshold=0.1) >>> selector.fit(X, y) >>> collector.add_report(selector, stage_name="粗筛") SelectionReportCollector(name='特征筛选流程', stages=1)
- get_dropped_summary()[源代码]
获取被剔除特征的汇总表。
汇总所有筛选阶段中被剔除的特征及其剔除原因。
返回 DataFrame 列说明
特征 (str): 被剔除的特征名称
阶段 (str): 该特征被剔除的阶段名称
筛选器 (str): 该阶段使用的筛选器类名
剔除原因 (str): 特征被剔除的原因描述
得分 (Any): 特征在筛选器中的得分,无得分时为 'N/A'
- 返回:
剔除特征汇总 DataFrame,无记录时返回空 DataFrame
- 返回类型:
DataFrame
参考样例
>>> from hscredit.core.selectors.base import SelectionReportCollector >>> from hscredit.core.selectors import VarianceSelector >>> import pandas as pd >>> import numpy as np >>> np.random.seed(42) >>> X = pd.DataFrame(np.random.randn(100, 5), columns=[f'f{i}' for i in range(5)]) >>> y = pd.Series(np.random.randint(0, 2, 100)) >>> collector = SelectionReportCollector() >>> selector = VarianceSelector(threshold=0.1) >>> selector.fit(X, y) >>> collector.add_report(selector) >>> dropped = collector.get_dropped_summary() >>> print(f"共剔除 {len(dropped)} 个特征")
- get_feature_trace()[源代码]
获取特征追踪表。
记录每个特征在每个筛选阶段的状态变化,包括选中、剔除或未处理。
返回 DataFrame 列说明
特征 (str): 特征名称
阶段 (str): 筛选阶段的名称
筛选器 (str): 该阶段使用的筛选器类名
状态 (str): 特征在当前阶段的状态,取值为 '选中'、'剔除' 或 '未处理'
得分/原因 (Any): 选中特征的得分,或剔除特征的原因
- 返回:
特征追踪 DataFrame,无记录时返回空 DataFrame
- 返回类型:
DataFrame
参考样例
>>> from hscredit.core.selectors.base import SelectionReportCollector >>> from hscredit.core.selectors import VarianceSelector >>> import pandas as pd >>> import numpy as np >>> np.random.seed(42) >>> X = pd.DataFrame(np.random.randn(100, 5), columns=[f'f{i}' for i in range(5)]) >>> y = pd.Series(np.random.randint(0, 2, 100)) >>> collector = SelectionReportCollector() >>> selector = VarianceSelector(threshold=0.1) >>> selector.fit(X, y) >>> collector.add_report(selector) >>> trace = collector.get_feature_trace() >>> print(trace.head())
- get_summary()[源代码]
获取汇总报告。
汇总报告包含筛选流程的整体统计信息和各阶段的筛选详情。
返回字典键值说明
流程名称 (str): 筛选流程名称
创建时间 (str): 报告创建时间,格式为 YYYY-MM-DD HH:MM:SS
筛选轮次 (int): 执行的筛选阶段总数
原始特征数 (int): 第一阶段输入的特征数量
最终特征数 (int): 最后一个阶段输出的特征数量
累计剔除特征数 (int): 所有阶段累计剔除的特征总数
特征保留率 (str): 特征保留比例,格式为 "XX.XX%",无记录时为 "N/A"
筛选器列表 (List[Dict]): 各阶段的筛选器详情列表,每项包含阶段、筛选器、输入、输出、剔除、阈值
- 返回:
包含汇总统计和阶段详情的字典,无记录时返回包含 "状态" 和 "message" 的字典
- 返回类型:
Dict[str, Any]
参考样例
>>> from hscredit.core.selectors.base import SelectionReportCollector >>> from hscredit.core.selectors import VarianceSelector >>> import pandas as pd >>> import numpy as np >>> np.random.seed(42) >>> X = pd.DataFrame(np.random.randn(100, 5), columns=[f'f{i}' for i in range(5)]) >>> y = pd.Series(np.random.randint(0, 2, 100)) >>> collector = SelectionReportCollector() >>> selector = VarianceSelector(threshold=0.1) >>> selector.fit(X, y) >>> collector.add_report(selector) >>> summary = collector.get_summary() >>> print(f"原始特征数: {summary['原始特征数']}, 最终特征数: {summary['最终特征数']}") 原始特征数: 5, 最终特征数: ...
- print_summary()[源代码]
打印汇总报告到控制台。
以格式化的方式打印筛选流程的整体统计信息和各阶段详情。
打印内容
筛选流程名称和创建时间
筛选轮次、原始/最终特征数、累计剔除数、特征保留率
各阶段筛选器详情(阶段名、筛选器名称、输入/输出/剔除特征数)
参考样例
>>> from hscredit.core.selectors.base import SelectionReportCollector >>> from hscredit.core.selectors import VarianceSelector >>> import pandas as pd >>> import numpy as np >>> np.random.seed(42) >>> X = pd.DataFrame(np.random.randn(100, 5), columns=[f'f{i}' for i in range(5)]) >>> y = pd.Series(np.random.randint(0, 2, 100)) >>> collector = SelectionReportCollector() >>> selector = VarianceSelector(threshold=0.1) >>> selector.fit(X, y) >>> collector.add_report(selector) >>> collector.print_summary()
- 返回类型:
None
- to_dataframe()[源代码]
转换为 DataFrame 格式。
将收集到的各筛选阶段报告汇总为一个 DataFrame,每行对应一个筛选阶段。
返回 DataFrame 列说明
阶段 (str): 筛选阶段的名称
筛选器 (str): 该阶段使用的筛选器类名
阈值 (Any): 该阶段使用的筛选阈值
输入特征数 (int): 该阶段输入的特征数量
选中特征数 (int): 该阶段输出的特征数量
剔除特征数 (int): 该阶段剔除的特征数量
- 返回:
筛选结果汇总 DataFrame,无记录时返回空 DataFrame
- 返回类型:
DataFrame
参考样例
>>> from hscredit.core.selectors.base import SelectionReportCollector >>> from hscredit.core.selectors import VarianceSelector >>> import pandas as pd >>> import numpy as np >>> np.random.seed(42) >>> X = pd.DataFrame(np.random.randn(100, 5), columns=[f'f{i}' for i in range(5)]) >>> y = pd.Series(np.random.randint(0, 2, 100)) >>> collector = SelectionReportCollector() >>> selector = VarianceSelector(threshold=0.1) >>> selector.fit(X, y) >>> collector.add_report(selector) >>> df = collector.to_dataframe() >>> print(df)
- to_excel(filepath)[源代码]
导出为 Excel 文件。
将筛选报告导出为多 Sheet 的 Excel 文件,同时生成一份 JSON 格式的详细报告。
Excel 文件内容
筛选汇总 Sheet: 各筛选阶段的统计汇总
特征追踪 Sheet: 每个特征在各阶段的状态变化(仅在有记录时生成)
剔除特征 Sheet: 被剔除特征的详细信息(仅在有记录时生成)
JSON 报告: 与 Excel 同目录的 {文件名}_report.json,包含完整汇总信息
- 参数:
filepath (str) -- 保存路径,必须以 .xlsx 结尾
- 返回类型:
None
参考样例
>>> from hscredit.core.selectors.base import SelectionReportCollector >>> from hscredit.core.selectors import VarianceSelector >>> import pandas as pd >>> import numpy as np >>> np.random.seed(42) >>> X = pd.DataFrame(np.random.randn(100, 5), columns=[f'f{i}' for i in range(5)]) >>> y = pd.Series(np.random.randint(0, 2, 100)) >>> collector = SelectionReportCollector() >>> selector = VarianceSelector(threshold=0.1) >>> selector.fit(X, y) >>> collector.add_report(selector) >>> collector.to_excel("筛选报告.xlsx")
- class hscredit.core.selectors.TypeSelector(dtype_include=None, dtype_exclude=None, target='target', include=None, exclude=None, force_drop=None, n_jobs=-1, binner=None, binning_params=None, parallel_backend=None, parallel_config=None)[源代码]
-
类型筛选器.
按数据类型筛选特征。 可以按包含类型或排除类型进行筛选。
参数
- 参数:
dtype_include (str | Type | List[str] | None) -- 包含的数据类型,默认为None - numpy.number: 所有数值类型 - 'object': 所有对象类型 - 'category': 类别类型
dtype_exclude (str | Type | List[str] | None) -- 排除的数据类型,默认为None
target (str)
include (List[str] | None)
exclude (List[str] | None)
force_drop (List[str] | None)
n_jobs (int | float | None)
binner (Any | None)
binning_params (Dict[str, Any] | None)
parallel_backend (str | None)
parallel_config (Mapping[str, Any] | None)
参考样例
>>> from hscredit.core.selectors import TypeSelector >>> import pandas as pd >>> X = pd.DataFrame({ ... 'a': [1, 2, 3], ... 'b': ['x', 'y', 'z'], ... 'c': [1.0, 2.0, 3.0] ... }) >>> # 仅保留数值类型 >>> selector = TypeSelector(dtype_include='number') >>> selector.fit(X)
- method_name = '类型筛选'
- class hscredit.core.selectors.RegexSelector(pattern, invert=False, flags=0, target='target', include=None, exclude=None, force_drop=None, n_jobs=-1, binner=None, binning_params=None, parallel_backend=None, parallel_config=None)[源代码]
-
正则表达式筛选器.
按特征名称的正则表达式匹配筛选特征。
参数
- 参数:
pattern (str) -- 正则表达式模式
invert (bool) -- 是否反转匹配(True 表示排除匹配的特征,保留不匹配的),默认为 False
flags (int) -- 正则表达式标志,默认为 0
target (str)
include (List[str] | None)
exclude (List[str] | None)
force_drop (List[str] | None)
n_jobs (int | float | None)
binner (Any | None)
binning_params (Dict[str, Any] | None)
parallel_backend (str | None)
parallel_config (Mapping[str, Any] | None)
参考样例
>>> from hscredit.core.selectors import RegexSelector >>> import pandas as pd >>> X = pd.DataFrame({ ... 'income_1': [1, 2, 3], ... 'income_2': [4, 5, 6], ... 'age': [1, 2, 3] ... }) >>> # 选择以income开头的特征 >>> selector = RegexSelector(pattern='^income') >>> selector.fit(X)
- method_name = '正则筛选'
- class hscredit.core.selectors.NullSelector(threshold=0.95, target='target', include=None, exclude=None, force_drop=None, n_jobs=-1, binner=None, binning_params=None, parallel_backend=None, parallel_config=None)[源代码]
-
缺失率筛选器.
移除缺失率高于阈值的特征。 用于过滤掉数据质量较差的特征。
参数
- 参数:
threshold (float) -- 缺失率阈值,默认为0.95 - 0.95: 移除缺失率超过95%的特征 - 范围: 0-1之间的浮点数
target (str)
include (List[str] | None)
exclude (List[str] | None)
force_drop (List[str] | None)
n_jobs (int | float | None)
binner (Any | None)
binning_params (Dict[str, Any] | None)
parallel_backend (str | None)
parallel_config (Mapping[str, Any] | None)
参考样例
>>> from hscredit.core.selectors import NullSelector >>> import pandas as pd >>> import numpy as np >>> X = pd.DataFrame({ ... 'a': [1, 2, np.nan, 4, 5], ... 'b': [1, 2, 3, 4, 5], ... 'c': [np.nan, np.nan, np.nan, np.nan, np.nan] ... }) >>> selector = NullSelector(threshold=0.5) >>> selector.fit(X) >>> print(selector.selected_features_) ['a', 'b']
- method_name = '缺失率筛选'
- class hscredit.core.selectors.ModeSelector(threshold=0.95, dropna=True, target='target', include=None, exclude=None, force_drop=None, n_jobs=-1, binner=None, binning_params=None, parallel_backend=None, parallel_config=None)[源代码]
-
单一值筛选器.
移除众数占比高于阈值的特征。 用于过滤掉取值过于集中、区分度低的特征。
参数
- 参数:
threshold (float) -- 单一值占比阈值,默认为0.95 - 0.95: 移除单一值占比超过95%的特征 - 范围: 0-1之间的浮点数
dropna (bool) -- 是否在计算众数占比时排除NaN,默认为True
n_jobs (int | float | None) -- 并行计算的任务数
target (str)
include (List[str] | None)
exclude (List[str] | None)
force_drop (List[str] | None)
binner (Any | None)
binning_params (Dict[str, Any] | None)
parallel_backend (str | None)
parallel_config (Mapping[str, Any] | None)
参考样例
>>> from hscredit.core.selectors import ModeSelector >>> import pandas as pd >>> X = pd.DataFrame({ ... 'a': [1, 1, 1, 1, 2], ... 'b': [1, 2, 3, 4, 5], ... 'c': [1, 1, 1, 1, 1] ... }) >>> selector = ModeSelector(threshold=0.8) >>> selector.fit(X) >>> print(selector.selected_features_) ['a', 'b']
- method_name = '单一值筛选'
- class hscredit.core.selectors.CardinalitySelector(threshold=10, dropna=True, target='target', include=None, exclude=None, force_drop=None, n_jobs=-1, binner=None, binning_params=None, parallel_backend=None, parallel_config=None)[源代码]
-
基数筛选器.
移除基数高于阈值的类别型特征。 高基数特征可能导致过拟合和计算问题。
参数
- 参数:
threshold (int) -- 基数阈值,默认为10 - 10: 移除唯一值数量超过10的类别型特征
dropna (bool) -- 是否在统计唯一值数量时排除NaN,默认为True
target (str)
include (List[str] | None)
exclude (List[str] | None)
force_drop (List[str] | None)
n_jobs (int | float | None)
binner (Any | None)
binning_params (Dict[str, Any] | None)
parallel_backend (str | None)
parallel_config (Mapping[str, Any] | None)
参考样例
>>> from hscredit.core.selectors import CardinalitySelector >>> import pandas as pd >>> X = pd.DataFrame({ ... 'city': ['北京', '上海', '广州', '北京', '深圳'], ... 'id': [1, 2, 3, 4, 5], # 高基数 ... }) >>> selector = CardinalitySelector(threshold=4) >>> selector.fit(X)
- method_name = '基数筛选'
- class hscredit.core.selectors.VarianceSelector(threshold=0.0, target='target', include=None, exclude=None, force_drop=None, n_jobs=-1, binner=None, binning_params=None, parallel_backend=None, parallel_config=None)[源代码]
-
方差筛选器.
移除方差低于阈值的特征。 常用于移除常量特征或近似常量特征。
参数
- 参数:
threshold (float) -- 方差阈值,默认为0.0 - 0.0: 移除常量特征(方差为0) - 其他值: 移除方差小于该值的特征
target (str)
include (List[str] | None)
exclude (List[str] | None)
force_drop (List[str] | None)
n_jobs (int | float | None)
binner (Any | None)
binning_params (Dict[str, Any] | None)
parallel_backend (str | None)
parallel_config (Mapping[str, Any] | None)
参考样例
>>> from hscredit.core.selectors import VarianceSelector >>> import pandas as pd >>> X = pd.DataFrame({'a': [1,2,3], 'b': [1,1,1], 'c': [1,2,3]}) >>> selector = VarianceSelector(threshold=0.1) >>> selector.fit(X) >>> print(selector.selected_features_) ['a', 'c']
注意
方差筛选为无监督方法,不使用标签
y;方差受量纲影响,不同尺度特征建议先标准化 再比较,否则大量纲特征会因方差天然偏大而被保留。引用
对齐 sklearn
VarianceThreshold: https://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.VarianceThreshold.html- method_name = '方差筛选'
- class hscredit.core.selectors.CorrSelector(threshold=0.7, method='spearman', metric='iv', weights=None, binning_params={'max_n_bins': 5, 'method': 'best_iv', 'min_bin_size': 0.01, 'missing_separate': True}, target='target', include=None, exclude=None, force_drop=None, n_jobs=-1, binner=None, parallel_backend=None, parallel_config=None, corr_block_size=512)[源代码]
-
相关性筛选器.
移除与其它特征相关性高于阈值的特征。 当两个特征高度相关时,保留指定指标(默认 IV)更高的特征。 特征按指标稳定降序逐步处理,只允许已实际保留的特征淘汰后续特征, 避免相关链中已删除变量继续造成过度筛除。
参数
- 参数:
threshold (float) -- 相关系数阈值,默认为0.7 - 0.7: 移除与其它特征相关性超过0.7的特征 - 范围: 0-1之间的浮点数
method (str) -- 相关性计算方法,默认为'spearman' - 'pearson': 皮尔逊相关系数 - 'spearman': 斯皮尔曼等级相关系数 - 'kendall': 肯德尔相关系数
metric (str) -- 用于决定保留哪个特征的指标,默认为'iv' - 'iv': 信息值(需要目标变量 y) - 'ks': KS 统计量 - 'lift': LIFT 值 - 'bad_rate': 坏样本率 指标通过分箱后的
bin_tables_计算得到。weights (Series | Dict[str, float] | List[float] | None) -- 特征权重,用于决定保留哪个特征,默认为None 如果同时传入 weights 和 metric,weights 优先。
binning_params (Dict[str, Any] | None) -- 透传给 OptimalBinning 的筛选前分箱参数,例如: - method: 分箱方法,默认'best_iv' - max_n_bins: 最大分箱数,默认5 - min_bin_size: 最小分箱比例,默认0.01 - missing_separate: 是否缺失单独分箱,默认True - prebinning: 预分箱方法 等等,详见 OptimalBinning 文档。
corr_block_size (int) -- 相关矩阵分块列数,默认为512。仅控制内存和任务粒度, 不改变相关系数、筛选阈值或结果顺序。
target (str)
include (List[str] | None)
exclude (List[str] | None)
force_drop (List[str] | None)
n_jobs (int | float | None)
binner (Any | None)
parallel_backend (str | None)
parallel_config (Mapping[str, Any] | None)
参考样例
>>> from hscredit.core.selectors import CorrSelector >>> selector = CorrSelector(threshold=0.7, metric='iv') >>> selector.fit(X, y) >>> print(selector.selected_features_) >>> >>> # 基于 KS 的相关性筛选 >>> selector = CorrSelector(threshold=0.7, metric='ks') >>> selector.fit(X, y) >>> >>> # 自定义分箱参数 >>> selector = CorrSelector( ... threshold=0.7, ... metric='iv', ... binning_params={'method': 'cart', 'max_n_bins': 8} ... ) >>> selector.fit(X, y) >>> >>> # 使用自定义权重(不做分箱) >>> selector = CorrSelector(threshold=0.7, weights=iv_series) >>> selector.fit(X)
引用
无缺失 Pearson 使用数学等价的标准化分块矩阵乘法;含缺失数据及 Spearman/Kendall 使用
pandas.DataFrame.corr的分块兼容路径: https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.corr.html ; 高相关特征对中保留 IV/KS 更高者的原则参考 toad / scorecardpipeline。- method_name = '相关性筛选'
- class hscredit.core.selectors.VIFSelector(threshold=4.0, missing=-1.0, max_iter=100, target='target', include=None, exclude=None, force_drop=None, n_jobs=-1, verbose=False, binner=None, binning_params=None, parallel_backend=None, parallel_config=None)[源代码]
-
VIF筛选器.
使用方差膨胀因子(VIF)检测多重共线性。 VIF值越高,表示特征与其他特征的多重共线性越严重。 在金融风控中,通常认为VIF > 4存在多重共线性问题。
算法说明:
采用迭代剔除策略: 1. 计算所有特征的VIF值 2. 如果最大VIF > threshold,剔除VIF最大的特征 3. 重新计算剩余特征的VIF 4. 重复步骤2-3,直到所有VIF <= threshold
这种方法避免了"一刀切"地剔除所有高VIF特征的问题。
参数
- 参数:
threshold (float) -- VIF阈值,默认为4.0 - 4.0: 移除VIF值超过4的特征 - 范围: 正数
missing (float) -- 缺失值填充值,默认为-1
max_iter (int) -- 最大迭代次数,默认为100
n_jobs (int | float | None) -- 并行计算的任务数
verbose (bool) -- 是否显示详细过程,默认为False
target (str)
include (List[str] | None)
exclude (List[str] | None)
force_drop (List[str] | None)
binner (Any | None)
binning_params (Dict[str, Any] | None)
parallel_backend (str | None)
parallel_config (Mapping[str, Any] | None)
参考样例
>>> from hscredit.core.selectors import VIFSelector >>> import pandas as pd >>> X = pd.DataFrame({ ... 'a': [1, 2, 3, 4, 5], ... 'b': [1, 2, 3, 4, 5], # 与a完全相关 ... 'c': [5, 4, 3, 2, 1] ... }) >>> selector = VIFSelector(threshold=4.0) >>> selector.fit(X) >>> print(selector.selected_features_) ['a', 'c'] # 或 ['b', 'c'],保留其中一个高相关特征
引用
方差膨胀因子
VIF_i = 1 / (1 - R_i²)``(``R_i²为特征 i 对其余特征回归的判定系数), 经验上 VIF>5(严格 >10)提示多重共线性。参见 Kutner, M. et al. (2004). Applied Linear Statistical Models;https://en.wikipedia.org/wiki/Variance_inflation_factor- method_name = 'VIF筛选'
- class hscredit.core.selectors.IVSelector(threshold=0.02, target='target', regularization=1.0, include=None, exclude=None, force_drop=None, n_jobs=-1, binner=None, binning_params=None, parallel_backend=None, parallel_config=None)[源代码]
-
IV值筛选器.
使用信息价值(Information Value)筛选特征。 IV是金融风控中衡量特征预测能力的核心指标。
IV值解释: - < 0.02: 无预测能力 - 0.02 - 0.1: 弱预测能力 - 0.1 - 0.3: 中等预测能力 - 0.3 - 0.5: 强预测能力 - > 0.5: 极强预测能力(可能过拟合)
支持的数据类型: - 数值型特征(int, float) - 类别型特征(object, category)
参数
- 参数:
threshold (float) -- IV阈值,默认为0.02 - 0.02: 仅保留IV值大于0.02的特征
target (str) -- 目标变量列名,默认为'target'
regularization (float) -- 正则化参数,默认为1.0
n_jobs (int | float | None) -- 并行计算的任务数
include (List[str] | None)
exclude (List[str] | None)
force_drop (List[str] | None)
binner (Any | None)
binning_params (Dict[str, Any] | None)
parallel_backend (str | None)
parallel_config (Mapping[str, Any] | None)
参考样例
>>> from hscredit.core.selectors import IVSelector >>> import pandas as pd >>> import numpy as np >>> np.random.seed(42) >>> X = pd.DataFrame(np.random.randn(1000, 5), columns=[f'f{i}' for i in range(5)]) >>> y = pd.Series(np.random.randint(0, 2, 1000)) >>> selector = IVSelector(threshold=0.02) >>> selector.fit(X, y) >>> print(selector.selected_features_) >>> print(selector.scores_) # 查看IV值 >>> # 仅传分箱参数:内部创建并训练 OptimalBinning >>> selector = IVSelector( ... threshold=0.02, ... binning_params={'method': 'best_iv', 'max_n_bins': 5}, ... ) >>> selector.fit(X, y) >>> # 传入配置好的未训练实例:筛选器自动训练 >>> from hscredit.core.binning import OptimalBinning >>> binner = OptimalBinning(method='best_iv', max_n_bins=5) >>> selector = IVSelector(threshold=0.02, binner=binner).fit(X, y) >>> # 传入已训练实例:直接复用规则,不重新训练 >>> trained_binner = OptimalBinning(method='best_iv').fit(X, y) >>> selector = IVSelector( ... threshold=0.02, ... binner=trained_binner, ... binning_params={'method': 'uniform'}, # binner 优先,本参数被忽略 ... ).fit(X, y)
参数
除继承自
BaseFeatureSelector的通用参数 (target/include/exclude/force_drop/n_jobs)外:- 参数:
threshold (float) -- IV 保留阈值,
IV >= threshold的特征被保留,默认为0.02regularization (float) -- 计算 WOE/IV 时的加性平滑系数,避免某类别好/坏样本数为 0 导致取对数发散,默认为
1.0binner (Any | None) -- 可选的已配置分箱器实例。未训练实例会自动训练,已训练实例直接复用
binning_params (Dict[str, Any] | None) -- 可选的
OptimalBinning构造参数字典。未传binner时, 内部创建分箱器并将原始数据转换为分箱 index 后计算 IVtarget (str)
include (List[str] | None)
exclude (List[str] | None)
force_drop (List[str] | None)
n_jobs (int | float | None)
parallel_backend (str | None)
parallel_config (Mapping[str, Any] | None)
备注
本筛选器按特征的**唯一取值**直接计算 IV(类别型先
factorize),适合已分箱 或基数较低的特征;连续特征建议先用OptimalBinning分箱后再筛选,或传入binner参数。引用
Information Value 用于变量筛选见 Siddiqi, N. (2006). Credit Risk Scorecards. Wiley;阈值经验区间(0.02/0.1/0.3/0.5)为业界通行标准。
- method_name = 'IV值筛选'
- class hscredit.core.selectors.LiftSelector(threshold=0.5, ratio=0.1, direction='auto', target='target', include=None, exclude=None, force_drop=None, n_jobs=-1, binner=None, binning_params=None, parallel_backend=None, parallel_config=None)[源代码]
-
LIFT筛选器.
使用LIFT@ratio值筛选特征,支持找坏人、找好人、自动三种方向模式。 LIFT衡量特征在头部覆盖率下对目标群体的提升程度。
LIFT@ratio% 计算方式
将样本按特征值排序
取头部 ratio 比例的样本
LIFT = 该子群坏样本率 / 整体坏样本率
方向模式
direction
含义
评分方式
auto
自动选择最优方向(默认)
score = max(LIFT_bad-1, 1-LIFT_good, 0)
bad
仅评估找坏人能力
score = max(LIFT_bad - 1, 0)
good
仅评估找好人能力
score = max(1 - LIFT_good, 0)
评分含义
score 只度量目标方向相对基准 LIFT=1 的改善,反向偏离按 0 计:
score = 0: 无区分能力(LIFT = 1)
score = 4.0: 强找坏人能力(LIFT_bad=5.0);找好人得分上限为 1(LIFT_good=0)
内部经验: score >= 0.5 通常认为有一定区分力
参数
- 参数:
threshold (float) -- 目标方向的改善得分阈值,默认0.5 - 仅保留 score >= threshold 的特征 - threshold=0.5 等价于旧版 LIFT >= 1.5(找坏人方向) - 内部经验: 风控场景常用 0.5~1.0
ratio (float) -- LIFT计算的覆盖率,默认0.10(即LIFT@10%) - 内部经验: 风控场景常用 lift@5% 或 lift@10%
direction (Literal['auto', 'bad', 'good']) -- 方向模式,默认'auto' - 'auto': 同时计算两个方向,取最优(推荐) - 'bad': 仅评估找坏人能力(降序取头部,LIFT > 1) - 'good': 仅评估找好人能力(升序取头部,LIFT < 1)
target (str) -- 目标变量列名,默认为'target'
include (List[str] | None) -- 强制保留的特征列表
exclude (List[str] | None) -- 强制剔除的特征列表
n_jobs (int | float | None) -- 并行计算的任务数
force_drop (List[str] | None)
binner (Any | None)
binning_params (Dict[str, Any] | None)
parallel_backend (str | None)
parallel_config (Mapping[str, Any] | None)
属性
scores_: 各特征在目标方向上的改善得分,pd.Series
- lift_detail_: 各特征的LIFT详情表,pd.DataFrame
包含列: LIFT_bad, LIFT_good, best_direction, score
参考样例
>>> from hscredit.core.selectors import LiftSelector >>> import pandas as pd >>> import numpy as np >>> np.random.seed(42) >>> X = pd.DataFrame(np.random.randn(1000, 5), columns=[f'f{i}' for i in range(5)]) >>> y = pd.Series(np.random.randint(0, 2, 1000)) >>> >>> # 自动模式(推荐): 同时检测找坏人和找好人能力 >>> selector = LiftSelector(threshold=0.5, ratio=0.10) >>> selector.fit(X, y) >>> print(selector.lift_detail_) # 查看各特征两个方向的LIFT >>> >>> # 仅评估找坏人能力 >>> selector = LiftSelector(direction='bad', threshold=0.5) >>> selector.fit(X, y) >>> >>> # 仅评估找好人能力 >>> selector = LiftSelector(direction='good', threshold=0.5) >>> selector.fit(X, y)
引用
LIFT@k%(头部覆盖率下的提升度)是响应/风险模型的标准评估口径,参见 lift chart https://en.wikipedia.org/wiki/``Lift_``(data_mining) 及 Siddiqi, N. (2006). Credit Risk Scorecards. Wiley。
- method_name = 'LIFT筛选'
- class hscredit.core.selectors.PSISelector(threshold=0.25, n_splits=5, oot_df=None, psi_bins=10, random_state=42, target='target', include=None, exclude=None, force_drop=None, n_jobs=-1, binner=None, binning_params=None, parallel_backend=None, parallel_config=None)[源代码]
-
PSI筛选器.
使用群体稳定性指标(Population Stability Index)筛选特征。 PSI衡量特征在不同样本间的分布稳定性。 常用于跨时间验证和oot验证。
PSI值解释: - < 0.1: 特征稳定性好 - 0.1 - 0.25: 特征有轻微变化,需要关注 - > 0.25: 特征分布变化显著,需要处理
参数
- 参数:
threshold (float) -- PSI阈值,默认为0.25 - 0.25: 移除PSI值超过0.25的特征
n_splits (int) -- 交叉验证折数,用于计算PSI
oot_df (DataFrame | None) -- 可选的真实 OOT 对照集;传入时直接计算训练集与 OOT 的 PSI
psi_bins (int) -- 连续变量分箱数,默认为10;低基数/类别变量按类别对齐
random_state (int | None) -- 未传 OOT 时交叉分折的随机种子
target (str) -- 目标变量列名,默认为'target'
n_jobs (int | float | None) -- 并行计算的任务数
include (List[str] | None)
exclude (List[str] | None)
force_drop (List[str] | None)
binner (Any | None)
binning_params (Dict[str, Any] | None)
parallel_backend (str | None)
parallel_config (Mapping[str, Any] | None)
参考样例
>>> from hscredit.core.selectors import PSISelector >>> import pandas as pd >>> import numpy as np >>> np.random.seed(42) >>> X = pd.DataFrame(np.random.randn(1000, 5), columns=[f'f{i}' for i in range(5)]) >>> y = pd.Series(np.random.randint(0, 2, 1000)) >>> selector = PSISelector(threshold=0.25, n_splits=5) >>> selector.fit(X, y) >>> print(selector.selected_features_)
引用
PSI(群体稳定性指标)公式
PSI = Σ (实际占比 - 预期占比) × ln(实际占比 / 预期占比), 经验阈值 <0.1 稳定、0.1~0.25 轻微漂移、>0.25 显著漂移,广泛用于信用评分的稳定性 监控,参见 Siddiqi, N. (2006). Credit Risk Scorecards. Wiley。- method_name = 'PSI筛选'
- class hscredit.core.selectors.FeatureImportanceSelector(estimator, threshold=0.0, importance_getter='auto', target='target', include=None, exclude=None, force_drop=None, n_jobs=-1, binner=None, binning_params=None, parallel_backend=None, parallel_config=None)[源代码]
-
特征重要性筛选器.
使用模型的特征重要性进行筛选。 支持任意有feature_importances_或coef_属性的模型, 以及原生xgboost/lightgbm/catboost模型。
参数
- 参数:
estimator -- 评估器 - 树模型: RandomForestClassifier, XGBClassifier, LGBMClassifier, CatBoostClassifier - 线性模型: LogisticRegression, LinearSVC 等 - hscredit模型: XGBoost, LightGBM, CatBoost 等
threshold (float | int) -- 重要性阈值或保留特征数 - 浮点数: 保留重要性 >= threshold的特征 - 整数: 保留top-k个特征
importance_getter (str | Callable[[Any], Any]) -- 重要性获取方式,默认为'auto'
target (str) -- 目标变量列名,默认为'target'
include (List[str] | None)
exclude (List[str] | None)
force_drop (List[str] | None)
n_jobs (int | float | None)
binner (Any | None)
binning_params (Dict[str, Any] | None)
parallel_backend (str | None)
parallel_config (Mapping[str, Any] | None)
参考样例
>>> from hscredit.core.selectors import FeatureImportanceSelector >>> from sklearn.ensemble import RandomForestClassifier >>> import pandas as pd >>> import numpy as np >>> np.random.seed(42) >>> X = pd.DataFrame(np.random.randn(100, 5), columns=[f'f{i}' for i in range(5)]) >>> y = np.random.randint(0, 2, 100) >>> rf = RandomForestClassifier(n_estimators=100, random_state=42) >>> selector = FeatureImportanceSelector(rf, threshold=0.1) >>> selector.fit(X, y)
注意
重要性来源依模型而定(树模型为
feature_importances_,线性模型为|``coef_``|), 见get_feature_importances();不同来源不可直接横向 比较。基于 impurity 的树重要性对高基数特征有偏,必要时配合NullImportanceSelector校正。引用
嵌入式重要性筛选对齐 sklearn
SelectFromModel: https://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.SelectFromModel.html- method_name = '特征重要性筛选'
- class hscredit.core.selectors.NullImportanceSelector(estimator, threshold=0.0, cv=5, n_runs=5, random_state=42, target='target', include=None, exclude=None, force_drop=None, n_jobs=-1, binner=None, binning_params=None, parallel_backend=None, parallel_config=None)[源代码]
-
零重要性筛选器.
使用 null importance 识别真正有价值的特征。 通过多次 shuffle 目标变量得到随机情况下的 null 重要性, 再用实际重要性减去 null 重要性作为特征得分。
参数
- 参数:
estimator -- 评估器
threshold (float) -- 阈值,默认为0.0 - 保留
实际重要性 - null重要性 > threshold的特征cv (int) -- 交叉验证折数,默认为5
n_runs (int) -- 置换次数,默认为5
random_state (int | None) -- 随机种子
target (str) -- 目标变量列名,默认为'target'
include (List[str] | None)
exclude (List[str] | None)
force_drop (List[str] | None)
n_jobs (int | float | None)
binner (Any | None)
binning_params (Dict[str, Any] | None)
parallel_backend (str | None)
parallel_config (Mapping[str, Any] | None)
参考样例
>>> from hscredit.core.selectors import NullImportanceSelector >>> from sklearn.ensemble import RandomForestClassifier >>> import pandas as pd >>> import numpy as np >>> np.random.seed(42) >>> X = pd.DataFrame(np.random.randn(200, 5), columns=[f'f{i}' for i in range(5)]) >>> y = np.random.randint(0, 2, 200) >>> selector = NullImportanceSelector( ... RandomForestClassifier(n_estimators=50, random_state=42), ... threshold=0.0, cv=3, n_runs=3 ... ) >>> selector.fit(X, y) >>> print(selector.selected_features_)
注意
本方法通过多次打乱**目标变量**得到"零假设"下的重要性分布(null importances), 再以
实际重要性 - null重要性判断特征是否显著优于随机,能有效剔除高基数/噪声特征的 虚高重要性。计算量为n_runs × cv次模型训练。引用
Altmann, A. et al. (2010). Permutation importance: a corrected feature importance measure. Bioinformatics, 26(10). https://doi.org/10.1093/bioinformatics/btq134
- get_importance_details()[源代码]
获取实际重要性、Null重要性和差值得分明细。
- 返回:
包含
特征、实际重要性、Null重要性、特征得分的 DataFrame- 返回类型:
DataFrame
- method_name = '零重要性筛选'
- class hscredit.core.selectors.RFESelector(estimator, n_features_to_select=10, step=1, target='target', include=None, exclude=None, force_drop=None, n_jobs=-1, binner=None, binning_params=None, parallel_backend=None, parallel_config=None)[源代码]
-
递归特征消除筛选器.
通过递归方式逐步剔除最不重要的特征。 适用于任何有feature_importances_或coef_属性的模型。
参数
- 参数:
estimator -- 评估器
n_features_to_select (int | float) -- 保留的特征数,默认为10 - 整数: 保留的特征数量 - 浮点数: 保留的特征比例
step (int) -- 每次剔除的特征数,默认为1
target (str) -- 目标变量列名,默认为'target'
include (List[str] | None)
exclude (List[str] | None)
force_drop (List[str] | None)
n_jobs (int | float | None)
binner (Any | None)
binning_params (Dict[str, Any] | None)
parallel_backend (str | None)
parallel_config (Mapping[str, Any] | None)
参考样例
>>> from hscredit.core.selectors import RFESelector >>> from sklearn.ensemble import RandomForestClassifier >>> import pandas as pd >>> import numpy as np >>> np.random.seed(42) >>> X = pd.DataFrame(np.random.randn(200, 10), columns=[f'f{i}' for i in range(10)]) >>> y = np.random.randint(0, 2, 200) >>> selector = RFESelector( ... RandomForestClassifier(n_estimators=100, random_state=42), ... n_features_to_select=5 ... ) >>> selector.fit(X, y) >>> print(selector.selected_features_)
引用
递归特征消除(RFE)出自 Guyon, I. et al. (2002). Gene Selection for Cancer Classification using Support Vector Machines. Machine Learning, 46. https://doi.org/10.1023/A:1012487302797 ;实现对齐 sklearn
RFEhttps://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.RFE.html- method_name = 'RFE筛选'
- class hscredit.core.selectors.SequentialFeatureSelector(estimator, n_features_to_select='auto', direction='forward', scoring=None, cv=5, target='target', include=None, exclude=None, force_drop=None, n_jobs=-1, binner=None, binning_params=None, parallel_backend=None, parallel_config=None)[源代码]
-
逐步特征筛选器.
使用前向或后向逐步选择选择最优特征子集。 前向选择:从空集开始,逐步添加最有价值的特征 后向消除:从所有特征开始,逐步剔除最无价值的特征
参数
- 参数:
estimator -- 评估器
n_features_to_select (int | float | str) -- 保留的特征数,默认为'auto' - 'auto': 保留一半特征 - 整数: 保留的特征数量 - 浮点数: 保留的特征比例
direction (str) -- 方向,默认为'forward' - 'forward': 前向选择 - 'backward': 后向消除
scoring (str | None) -- 评分指标,默认为None
cv (int) -- 交叉验证折数,默认为5
target (str) -- 目标变量列名,默认为'target'
include (List[str] | None)
exclude (List[str] | None)
force_drop (List[str] | None)
n_jobs (int | float | None)
binner (Any | None)
binning_params (Dict[str, Any] | None)
parallel_backend (str | None)
parallel_config (Mapping[str, Any] | None)
参考样例
>>> from hscredit.core.selectors import SequentialFeatureSelector >>> from sklearn.ensemble import RandomForestClassifier >>> import pandas as pd >>> import numpy as np >>> np.random.seed(42) >>> X = pd.DataFrame(np.random.randn(200, 10), columns=[f'f{i}' for i in range(10)]) >>> y = np.random.randint(0, 2, 200) >>> selector = SequentialFeatureSelector( ... RandomForestClassifier(n_estimators=50, random_state=42), ... n_features_to_select=5, ... direction='forward', ... cv=3 ... ) >>> selector.fit(X, y) >>> print(selector.selected_features_)
注意
与
RFESelector不同,本类基于交叉验证评分而非模型权重逐个增删特征,更稳健但 更耗时(约n_features × cv次拟合);与 :class:`StepwiseSelector`(基于 AIC/BIC/KS 等 统计准则、面向逻辑回归)适用场景亦不同。引用
对齐 sklearn
SequentialFeatureSelector: https://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.SequentialFeatureSelector.html- method_name = '逐步筛选'
- class hscredit.core.selectors.StepwiseSelector(estimator='logit', direction='both', criterion='aic', max_features=None, p_enter=0.01, p_remove=0.01, p_value_enter=0.2, intercept=True, max_iter=100, verbose=False, target='target', include=None, exclude=None, force_drop=None, threshold=0.0, n_jobs=-1, binner=None, binning_params=None, parallel_backend=None, parallel_config=None)[源代码]
-
逐步回归特征筛选器.
使用逐步回归方法进行特征筛选,支持前向、后向和双向选择策略。 基于统计准则(AIC/BIC/KS/AUC)评估特征组合的优劣。
参数
- 参数:
estimator (str | object) -- 评估器类型,默认为'logit' - 'logit': 逻辑回归 - 'ols': 最小二乘回归 - 或传入 sklearn 兼容的评估器对象
direction (str) -- 选择方向,默认为'both' - 'forward': 前向选择,从空模型开始逐步添加特征 - 'backward': 后向消除,从全特征开始逐步剔除特征 - 'both': 双向选择,结合前向和后向
criterion (str) -- 筛选准则,默认为'aic' - 'aic': Akaike信息准则(越小越好) - 'bic': 贝叶斯信息准则(越小越好) - 'ks': Kolmogorov-Smirnov统计量(越大越好,仅适用于logit) - 'auc': AUC值(越大越好,仅适用于logit)
max_features (int | float | None) -- 最大特征数量,默认为None(不限制) - 如果为整数,限制选中的特征数量 - 如果为浮点数(0-1),限制为总特征数的比例
p_enter (float) -- 前向进入阈值,默认为0.01 - 特征加入后模型改善需要超过此阈值(对于AIC/BIC) - 或特征p值需要低于此阈值(对于p_value_enter)
p_remove (float) -- 后向剔除阈值,默认为0.01 - 特征剔除后模型改善需要超过此阈值
p_value_enter (float) -- 双向选择中特征p值阈值,默认为0.2 - 在双向选择中,p值超过此阈值的特征会被剔除
intercept (bool) -- 是否包含截距项,默认为True
max_iter (int) -- 最大迭代次数,默认为100
verbose (bool) -- 是否打印详细信息,默认为False
target (str) -- 目标变量列名,默认为'target'
include (List[str] | None) -- 强制保留的特征列表
exclude (List[str] | None) -- 强制剔除的特征列表
n_jobs (int | float | None) -- 并行任务数(保留参数,暂未使用)
force_drop (List[str] | None)
threshold (float | int | str)
binner (Any | None)
binning_params (Dict[str, Any] | None)
parallel_backend (str | None)
parallel_config (Mapping[str, Any] | None)
属性
- 参数:
selected_features_ -- 选中的特征列表
removed_features_ -- 被剔除的特征列表
scores_ -- 各特征在逐步回归中的得分
history_ -- 逐步回归过程历史记录
model_results_ -- 最终模型的统计结果
n_features_ -- 选中的特征数量
estimator (str | object)
direction (str)
criterion (str)
max_features (int | float | None)
p_enter (float)
p_remove (float)
p_value_enter (float)
intercept (bool)
max_iter (int)
verbose (bool)
target (str)
include (List[str] | None)
exclude (List[str] | None)
force_drop (List[str] | None)
threshold (float | int | str)
n_jobs (int | float | None)
binner (Any | None)
binning_params (Dict[str, Any] | None)
parallel_backend (str | None)
parallel_config (Mapping[str, Any] | None)
参考样例
>>> from hscredit.core.selectors import StepwiseSelector >>> import pandas as pd >>> import numpy as np >>> np.random.seed(42) >>> X = pd.DataFrame(np.random.randn(200, 5), columns=[f'f{i}' for i in range(5)]) >>> y = pd.Series(np.random.randint(0, 2, 200)) >>> selector = StepwiseSelector( ... estimator='logit', ... direction='both', ... criterion='aic', ... max_features=10, ... p_enter=0.05, ... p_remove=0.05, ... ) >>> selector.fit(X, y) >>> print(selector.selected_features_)
引用
逐步回归参见 Hocking, R. R. (1976). The Analysis and Selection of Variables in Linear Regression. Biometrics;准则出处:AIC = Akaike (1974)、BIC = Schwarz (1978)。 实现风格对齐 toad / scorecardpipeline 的
stepwise。- method_name = '逐步回归筛选'
- class hscredit.core.selectors.BorutaSelector(estimator=None, n_estimators=100, max_iter=100, random_state=42, alpha=0.05, target='target', include=None, exclude=None, force_drop=None, n_jobs=-1, binner=None, binning_params=None, parallel_backend=None, parallel_config=None)[源代码]
-
Boruta筛选器.
Boruta是一种基于随机森林的特征选择算法。 通过创建影子特征(shuffled版本),与原始特征进行比较, 保留统计显著优于影子特征的特征。
参数
- 参数:
estimator -- 随机森林评估器
n_estimators (int) -- 树的数量,默认为100
max_iter (int) -- 最大迭代次数,默认为100
alpha (float) -- 多重检验校正前的显著性水平,默认为0.05
random_state (int | None) -- 随机种子
target (str) -- 目标变量列名,默认为'target'
n_jobs (int | float | None) -- 并行计算的任务数
include (List[str] | None)
exclude (List[str] | None)
force_drop (List[str] | None)
binner (Any | None)
binning_params (Dict[str, Any] | None)
parallel_backend (str | None)
parallel_config (Mapping[str, Any] | None)
参考样例
>>> from hscredit.core.selectors import BorutaSelector >>> from sklearn.ensemble import RandomForestClassifier >>> import pandas as pd >>> import numpy as np >>> np.random.seed(42) >>> X = pd.DataFrame(np.random.randn(200, 10), columns=[f'f{i}' for i in range(10)]) >>> y = np.random.randint(0, 2, 200) >>> selector = BorutaSelector( ... RandomForestClassifier(n_estimators=50, n_jobs=-1, random_state=42) ... ) >>> selector.fit(X, y) >>> print(selector.selected_features_)
注意
Boruta 是 all-relevant(保留所有相关特征)而非 minimal-optimal 的方法,倾向于多保留 特征;计算量为
max_iter × n_estimators,特征数多时较慢。引用
Kursa, M. B., & Rudnicki, W. R. (2010). Feature Selection with the Boruta Package. Journal of Statistical Software, 36(11). https://doi.org/10.18637/jss.v036.i11
- method_name = 'Boruta筛选'
- class hscredit.core.selectors.MutualInfoSelector(threshold=0.0, n_neighbors=3, random_state=42, target='target', include=None, exclude=None, force_drop=None, n_jobs=-1, binner=None, binning_params=None, parallel_backend=None, parallel_config=None)[源代码]
-
互信息筛选器.
使用互信息(Mutual Information)评估特征与目标变量的相关性。 互信息可以捕捉非线性关系。
互信息值解释: - 0: 特征与目标完全独立 - 值越大: 特征与目标的依赖关系越强
参数
- 参数:
threshold (float) -- 互信息阈值,默认为0.0
n_neighbors (int) -- 邻居数,用于估计互信息,默认为3
random_state (int | None) -- 随机种子;None 使用稳定基准 0,负数和超大整数会归一化到合法范围
target (str) -- 目标变量列名,默认为'target'
n_jobs (int | float | None) -- 并行计算的任务数(注意:mutual_info_classif 不支持并行,此参数保留用于未来扩展)
include (List[str] | None)
exclude (List[str] | None)
force_drop (List[str] | None)
binner (Any | None)
binning_params (Dict[str, Any] | None)
parallel_backend (str | None)
parallel_config (Mapping[str, Any] | None)
参考样例
>>> from hscredit.core.selectors import MutualInfoSelector >>> import pandas as pd >>> import numpy as np >>> np.random.seed(42) >>> X = pd.DataFrame(np.random.randn(1000, 5), columns=[f'f{i}' for i in range(5)]) >>> y = pd.Series(np.random.randint(0, 2, 1000)) >>> selector = MutualInfoSelector(threshold=0.1) >>> selector.fit(X, y) >>> print(selector.selected_features_)
注意
互信息可捕捉线性与非线性依赖,连续特征用 k 近邻法估计(
n_neighbors越大方差越小、 偏差略增),故结果依赖random_state。为保证串行、线程和进程后端精确一致,None按稳定基准 0 处理,每列使用按输入顺序派生的独立合法种子,不依赖全局随机数状态。引用
基于 sklearn ``mutual_info_classif``(Kraskov 等的 kNN 估计): https://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.mutual_info_classif.html ; Kraskov, A. et al. (2004). Estimating mutual information. Phys. Rev. E 69.
- method_name = '互信息筛选'
- class hscredit.core.selectors.Chi2Selector(threshold=0.0, k='all', missing=-99.0, target='target', include=None, exclude=None, force_drop=None, n_jobs=-1, binner=None, binning_params=None, parallel_backend=None, parallel_config=None)[源代码]
-
卡方筛选器.
使用卡方检验评估特征与目标变量的独立性。 适用于分类问题和非负特征。
卡方值解释: - 值越大: 特征与目标变量越相关
参数
- 参数:
threshold (float) -- 得分阈值,默认为0.0
k (int | str) -- 保留的特征数,默认为'all'
missing (float | int | str | None | bool) -- 缺失值处理方式。数值则直接填充;字符串
'mean'/'min'/'max'按列统计量填充;None或False则删除含缺失值的行。默认为-99.0target (str) -- 目标变量列名,默认为'target'
include (List[str] | None)
exclude (List[str] | None)
force_drop (List[str] | None)
n_jobs (int | float | None)
binner (Any | None)
binning_params (Dict[str, Any] | None)
parallel_backend (str | None)
parallel_config (Mapping[str, Any] | None)
参考样例
>>> from hscredit.core.selectors import Chi2Selector >>> import pandas as pd >>> import numpy as np >>> np.random.seed(42) >>> X = pd.DataFrame(np.abs(np.random.randn(1000, 5)), columns=[f'f{i}' for i in range(5)]) >>> y = pd.Series(np.random.randint(0, 2, 1000)) >>> selector = Chi2Selector(k=3) >>> selector.fit(X, y) >>> print(selector.selected_features_)
注意
卡方检验要求特征非负(本类对负值通过
missing/填充策略处理);k与threshold同时生效——先按得分阈值过滤,再取前k个。引用
基于 sklearn
chi2评分: https://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.chi2.html- method_name = '卡方检验筛选'
- class hscredit.core.selectors.FTestSelector(threshold=0.0, k='all', percentile=None, target='target', include=None, exclude=None, force_drop=None, n_jobs=-1, binner=None, binning_params=None, parallel_backend=None, parallel_config=None)[源代码]
-
F检验筛选器.
使用F检验(ANOVA)评估特征与目标变量的相关性。 适用于分类问题。
F值解释: - 值越大: 特征与目标变量越相关
参数
- 参数:
threshold (float) -- F值阈值,默认为0.0
k (int | str) -- 保留的特征数,默认为'all'
percentile (int | None) -- 保留的特征百分比,默认为None
target (str) -- 目标变量列名,默认为'target'
include (List[str] | None)
exclude (List[str] | None)
force_drop (List[str] | None)
n_jobs (int | float | None)
binner (Any | None)
binning_params (Dict[str, Any] | None)
parallel_backend (str | None)
parallel_config (Mapping[str, Any] | None)
参考样例
>>> from hscredit.core.selectors import FTestSelector >>> import pandas as pd >>> import numpy as np >>> np.random.seed(42) >>> X = pd.DataFrame(np.random.randn(1000, 5), columns=[f'f{i}' for i in range(5)]) >>> y = pd.Series(np.random.randint(0, 2, 1000)) >>> selector = FTestSelector(k=3) >>> selector.fit(X, y) >>> print(selector.selected_features_)
注意
F 检验只能捕捉特征与目标的**线性**相关,非线性关系可能漏检(此时改用
MutualInfoSelector)。k/percentile/threshold可组合限制选中数量。引用
基于 sklearn ``f_classif``(ANOVA F 值): https://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.f_classif.html
- method_name = 'F检验筛选'
- class hscredit.core.selectors.StabilityAwareSelector(iv_threshold=0.02, psi_threshold=0.25, score_threshold=0.0, iv_weight=0.6, psi_weight=0.4, oot_df=None, psi_bins=10, target='target', include=None, exclude=None, force_drop=None, n_jobs=-1, random_state=None, binner=None, binning_params=None, parallel_backend=None, parallel_config=None)[源代码]
-
稳定性感知筛选器.
综合考虑特征区分力(IV)和分布稳定性(PSI),通过加权评分公式选择特征:
score = iv_weight × IV_normalized − psi_weight × PSI_normalized
筛选条件(同时满足): 1. IV >= iv_threshold 2. PSI <= psi_threshold 3. 综合评分 >= score_threshold
适用场景: - 模型变量筛选阶段,避免选入"高区分但不稳定"的特征 - 跨时间段 / OOT 验证时的特征稳健性筛选
- 参数:
iv_threshold (float) -- IV下限,默认 0.02
psi_threshold (float) -- PSI上限,默认 0.25
score_threshold (float) -- 综合评分下限,默认 0.0
iv_weight (float) -- IV 在综合评分中的权重,默认 0.6
psi_weight (float) -- PSI 在综合评分中的权重,默认 0.4
oot_df (DataFrame | None) -- 用于计算 PSI 的 OOT 数据集(DataFrame), 若不传则使用 fit 时的 X 进行随机对半拆分
psi_bins (int) -- PSI 分箱数,默认 10
target (str) -- 目标变量列名(当通过DataFrame入参时使用)
n_jobs (int | float | None) -- 并行数
include (List[str] | None)
exclude (List[str] | None)
force_drop (List[str] | None)
random_state (int | None)
binner (Any | None)
binning_params (Dict[str, Any] | None)
parallel_backend (str | None)
parallel_config (Mapping[str, Any] | None)
参考样例
>>> from hscredit.core.selectors import StabilityAwareSelector >>> import pandas as pd >>> import numpy as np >>> np.random.seed(42) >>> X = pd.DataFrame(np.random.randn(1000, 5), columns=[f'f{i}' for i in range(5)]) >>> y = pd.Series(np.random.randint(0, 2, 1000)) >>> oot_data = pd.DataFrame(np.random.randn(500, 5), columns=[f'f{i}' for i in range(5)]) >>> selector = StabilityAwareSelector( ... iv_threshold=0.02, ... psi_threshold=0.25, ... oot_df=oot_data, ... ) >>> selector.fit(X, y) >>> print(selector.selected_features_)
注意
本筛选器是"稳定性感知"的复合筛选(IV 区分力 + PSI 稳定性加权评分),并非 Meinshausen & Bühlmann 的 stability selection(重采样频率法)。IV 与 PSI 的定义与阈值分别见
IVSelector与PSISelector。引用
IV / PSI 用于评分卡变量筛选与稳定性监控见 Siddiqi, N. (2006). Credit Risk Scorecards. Wiley。
- method_name = '稳定性感知筛选'
- class hscredit.core.selectors.ScorecardFeatureSelection(null_threshold=0.95, iv_threshold=0.02, corr_threshold=0.7, mode_threshold=0.95, corr_method='pearson', corr_metric='iv', corr_weights=None, corr_binning_params=None, iv_regularization=1.0, mode_dropna=True, target='target', include=None, exclude=None, force_drop=None, target_rm=False, n_jobs=-1, binner=None, binning_params=None, parallel_backend=None, parallel_config=None)[源代码]
-
评分卡风格特征粗筛器.
按如下顺序执行特征筛选:
缺失率筛选(NullSelector)
IV值筛选(IVSelector)
相关性筛选(CorrSelector)
单一值筛选(ModeSelector)
与 scorecardpipeline.FeatureSelection 的思路一致, 但参数命名和基础行为遵循 hscredit 风格:
缺失率阈值使用
null_thresholdIV阈值使用
iv_threshold相关性阈值使用
corr_threshold单一值占比阈值使用
mode_threshold强制保留使用
include强制剔除使用
exclude/force_drop支持 sklearn 风格
fit(X, y)支持 scorecardpipeline 风格
fit(df)
参数
- 参数:
null_threshold (float | None) -- 缺失率阈值,默认为0.95;设为None可关闭该阶段
iv_threshold (float | None) -- IV阈值,默认为0.02;设为None可关闭该阶段
corr_threshold (float | None) -- 相关性阈值,默认为0.7;设为None可关闭该阶段
mode_threshold (float | None) -- 单一值占比阈值,默认为0.95;设为None可关闭该阶段
corr_method (str) -- 相关系数计算方法,默认为'pearson' - 'pearson': 皮尔逊相关系数 - 'spearman': 斯皮尔曼等级相关系数 - 'kendall': 肯德尔相关系数
corr_metric (str) -- 相关性筛选的保留指标,默认为'iv' - 'iv': 信息值(需要目标变量y) - 'ks': KS统计量 - 'lift': LIFT值 - 'bad_rate': 坏样本率 指标通过分箱后的bin_tables_计算得到。
corr_weights (Series | Dict[str, float] | List[float] | None) -- 自定义相关性筛选权重,优先级高于corr_metric
corr_binning_params (Dict[str, Any] | None) -- 透传给CorrSelector的分箱参数
iv_regularization (float) -- IV计算正则项,默认为1.0
mode_dropna (bool) -- 计算单一值占比时是否排除缺失值,默认为True
target (str) -- 目标变量列名,默认为'target'
include (List[str] | None) -- 强制保留特征列表
exclude (List[str] | None) -- 强制剔除特征列表
force_drop (List[str] | None) -- 强制剔除特征列表,最终会合并到exclude
target_rm (bool) -- transform时是否移除目标列,默认为False
n_jobs (int | float | None) -- 并行任务数
binner (Any | None)
binning_params (Dict[str, Any] | None)
parallel_backend (str | None)
parallel_config (Mapping[str, Any] | None)
参考样例
>>> from hscredit.core.selectors import ScorecardFeatureSelection >>> import pandas as pd >>> import numpy as np >>> np.random.seed(42) >>> X = pd.DataFrame(np.random.randn(1000, 10), columns=[f'f{i}' for i in range(10)]) >>> y = pd.Series(np.random.randint(0, 2, 1000)) >>> selector = ScorecardFeatureSelection( ... null_threshold=0.95, ... iv_threshold=0.02, ... corr_threshold=0.7, ... mode_threshold=0.95, ... ) >>> selector.fit(X, y) >>> print(selector.selected_features_) >>> print(selector.stage_report_df_)
- fit(X, y=None)[源代码]
拟合评分卡风格筛选器并同步兼容属性。
- 参数:
X (DataFrame | ndarray)
y (ndarray | Series | None)
- 返回类型:
- method_name = '评分卡特征粗筛'
- class hscredit.core.selectors.CompositeFeatureSelector(selectors, strategy='sequential', target='target', include=None, exclude=None, binner=None, binning_params=None, n_jobs=-1, parallel_backend=None, parallel_config=None)[源代码]
-
组合特征筛选器.
将多个筛选器组合在一起,按顺序执行筛选。后续筛选器基于前面筛选器的结果进行筛选。 支持通过 include 和 exclude 参数强制保留或剔除特定特征。
参数
- 参数:
selectors (List[BaseFeatureSelector]) -- 筛选器列表,按执行顺序排列
strategy (str) -- 组合策略,可选 'sequential' 或 'intersection' - 'sequential': 按顺序筛选,每轮剔除不满足条件的特征 - 'intersection': 取所有筛选器选中特征的交集
include (List[str] | None) -- 强制保留的特征列表,这些特征无论如何都会被保留
exclude (List[str] | None) -- 强制剔除的特征列表,这些特征无论如何都会被剔除
target (str) -- 目标变量列名,默认为 'target'
binner (Any | None) -- 可选的分箱器
binning_params (Dict[str, Any] | None)
n_jobs (int | float | None)
parallel_backend (str | None)
parallel_config (Mapping[str, Any] | None)
参考样例
>>> from hscredit.core.selectors import ( ... VarianceSelector, CorrSelector, IVSelector ... ) >>> import pandas as pd >>> import numpy as np >>> np.random.seed(42) >>> X = pd.DataFrame(np.random.randn(200, 10), columns=[f'f{i}' for i in range(10)]) >>> y = pd.Series(np.random.randint(0, 2, 200)) >>> composite = CompositeFeatureSelector([ ... VarianceSelector(threshold=0.01), ... CorrSelector(threshold=0.8), ... IVSelector(threshold=0.02), ... ]) >>> composite.fit(X, y) CompositeFeatureSelector(...) >>> len(composite.selected_features_) ...