news 2026/11/1 17:03:27

day32

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
day32

ROC 曲线:评估模型在 “正负样本不平衡” 时的整体区分能力(比如疾病检测中,患病样本极少),对负样本数量不敏感;
PR 曲线:更关注 “正样本的识别效果”(比如推荐系统中,精准推荐给用户的比例),适合正负样本差距大、重视正样本召回的场景。@浙大疏锦行
今日作业:

对于信贷数据,仔细观察每个模型的评估指标,并且打印他们的roc和pr曲线,从今天课上的视角去理解他们的能力

# 先运行之前预处理好的代码 import pandas as pd import pandas as pd #用于数据处理和分析,可处理表格数据。 import numpy as np #用于数值计算,提供了高效的数组操作。 import matplotlib.pyplot as plt #用于绘制各种类型的图表 import seaborn as sns #基于matplotlib的高级绘图库,能绘制更美观的统计图形。 import warnings warnings.filterwarnings("ignore") # 设置中文字体(解决中文显示问题) plt.rcParams['font.sans-serif'] = ['SimHei'] # Windows系统常用黑体字体 plt.rcParams['axes.unicode_minus'] = False # 正常显示负号 data = pd.read_csv(r"C:\Users\zhang\Desktop\【疏】机器学习资料\项目类\项目一信贷风险预测\data.csv") #读取数据 # 先筛选字符串变量 discrete_features = data.select_dtypes(include=['object']).columns.tolist() # Home Ownership 标签编码 home_ownership_mapping = { 'Own Home': 1, 'Rent': 2, 'Have Mortgage': 3, 'Home Mortgage': 4 } data['Home Ownership'] = data['Home Ownership'].map(home_ownership_mapping) # Years in current job 标签编码 years_in_job_mapping = { '< 1 year': 1, '1 year': 2, '2 years': 3, '3 years': 4, '4 years': 5, '5 years': 6, '6 years': 7, '7 years': 8, '8 years': 9, '9 years': 10, '10+ years': 11 } data['Years in current job'] = data['Years in current job'].map(years_in_job_mapping) # Purpose 独热编码,记得需要将bool类型转换为数值 data = pd.get_dummies(data, columns=['Purpose']) data2 = pd.read_csv(r"C:\Users\zhang\Desktop\【疏】机器学习资料\项目类\项目一信贷风险预测\data.csv") # 重新读取数据,用来做列名对比 list_final = [] # 新建一个空列表,用于存放独热编码后新增的特征名 for i in data.columns: if i not in data2.columns: list_final.append(i) # 这里打印出来的就是独热编码后的特征名 for i in list_final: data[i] = data[i].astype(int) # 这里的i就是独热编码后的特征名 # Term 0 - 1 映射 term_mapping = { 'Short Term': 0, 'Long Term': 1 } data['Term'] = data['Term'].map(term_mapping) data.rename(columns={'Term': 'Long Term'}, inplace=True) # 重命名列 continuous_features = data.select_dtypes(include=['int64', 'float64']).columns.tolist() #把筛选出来的列名转换成列表 # 连续特征用中位数补全 for feature in continuous_features: mode_value = data[feature].mode()[0] #获取该列的众数。 data[feature].fillna(mode_value, inplace=True) #用众数填充该列的缺失值,inplace=True表示直接在原数据上修改。 # 最开始也说了 很多调参函数自带交叉验证,甚至是必选的参数,你如果想要不交叉反而实现起来会麻烦很多 # 所以这里我们还是只划分一次数据集 from sklearn.model_selection import train_test_split X = data.drop(['Credit Default'], axis=1) # 特征,axis=1表示按列删除 y = data['Credit Default'] # 标签 # 按照8:2划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 80%训练集,20%测试集 # --- 导入必要的库 --- from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score from sklearn.metrics import classification_report, confusion_matrix from sklearn.metrics import roc_curve, auc, precision_recall_curve, average_precision_score import lightgbm as lgb # --- 1. LightGBM 模型 --- print("--- 1. LightGBM 模型 ---") lgb_model = lgb.LGBMClassifier( random_state=42, n_estimators=100, learning_rate=0.1, max_depth=6, subsample=0.8, colsample_bytree=0.8 ) lgb_model.fit(X_train, y_train) lgb_pred = lgb_model.predict(X_test) lgb_pred_proba = lgb_model.predict_proba(X_test)[:, 1] # 获取正类的概率 print("\nLightGBM 在测试集上的分类报告:") print(classification_report(y_test, lgb_pred)) print("LightGBM 在测试集上的混淆矩阵:") print(confusion_matrix(y_test, lgb_pred)) # --- 2. 绘制 ROC 曲线和 PR 曲线 --- print("\n--- 2. 模型评估曲线 ---") # 创建子图 fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6)) # ROC 曲线 fpr, tpr, thresholds = roc_curve(y_test, lgb_pred_proba) roc_auc = auc(fpr, tpr) ax1.plot(fpr, tpr, color='darkorange', lw=2, label=f'LightGBM ROC curve (AUC = {roc_auc:.4f})') ax1.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--', label='Random Classifier') ax1.set_xlim([0.0, 1.0]) ax1.set_ylim([0.0, 1.05]) ax1.set_xlabel('False Positive Rate') ax1.set_ylabel('True Positive Rate') ax1.set_title('ROC Curve - LightGBM') ax1.legend(loc="lower right") ax1.grid(True) # PR 曲线 precision, recall, _ = precision_recall_curve(y_test, lgb_pred_proba) average_precision = average_precision_score(y_test, lgb_pred_proba) ax2.plot(recall, precision, color='green', lw=2, label=f'LightGBM PR curve (AP = {average_precision:.4f})') # 计算随机分类器的PR曲线(正类比例) positive_ratio = y_test.mean() ax2.axhline(y=positive_ratio, color='red', linestyle='--', label=f'Random Classifier (AP = {positive_ratio:.4f})') ax2.set_xlim([0.0, 1.0]) ax2.set_ylim([0.0, 1.05]) ax2.set_xlabel('Recall') ax2.set_ylabel('Precision') ax2.set_title('Precision-Recall Curve - LightGBM') ax2.legend(loc="lower left") ax2.grid(True) plt.tight_layout() plt.show() # --- 3. 输出详细的性能指标 --- print(f"\n--- LightGBM 详细性能指标 ---") print(f"准确率 (Accuracy): {accuracy_score(y_test, lgb_pred):.4f}") print(f"精确率 (Precision): {precision_score(y_test, lgb_pred):.4f}") print(f"召回率 (Recall): {recall_score(y_test, lgb_pred):.4f}") print(f"F1分数: {f1_score(y_test, lgb_pred):.4f}") print(f"AUC分数: {roc_auc:.4f}") print(f"平均精度 (Average Precision): {average_precision:.4f}") # --- 4. 特征重要性可视化 --- print("\n--- 3. 特征重要性 ---") feature_importance = pd.DataFrame({ 'feature': X.columns, 'importance': lgb_model.feature_importances_ }).sort_values('importance', ascending=False) plt.figure(figsize=(12, 8)) # 只显示前20个最重要的特征 top_features = feature_importance.head(20) sns.barplot(data=top_features, x='importance', y='feature') plt.title('LightGBM - Top 20 Feature Importance') plt.xlabel('Feature Importance') plt.tight_layout() plt.show() print("\n前10个最重要的特征:") print(top_features.head(10))

