作为一名在金融科技领域摸爬滚打多年的从业者,我深知保险欺诈给行业带来的巨大损失。传统的人工审核方式不仅效率低下,还容易因主观判断导致误判。这个项目正是为了解决这一痛点,通过机器学习技术构建自动化欺诈检测系统。
项目采用Kaggle公开的汽车保险索赔数据集,包含1000条记录和69个特征。核心目标是训练分类模型,准确识别欺诈性索赔(fraud_reported=1)。不同于教科书式的示例,这个案例完整呈现了从数据清洗到模型部署的全流程,特别适合以下人群:
提示:虽然数据集规模不大,但特征工程和处理不平衡数据的技巧同样适用于大规模工业场景
项目采用经典的机器学习流水线设计:
code复制数据获取 → 探索性分析 → 特征工程 → 模型训练 → 评估优化 → 部署应用
选择Python生态工具链主要基于:
测试三种经典分类算法各有侧重:
实际业务中还需要考虑计算成本。随机森林虽然准确但耗时较长,而逻辑回归在实时预测场景更具优势
数据不平衡问题:欺诈样本仅占15%。我们采用:
特征相关性处理:
原始数据包含大量需要处理的脏数据:
python复制# 处理缺失值
df['witnesses'].fillna(0, inplace=True)
# 修正错误数据
df.loc[df['age']>100, 'age'] = df['age'].median()
# 处理异常索赔金额
Q1 = df['total_claim_amount'].quantile(0.25)
Q3 = df['total_claim_amount'].quantile(0.75)
df = df[~((df['total_claim_amount'] < (Q1 - 1.5*IQR)) |
(df['total_claim_amount'] > (Q3 + 1.5*IQR)))]
时间特征处理:
python复制# 将小时转换为周期性特征
df['incident_hour_sin'] = np.sin(2*np.pi*df['incident_hour_of_the_day']/24)
df['incident_hour_cos'] = np.cos(2*np.pi*df['incident_hour_of_the_day']/24)
分类变量编码优化:
通过随机森林的特征重要性筛选Top20特征:
code复制1. total_claim_amount 0.145
2. capital-gains 0.121
3. incident_hour_cos 0.098
4. age 0.087
5. witnesses 0.076
...
注意:删除低重要性特征后模型性能反而下降,最终保留全部特征但调整了采样策略
逻辑回归配置:
python复制lr = LogisticRegression(
class_weight='balanced',
max_iter=1000,
solver='saga'
)
决策树关键参数:
python复制dt = DecisionTreeClassifier(
max_depth=5,
min_samples_leaf=10,
class_weight='balanced'
)
随机森林优化点:
python复制rf = RandomForestClassifier(
n_estimators=200,
max_features='sqrt',
class_weight='balanced_subsample'
)
采用分层5折交叉验证确保每折的正负样本比例一致:
python复制skf = StratifiedKFold(n_splits=5)
for train_idx, test_idx in skf.split(X, y):
X_train, X_test = X.iloc[train_idx], X.iloc[test_idx]
y_train, y_test = y.iloc[train_idx], y.iloc[test_idx]
# 训练和评估...
| 算法 | 准确率 | 召回率(欺诈类) | F1-score | 训练时间(s) |
|---|---|---|---|---|
| 逻辑回归 | 0.84 | 0.62 | 0.71 | 1.2 |
| 决策树 | 0.81 | 0.58 | 0.68 | 0.8 |
| 随机森林 | 0.83 | 0.61 | 0.70 | 15.7 |
关键发现:
使用joblib保存pipeline对象,包含完整的预处理和模型:
python复制from sklearn.externals import joblib
pipeline = make_pipeline(
preprocessor, # 包含所有特征转换
best_model # 训练好的模型
)
joblib.dump(pipeline, 'fraud_detection.pkl')
python复制def predict_fraud(claim_data):
pipeline = joblib.load('fraud_detection.pkl')
proba = pipeline.predict_proba(claim_data)[:,1]
return proba > 0.5 # 返回布尔预测结果
假设系统部署后能:
实际应用中建议设置人工复核环节,对模型预测结果进行最终确认
问题1:初始的独热编码导致特征爆炸
问题2:SMOTE过采样后模型过拟合
特征工程深化:
模型层面改进:
系统化部署: