🎯 模块6:"最终项目:构建具有真实业务指标的欺诈检测系统"\n\n### 目标:\n在一个现实的综合性项目中应用所学的一切:从原始数据加载到用业务指标评估的模型,包括预处理、编码、缩放、特征选择和稳健验证。\n\n---\n\n### 6.1 项目数据集:欺诈交易.csv\n\n模拟特征:\n- 交易金额 (浮点数)\n- 客户年龄 (整数)\n- 卡片类型 (分类:"Visa"、"Mastercard"、"Amex")\n- 来源国家 (分类)\n- 一天中的时间 (整数 0-23)\n- 自上次交易以来的天数 (整数)\n- 是否欺诈 (布尔值:0或1) → 仅1.5%的欺诈!\n\n---\n\n### 6.2 阶段1:初始诊断和清理\n\npython\n# 加载和探索\ndf = pd.read_csv("欺诈交易.csv")\nprint(df.info())\nprint(df.isnull().sum())\n\n# 用中位数填充年龄,用众数填充卡片类型\ndf['客户年龄'].fillna(df['客户年龄'].median(), inplace=True)\ndf['卡片类型'].fillna(df['卡片类型'].mode()[0], inplace=True)\n\n# 使用IQR封顶交易金额\nQ1 = df['交易金额'].quantile(0.25)\nQ3 = df['交易金额'].quantile(0.75)\nIQR = Q3 - Q1\n下限, 上限 = Q1 - 1.5*IQR, Q3 + 1.5*IQR\ndf['交易金额'] = df['交易金额'].clip(下限, 上限)\n\n\n---\n\n### 6.3 阶段2:编码和缩放\n\npython\n# 编码\nfrom sklearn.preprocessing import LabelEncoder, OneHotEncoder\nfrom sklearn.compose import ColumnTransformer\n\n# 有序变量的标签编码(这里没有,但以防万一)\n# 名义分类变量的独热编码\n分类特征 = ['卡片类型', '来源国家']\n数值特征 = ['交易金额', '客户年龄', '一天中的时间', '自上次交易以来的天数']\n\n预处理器 = ColumnTransformer(\n transformers=[\n ('num', StandardScaler(), 数值特征),\n ('cat', OneHotEncoder(drop='first', handle_unknown='ignore'), 分类特征)\n ])\n\nX = df.drop('是否欺诈', axis=1)\ny = df['是否欺诈']\n\nX_处理后 = 预处理器.fit_transform(X)\n\n\n---\n\n### 6.4 阶段3:特征选择和训练\n\npython\nfrom sklearn.feature_selection import SelectKBest, f_classif\nfrom sklearn.model_selection import train_test_split, StratifiedKFold\nfrom sklearn.linear_model import LogisticRegression\n\n# 分割数据\nX_train, X_test, y_train, y_test = train_test_split(X_处理后, y, test_size=0.2, stratify=y, random_state=42)\n\n# 特征选择\n选择器 = SelectKBest(score_func=f_classif, k=10)\nX_train_选择 = 选择器.fit_transform(X_train, y_train)\nX_test_选择 = 选择器.transform(X_test)\n\n# 训练模型\n模型 = LogisticRegression(penalty='l2', C=1.0, random_state=42)\n模型.fit(X_train_选择, y_train)\n\n\n---\n\n### 6.5 阶段4:使用业务指标进行深度评估\n\npython\nfrom sklearn.metrics import classification_report, roc_auc_score, confusion_matrix\nimport seaborn as sns\n\ny_pred = 模型.predict(X_test_选择)\ny_proba = 模型.predict_proba(X_test_选择)[:,1]\n\nprint("=== 分类报告 ===")\nprint(classification_report(y_test, y_pred, target_names=['合法', '欺诈']))\n\nprint(f"\\nAUC-ROC: {roc_auc_score(y_test, y_proba):.4f}")\n\n# 混淆矩阵\ncm = confusion_matrix(y_test, y_pred)\nsns.heatmap(cm, annot=True, fmt='d', cmap='Blues',\n xticklabels=['合法', '欺诈'],\n yticklabels=['合法', '欺诈'])\nplt.title("混淆矩阵 - 欺诈检测")\nplt.ylabel("实际")\nplt.xlabel("预测")\nplt.show()\n\n# 交叉验证以获得置信度\ncv_scores = cross_val_score(模型, X_train_选择, y_train, cv=StratifiedKFold(5), scoring='roc_auc')\nprint(f"\\n交叉验证AUC-ROC: {cv_scores.mean():.4f} (+/- {cv_scores.std()*2:.4f})")\n\n\n---\n\n### 6.6 阶段5:调整阈值以最大化召回率\n\npython\nfrom sklearn.metrics import precision_recall_curve\n\n# 找到最大化F1或召回率的阈值\nprecision, recall, thresholds = precision_recall_curve(y_test, y_proba)\n\n# 为每个阈值计算F1\nf1_scores = 2 * (precision * recall) / (precision + recall)\nbest_threshold = thresholds[np.argmax(f1_scores)]\n\nprint(f"最佳F1阈值: {best_threshold:.3f}")\n\n# 使用新阈值进行预测\ny_pred_new = (y_proba >= best_threshold).astype(int)\n\nprint("\\n=== 使用调整后的阈值 ===")\nprint(classification_report(y_test, y_pred_new, target_names=['合法', '欺诈']))\n\n\n---\n\n### 📝 项目交付物:\n\n1. 记录所有阶段的Jupyter Notebook。\n2. 图表:初始分布、混淆矩阵、ROC曲线、精确率-召回率曲线。\n3. 比较表:0.5阈值与最佳阈值的指标对比。\n4. 书面结论:模型表现如何?在生产环境中您会优先考虑哪个指标,为什么?下一次迭代您会改进什么?\n\n---\n\n### 💡 课程最终笔记:\n\n✅ 预处理不是必要的邪恶——它是你的超能力。 \n✅ 在不平衡问题中永远不要相信准确性。使用AUC-ROC、召回率、F1。 \n✅ 分层交叉验证是构建稳健模型的盟友。 \n✅ 记录每一步。您的未来自己(和您的团队)会感谢您。 \n✅ 在生产环境中,不仅要监控准确性,还要监控您的数据分布。它会随时间漂移!

Course Info

Course: AI-course1

Language: ZH

Lesson: Module6