特征筛选 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_: 各特征的筛选得分的 Series

  • n_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)

返回类型:

BaseFeatureSelector

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_feature_names_out(input_features=None)[源代码]

返回转换后的字段名,兼容 sklearn Pipeline。

返回类型:

ndarray

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(indices=False)[源代码]

返回选择掩码;indices=True 时返回选中列位置。

参数:

indices (bool)

返回类型:

ndarray

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() 方法时

返回类型:

SelectionReportCollector

参考样例

>>> 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)[源代码]

基类:BaseFeatureSelector

类型筛选器.

按数据类型筛选特征。 可以按包含类型或排除类型进行筛选。

参数

参数:
  • 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)[源代码]

基类:BaseFeatureSelector

正则表达式筛选器.

按特征名称的正则表达式匹配筛选特征。

参数

参数:
  • 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)[源代码]

基类:BaseFeatureSelector

缺失率筛选器.

移除缺失率高于阈值的特征。 用于过滤掉数据质量较差的特征。

参数

参数:
  • 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)[源代码]

基类:BaseFeatureSelector

单一值筛选器.

移除众数占比高于阈值的特征。 用于过滤掉取值过于集中、区分度低的特征。

参数

参数:
  • 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)[源代码]

基类:BaseFeatureSelector

基数筛选器.

移除基数高于阈值的类别型特征。 高基数特征可能导致过拟合和计算问题。

参数

参数:
  • 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)[源代码]

基类:BaseFeatureSelector

方差筛选器.

移除方差低于阈值的特征。 常用于移除常量特征或近似常量特征。

参数

参数:
  • 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 VarianceThresholdhttps://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)[源代码]

基类:BaseFeatureSelector

相关性筛选器.

移除与其它特征相关性高于阈值的特征。 当两个特征高度相关时,保留指定指标(默认 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)[源代码]

基类:BaseFeatureSelector

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 Modelshttps://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)[源代码]

基类:BaseFeatureSelector

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.02

  • regularization (float) -- 计算 WOE/IV 时的加性平滑系数,避免某类别好/坏样本数为 0 导致取对数发散,默认为 1.0

  • binner (Any | None) -- 可选的已配置分箱器实例。未训练实例会自动训练,已训练实例直接复用

  • binning_params (Dict[str, Any] | None) -- 可选的 OptimalBinning 构造参数字典。未传 binner 时, 内部创建分箱器并将原始数据转换为分箱 index 后计算 IV

  • target (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)为业界通行标准。

get_iv_interpretation()[源代码]

获取IV值的中文解释。

返回:

包含IV值及解释的DataFrame

返回类型:

DataFrame

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)[源代码]

基类:BaseFeatureSelector

LIFT筛选器.

使用LIFT@ratio值筛选特征,支持找坏人、找好人、自动三种方向模式。 LIFT衡量特征在头部覆盖率下对目标群体的提升程度。

LIFT@ratio% 计算方式

  1. 将样本按特征值排序

  2. 取头部 ratio 比例的样本

  3. 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)[源代码]

基类:BaseFeatureSelector

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)[源代码]

基类:BaseFeatureSelector

特征重要性筛选器.

使用模型的特征重要性进行筛选。 支持任意有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 SelectFromModelhttps://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)[源代码]

基类:BaseFeatureSelector

零重要性筛选器.

使用 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)[源代码]

基类:BaseFeatureSelector

递归特征消除筛选器.

通过递归方式逐步剔除最不重要的特征。 适用于任何有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 RFE https://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)[源代码]

基类:BaseFeatureSelector

逐步特征筛选器.

使用前向或后向逐步选择选择最优特征子集。 前向选择:从空集开始,逐步添加最有价值的特征 后向消除:从所有特征开始,逐步剔除最无价值的特征

参数

参数:
  • 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 SequentialFeatureSelectorhttps://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)[源代码]

基类:BaseFeatureSelector

逐步回归特征筛选器.

使用逐步回归方法进行特征筛选,支持前向、后向和双向选择策略。 基于统计准则(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

get_history_df()[源代码]

获取逐步回归历史的DataFrame格式。

返回:

包含历史记录的DataFrame

返回类型:

DataFrame

method_name = '逐步回归筛选'
summary()[源代码]

生成筛选结果摘要。

返回:

摘要文本

返回类型:

str

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)[源代码]

基类:BaseFeatureSelector

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)[源代码]

基类:BaseFeatureSelector

互信息筛选器.

使用互信息(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)[源代码]

基类:BaseFeatureSelector

卡方筛选器.

使用卡方检验评估特征与目标变量的独立性。 适用于分类问题和非负特征。

卡方值解释: - 值越大: 特征与目标变量越相关

参数

参数:
  • threshold (float) -- 得分阈值,默认为0.0

  • k (int | str) -- 保留的特征数,默认为'all'

  • missing (float | int | str | None | bool) -- 缺失值处理方式。数值则直接填充;字符串 'mean'/'min'/'max' 按列统计量填充; NoneFalse 则删除含缺失值的行。默认为 -99.0

  • 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 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/填充策略处理);kthreshold 同时生效——先按得分阈值过滤,再取前 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)[源代码]

基类:BaseFeatureSelector

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)[源代码]

基类:BaseFeatureSelector

稳定性感知筛选器.

综合考虑特征区分力(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 的定义与阈值分别见 IVSelectorPSISelector

引用

IV / PSI 用于评分卡变量筛选与稳定性监控见 Siddiqi, N. (2006). Credit Risk Scorecards. Wiley。

get_detail()[源代码]

获取所有特征的 IV / PSI / 综合评分明细.

返回:

DataFrame,含 IV、PSI、综合评分、是否入选

返回类型:

DataFrame

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)[源代码]

基类:BaseFeatureSelector

评分卡风格特征粗筛器.

按如下顺序执行特征筛选:

  1. 缺失率筛选(NullSelector)

  2. IV值筛选(IVSelector)

  3. 相关性筛选(CorrSelector)

  4. 单一值筛选(ModeSelector)

与 scorecardpipeline.FeatureSelection 的思路一致, 但参数命名和基础行为遵循 hscredit 风格:

  • 缺失率阈值使用 null_threshold

  • IV阈值使用 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)

返回类型:

ScorecardFeatureSelection

get_selection_report()[源代码]

获取包含阶段明细的筛选报告。

返回类型:

Dict[str, Any]

method_name = '评分卡特征粗筛'
transform(X)[源代码]

根据筛选结果转换数据。

参数:

X (DataFrame | ndarray | List[str])

返回类型:

DataFrame | ndarray | List[str]

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)[源代码]

基类:BaseFeatureSelector

组合特征筛选器.

将多个筛选器组合在一起,按顺序执行筛选。后续筛选器基于前面筛选器的结果进行筛选。 支持通过 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_)
...
get_selection_report_df()[源代码]

获取详细的 DataFrame 格式报告,穿透底层筛选器。

记录每一步具体的筛选情况和筛选原因,包括每个特征在各阶段的状态变化、 被剔除的原因和具体数值指标、以及每个子筛选器的详细信息。

返回 DataFrame 列说明

  • 状态 (str): 报告生成状态,未拟合时为 '未拟合'

  • message (str): 状态消息,未拟合时为 '请先调用fit方法'

未拟合时返回包含状态和消息的单行 DataFrame。

返回:

详细的筛选报告 DataFrame

返回类型:

DataFrame