如何在Python中寻找识别fraud_label的最优阈值规则?
寻找最优欺诈识别规则的Python实现方案
核心思路
通过遍历特征阈值组合,计算每个组合对应的精确率、召回率及综合指标(如F1-score),最终筛选出符合需求的最优(X,Y)阈值对。这种方法直接针对你需要的规则形式,比黑盒模型更直观可控。
具体实现步骤
1. 数据准备与预处理
假设你的数据集是pandas.DataFrame格式,先确保标签fraud_label为0(非欺诈)和1(欺诈)的二分类形式,分离出目标特征和标签:
import pandas as pd from sklearn.metrics import precision_score, recall_score, f1_score # 加载数据集(替换为你的数据路径) df = pd.read_csv("your_dataset.csv") # 分离特征和标签 X = df[["number_of_site_visits", "external_fraud_score"]] y = df["fraud_label"]
2. 生成候选阈值范围
为避免遍历所有可能值(效率太低),可以基于特征的分位数生成候选阈值,比如取5%到95%的分位数,步长为1%:
# 生成number_of_site_visits的候选阈值X(取分位数,从小到大) x_candidates = X["number_of_site_visits"].quantile(q=[i/100 for i in range(5, 96)]).unique() x_candidates.sort() # 生成external_fraud_score的候选阈值Y(取分位数,从大到小) y_candidates = X["external_fraud_score"].quantile(q=[i/100 for i in range(5, 96)]).unique() y_candidates.sort(reverse=True)
3. 遍历阈值组合并计算指标
遍历所有候选(X,Y)对,计算每个组合对应的精确率、召回率和F1-score,存储结果:
# 存储所有阈值组合的指标 results = [] for x_thresh in x_candidates: for y_thresh in y_candidates: # 生成预测标签:满足条件则为1,否则为0 y_pred = ((X["number_of_site_visits"] < x_thresh) & (X["external_fraud_score"] > y_thresh)).astype(int) # 计算指标(注意处理全0预测的情况,避免除以0错误) precision = precision_score(y, y_pred, zero_division=0) recall = recall_score(y, y_pred, zero_division=0) f1 = f1_score(y, y_pred, zero_division=0) results.append({ "x_thresh": x_thresh, "y_thresh": y_thresh, "precision": precision, "recall": recall, "f1": f1 }) # 转换为DataFrame方便查看 results_df = pd.DataFrame(results)
4. 筛选最优阈值组合
根据你的需求选择最优组合:
- 如果追求综合性能:选择F1-score最高的组合
- 如果优先精确率:在召回率满足最低要求的前提下,选精确率最高的组合
- 如果优先召回率:在精确率满足最低要求的前提下,选召回率最高的组合
示例代码(以最大F1-score为例):
# 找到F1最高的组合 best_rule = results_df.loc[results_df["f1"].idxmax()] print(f"最优规则:当number_of_site_visits < {best_rule['x_thresh']} 且 external_fraud_score > {best_rule['y_thresh']}") print(f"对应的精确率:{best_rule['precision']:.2f},召回率:{best_rule['recall']:.2f},F1-score:{best_rule['f1']:.2f}")
优化建议
- 减少计算量:如果特征值是整数,可以直接取unique值排序后遍历,不用分位数;或者扩大分位数步长(比如5%步长)先快速定位大致范围,再在小范围内细化。
- 处理类别不平衡:如果欺诈样本占比极低,可以给召回率更高的权重,比如自定义综合指标(如
0.7*recall + 0.3*precision)来筛选。 - 验证稳定性:可以用交叉验证,将数据集分成训练集和验证集,只在训练集上找阈值,再在验证集上验证效果,避免过拟合。
内容的提问来源于stack exchange,提问作者On D Hunt
相关产品推荐
相关产品推荐