@z浙大疏锦行

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/1 7:25:02

Spark与Prophecy综合比较推荐Prophecy的理由

一、概述在选择ETL平台时&#xff0c;原生Spark代表了技术上的纯粹性和最大控制力&#xff0c;适合有深厚技术积累的团队&#xff1b;而Prophecy低代码平台则致力于在不牺牲底层能力的前提下&#xff0c;通过可视化、AI辅助和工程化协作&#xff0c;大幅提升开发效率和团队赋能…

作者头像 李华
网站建设 2026/11/1 7:54:30

WinForm 中依赖注入详解:从理论到项目实战

前言 随着软件系统日益复杂&#xff0c;良好的架构设计成为保障项目可维护性、可测试性和扩展性的关键。在开发实践中&#xff0c;依赖注入(Dependency Injection, DI) 已成为解耦组件、提升代码可测试性和实现模块化设计的重要手段之一。 尽管 WinForm是一个相对传统的桌面应用…

作者头像 李华
网站建设 2026/11/1 10:44:05

春联生成模型-中文-base prompt工程:从C语言基础中学习结构化思维

春联生成模型-中文-base prompt工程&#xff1a;从C语言基础中学习结构化思维 春节临近&#xff0c;想用AI模型生成一副应景又工整的春联&#xff0c;却发现结果要么对仗不工整&#xff0c;要么意境不搭&#xff0c;要么干脆跑题了&#xff1f;这可能是你的“指令”——也就是…

作者头像 李华
网站建设 2026/10/21 17:32:10

M2LOrder开源镜像安全审计:已扫描CVE-2023-XXXX等高危漏洞并修复

M2LOrder开源镜像安全审计&#xff1a;已扫描CVE-2023-XXXX等高危漏洞并修复 1. 项目概述与安全背景 M2LOrder是一个基于.opt模型文件的情绪识别与情感分析服务&#xff0c;提供HTTP API和WebUI两种访问方式。作为开源AI服务&#xff0c;其安全性直接关系到用户数据保护和系统…

作者头像 李华
网站建设 2026/10/21 16:55:07

快速体验SenseVoiceSmall:支持中文、英文、日语等5种语言的语音识别

快速体验SenseVoiceSmall&#xff1a;支持中文、英文、日语等5种语言的语音识别 1. 引言&#xff1a;当语音识别开始“读心” 想象一下&#xff0c;你正在听一段客服录音。传统的语音转文字工具告诉你&#xff1a;“你们的服务太差了”。这只是一个冰冷的文字记录。但如果有一…

作者头像 李华