当前位置: 首页 > news >正文

混淆矩阵在金融领域白话解说

比如 我做金融标签是0,1,2,比如0是不涨不跌的状态,1是上涨,2是下跌,因为是做趋势,那么1,2要查得准,而且要查全,那么这个混淆矩阵最重视的指标有哪些?

非常好,这是一个非常实际且典型的金融多分类问题。基于你的需求——“1,2要查得准,而且要查全”,我们来分析最优的指标。

你的场景核心是:同时关注“上涨”和“下跌”两个趋势类别的精确率和召回率。而“不涨不跌”的0状态可能不是你的主要兴趣点。

核心结论

对于你的三分类问题(0, 1, 2),最优的评估策略是:

  1. 摒弃单一的准确率,因为它会被大量的“0”类样本主导,从而掩盖模型在1类和2类上的真实表现。
  2. 重点关注每个类别的精确率和召回率,尤其是1类和2类。
  3. 使用宏平均F1分数作为核心的总体评估指标,因为它平等地看待每一个类别,符合你同时关注1和2的需求。
  4. 可视化混淆矩阵,直观地检查主要的错误来源。

详细指标分析与选择

1. 按类别分析 - 这是你的首要关注点

你需要将三分类问题分解为三个独立的二分类问题来看待(分别对于类别0,1,2)。为每个类别计算其精确率和召回率。

  • 对于“上涨”类别

    • 精确率:在所有被预测为“上涨”的股票中,真正上涨的比例。这直接对应你的“查得准”需求。
    • 召回率:在所有真正上涨的股票中,被模型成功找出来的比例。这直接对应你的“查得全”需求。
  • 对于“下跌”类别

    • 同样,分别关注其精确率召回率

如何行动:在代码中(如使用Python的sklearn库),生成classification_report,它会自动为你输出每个类别的精确率、召回率和F1分数。

2. 整体评估 - 宏平均F1分数

当你需要用一个数字来概括模型在所有类别上的整体性能时,宏平均F1分数是最适合你需求的指标。

  • 宏平均F1
    • 计算方式:先独立计算类别0、类别1、类别2的F1分数,然后对这三个F1分数求算术平均值。
    • 为什么它最优
      • 平等地对待每一个类别。无论类别0的样本有多少,它的F1分数和类别1、2的F1分数在最终平均时权重是一样的。
      • 这完美符合你的业务逻辑:你明确关心1和2的表现。如果使用会被大类主导的微平均F1,那么类别0(通常样本最多)会淹没1和2的表现。
      • 一个高的宏平均F1分数意味着模型在所有三个类别上都表现均衡且良好,特别是保证了1和2这两个关键类别也有好的F1分数。
3. 可视化工具 - 混淆矩阵

一定要绘制并分析归一化的混淆矩阵

  • 它能告诉你什么
    • 模型最主要的混淆发生在哪里?
    • 上涨被误判为不涨不跌下跌的比例高吗?(这影响召回率)
    • 下跌被误判为上涨的比例高吗?(这影响精确率,可能导致做错方向)
    • 大部分样本是否都被模型简单地预测为“0”?

实战步骤建议

  1. 训练模型后,首先绘制归一化的混淆矩阵,获得第一直观印象。
  2. 打印 classification_report,仔细查看precisionrecall列,重点关注12类的数值。
  3. 记录并对比不同模型的 macro avg 下的 f1-score,用它作为选择最终模型的核心依据。

示例:classification_report 解读

假设你得到如下报告:

              precision    recall  f1-score   support0       0.85      0.90      0.87      10001       0.75      0.60      0.67       3002       0.80      0.70      0.75       250accuracy                           0.82      1550macro avg       0.80      0.73      0.76      1550
weighted avg       0.82      0.82      0.82      1550

你的分析重点应该是:

  • 类别1(上涨):精确率0.75(尚可),但召回率只有0.60(偏低)。说明很多上涨趋势没被抓住(查得不够全)。
  • 类别2(下跌):精确率0.80(不错),召回率0.70(有提升空间)。
  • 宏平均F1:0.76。这是你优化模型时要努力提升的核心指标。
  • 准确率:0.82,看看就好,因为它主要由类别0的高性能所贡献。

总结

对于你的金融趋势预测(0,1,2)三分类问题:

优先级推荐指标目的
1类别1、2的精确率和召回率直接评估核心业务需求,确保“上涨”和“下跌”趋势预测得准且全。
2宏平均F1分数作为模型选择和调优的单一核心指标,因为它公平地对待了你关心的1和2类别。
3归一化混淆矩阵进行错误诊断,理解模型在哪里犯错,以便有针对性地改进。
4准确率仅作参考,不要作为决策依据

通过这套组合指标,你可以全面、准确地评估模型在金融趋势预测上的真实性能。

指标理论解析

好的,我们来详细讲解一下混淆矩阵及其相关的评估指标。这是机器学习和数据科学中评估分类模型性能的核心工具。

1. 什么是混淆矩阵?

混淆矩阵是一个表格,用于总结分类模型的预测结果,并将预测值与实际值进行对比。对于二分类问题,它是一个 2x2 的矩阵,结构如下:

预测为正例 (Positive)预测为负例 (Negative)
实际为正例 (Positive)真正例 (TP)假负例 (FN)
实际为负例 (Negative)假正例 (FP)真负例 (TN)

四个基本术语的解释:

  • 真正例 (True Positive, TP): 模型正确预测为正例的样本。实际是正例,预测也是正例。
    • 例子: 病人确实生了病,模型也判断为“生病”。
  • 假负例 (False Negative, FN): 模型错误预测为负例的样本。实际是正例,但预测成了负例。
    • 例子: 病人确实生了病,但模型错误地判断为“健康”。(这是非常危险的错误)
  • 假正例 (False Positive, FP): 模型错误预测为正例的样本。实际是负例,但预测成了正例。
    • 例子: 病人实际健康,但模型错误地判断为“生病”。(这会造成不必要的恐慌和检查)
  • 真负例 (True Negative, TN): 模型正确预测为负例的样本。实际是负例,预测也是负例。
    • 例子: 病人实际健康,模型也判断为“健康”。

核心思想:

  • True/False 表示模型的预测是正确还是错误
  • Positive/Negative 表示模型的预测结果

2. 从混淆矩阵衍生出的评估指标

仅仅知道 TP, FP, FN, TN 的个数还不够直观,我们需要通过这些数值计算出更有意义的指标。

2.1 准确率
  • 定义:所有预测正确的样本(TP+TN)占总样本(TP+TN+FP+FN)的比例。
  • 公式Accuracy = (TP + TN) / (TP + TN + FP + FN)
  • 解读:模型整体上的正确率。
  • 优点:直观,易于理解。
  • 缺点在数据不平衡的数据集上,准确率会失真
    • 例子: 一个数据集中有95%的负样本和5%的正样本。即使一个模型把所有样本都预测为负,它的准确率也能达到95%,但这个模型对于正样本的识别能力为0,是一个无用的模型。
2.2 精确率
  • 定义:在所有被模型预测为正例的样本中,实际也是正例的比例。
  • 公式Precision = TP / (TP + FP)
  • 解读:衡量模型的“宁缺毋滥”程度。它关注的是预测结果的精准度
  • 应用场景:在那些“误报成本很高”的场景中,精确率非常重要。
    • 例子: 垃圾邮件检测。如果把一封正常邮件误判为垃圾邮件(FP),用户可能会错过重要信息,这种代价很高。因此我们希望模型在判断为“垃圾”时,要有极高的把握,即精确率要高。
2.3 召回率
  • 定义:在所有实际为正例的样本中,模型成功预测出来的比例。
  • 公式Recall = TP / (TP + FN)
  • 解读:衡量模型的“宁错杀,不放过”程度。它关注的是找出所有正样本的能力
  • 应用场景:在那些“漏报成本很高”的场景中,召回率至关重要。
    • 例子: 疾病检测、欺诈检测。如果一个病人实际患病却被模型漏诊(FN),后果可能是致命的。因此我们希望尽可能找出所有真实的患者,即召回率要高。
2.4 F1分数
  • 问题:精确率和召回率通常是相互制约的。提高阈值,精确率会升高,但召回率会下降;降低阈值,召回率会升高,但精确率会下降。
  • 定义:F1分数是精确率和召回率的调和平均数。它试图找到一个平衡点。
  • 公式F1-Score = 2 * (Precision * Recall) / (Precision + Recall)
  • 解读:F1分数综合考虑了精确率和召回率。它的取值范围是 [0, 1],1是最好值。当精确率和召回率都高时,F1分数才会高。
  • 应用场景:当你需要在精确率和召回率之间寻求一个平衡时,或者当数据分布不平衡时,F1是比准确率更好的指标。

3. 综合示例

假设我们有一个用于检测癌症(正例=患癌,负例=健康)的模型,在100个样本上的预测结果如下:

预测:患癌预测:健康
实际:患癌TP = 1FN = 9
实际:健康FP = 0TN = 90

计算各项指标:

  1. 准确率 = (TP + TN) / All = (1 + 90) / 100 = 91%
    • 看起来很高,但这个模型只找出了1个病人,漏掉了9个!
  2. 精确率 = TP / (TP + FP) = 1 / (1 + 0) = 100%
    • 所有被模型诊断为患癌的人,都确实患癌了,没有误诊。
  3. 召回率 = TP / (TP + FN) = 1 / (1 + 9) = 10%
    • 所有真实的癌症患者中,模型只找出了10%,漏掉了90%!这是一个非常糟糕的模型。
  4. F1分数 = 2 * (1.0 * 0.1) / (1.0 + 0.1) ≈ 0.181
    • 很低的F1分数,反映了模型综合性能很差。

从这个例子可以看出:

  • 单纯看91%的准确率会严重误导。
  • 在这个医疗场景下,召回率远比精确率重要,因为我们不能漏掉病人。这个模型召回率极低,是完全不可接受的。

总结

指标公式关注点核心问题适用场景
准确率(TP+TN) / Total整体预测正确率模型预测对了多少?数据平衡时,快速评估
精确率TP / (TP+FP)预测结果的准确性在预测为正例的样本中,有多少是真的?注重降低误报(FP),如垃圾邮件检测、推荐系统
召回率TP / (TP+FN)找出正例的能力在真实的正例中,我们找出了多少?注重降低漏报(FN),如疾病检测、欺诈检测
F1分数2 * (P * R) / (P + R)精确率和召回率的平衡模型的综合表现如何?数据不平衡,或需要平衡P和R时

在选择评估指标时,一定要结合具体的业务场景和代价,没有放之四海而皆准的“最佳指标”。

kaggle 信用卡欺诈检测

(1)在此项目中,我们首选对数据进行了观察,发现了其中样本不均衡的问题,其实我们做任务工作之前都一定要先进行数据检查,看看数据有什么问题,针对这些问题来选择解决方案。
(2)这里我们提出了两种方法,下采样和过采样,两条路线来进行对比实验,任何实际问题来了之后,我们都不会一条路走到黑的,没有对比就没有伤害,通常都会得到一个基础模型,然后对各种方法进行对比,找到最合适的,所以在任务开始之前,一定得多动脑筋多一手准备,得到的结果才有可选择的余地。
(3)在建模之前,需要对数据进行各种预处理的操作,比如数据标准化,缺失值填充等,这些都是必要操作,由于数据本身已经给定了特征,此处我们还没有提到特征工程这个概念,后续实战中我们会逐步引入,其实数据预处理的工作是整个任务中最为最重也是最苦的一个阶段,数据处理的好不好对结果的影响是最大的。
(4)先选好评估方法,再进行建模。建模的目的就是为了得到结果,但是我们不可能一次就得到最好的结果,肯定要尝试很多次,所以一定得有一个合适的评估方法,可以用这些通用的,比如Recall,准确率等,也可以根据实际问题自己指定评估指标。
(5)选择合适的算法,这里我们使用的是逻辑回归,也详细分析了其中的细节,这是因为我们刚刚讲解完逻辑回归的原理就拿它来练手了,之后我们还会讲解其他算法,并不一定非要用逻辑回归来完成这个任务,其他算法可能效果会更好。但是有一点我希望大家能够理解就是在机器学习中并不是越复杂的算法越实用,恰恰相反,越简单的算法反而应用的越广泛。逻辑回归就是其中一个典型的代表了,简单实用,所以任何分类问题都可以把逻辑回归当做一个待比较的基础模型了。
(6)模型的调参也是很重要的,之前我们通过实验也发现了不同的参数可能会对结果产生较大的影响,这一步也是必须的,后续实战内容我们还会来强调调参的细节,这里就简单概述一下了。对于参数我建立大家在使用工具包的时候先看看其API文档,知道每一个参数的意义,再来实验选择合适的参数值。
(7)得到的结果一定要和实际任务结合在一起,有时候虽然得到的结果指标还不错,但是实际应用却成了问题,所以测试环节也是必不可少的。到此,这个项目就给大家介绍到这里了,在实践中学习才能成长的更快,建议大家一定使用提供的Notebook代码文件来自己完成一遍上述操作。

kaggle信用卡欺诈代码

%%capture
!pip install duckdb
import sys
import os
import gcimport warnings
warnings.filterwarnings('ignore')import random
from pathlib import Path
import numpy as np
import pandas as pd
import polars as pl
import duckdbimport lightgbm as lgb
import xgboost as xgb
import catboost as catfrom sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import roc_auc_score, accuracy_score
from scipy.stats import ks_2sampfrom plotly import * import duckdb
duckdb.query('PRAGMA disable_progress_bar;')RANDOM_STATE = 1966
def seed_everything(seed):random.seed(seed)np.random.seed(seed)
seed_everything(RANDOM_STATE)class Shhh:def __enter__(self):self._original_stdout = sys.stdoutself._original_stderr = sys.stderrsys.stdout = open(os.devnull, 'w')sys.stderr = open(os.devnull, "w")def __exit__(self, exc_type, exc_val, exc_tb):sys.stdout = self._original_stdoutsys.stderr = self._original_stderr%matplotlib inline
%config InlineBackend.figure_format='retina'pd.set_option('display.max_columns', 100)
pd.set_option('display.max_rows', 100)BASEPATH = '/kaggle/input/optimizingdefaultmodelbyfirstpaymentdefault/'df = duckdb.sql(f"""CREATE OR REPLACE TEMPORARY TABLE eng_table ASSELECT*FROM read_csv_auto('{BASEPATH}kaggle_dataset.csv');SELECT * FROM eng_table;
""").df()df.head(10)for col in df.columns:if df[col].dtype in [np.float64, np.int64]:df[col].fillna(df[col].median(), inplace=True)else:df[col].fillna(df[col].mode()[0], inplace=True)X = df.drop(['target', 'ID'], axis=1)
y = df['target']
param_grid = {'max_depth': [None, 5, 10, 15],'min_samples_split': [2, 5, 10],'min_samples_leaf': [1, 2, 4],'max_leaf_nodes': [None, 10, 20, 30]
}dtree = DecisionTreeClassifier(random_state=42)
grid_search = GridSearchCV(dtree, param_grid, cv=3, scoring='accuracy')
grid_search.fit(X, y)print("best hyperparameter:", grid_search.best_params_)fit_model = DecisionTreeClassifier(max_depth=None,min_samples_split=2,random_state=42
)
fit_model.fit(X, y)y_proba = fit_model.predict_proba(X)[:, 1]
y_pred = (y_proba >= 0.5).astype(int)roc_auc = roc_auc_score(y, y_proba)
accuracy = accuracy_score(y, y_pred)
ks_stat, _ = ks_2samp(y_proba[y == 1], y_proba[y == 0])print("ROC AUC Score:", roc_auc)
print("Accuracy:", accuracy)
print("Kolmogorov-Smirnov (KS) Score:", ks_stat)
df_output = df[['ID']].copy()
df_output['target_predicted'] = y_pred
df_output.to_csv('output_newbyy.csv', index=False)
http://www.dtcms.com/a/469186.html

相关文章:

  • 深耕金融调研领域,用科学调研破解银行服务困境(市场调研)
  • 未备案网站处理系统写作墨问题 网站
  • 【Linux】手搓日志(附源码)
  • Excel 下拉选项设置 级联式
  • pycharm自动化测试初始化
  • nacos3.0.4升级到3.1.0
  • linux入门5.5(高可用)
  • JAVA·数组的定义与使用
  • Transformer 面试题及详细答案120道(81-90)-- 性能与评估
  • 可以做软件的网站有哪些功能中国新闻社待遇
  • 【鉴权架构】SpringBoot + Sa-Token + MyBatis + MySQL + Redis 实现用户鉴权、角色管理、权限管理
  • 三星S25Ultra/S24安卓16系统Oneui8成功获取完美root权限+LSP框架
  • ffmpeg 播放视频 暂停
  • 老题新解|大整数的因子
  • Eureka的自我保护机制
  • 探索颜色科学:从物理现象到数字再现
  • AirSim_SimJoyStick
  • 第五部分:VTK高级功能模块(第149章 Remote模块 - 远程模块类)
  • 道可云人工智能每日资讯|《政务领域人工智能大模型部署应用指引》发布
  • 自己做网站哪家好win10 wordpress安装教程视频
  • wordpress整体搬迁宁波seo深度优化平台有哪些
  • 4K Wallpaper mac v2.7.dmg 安装教程(Mac电脑详细安装步骤4K壁纸Mac下载安装)
  • Mac 软件出现「应用程序“xxx”不能打开」的解决办法
  • 东航集团客户网站是哪家公司建设4k高清视频素材网站
  • Compose 在Row、Column上使用focusRestorer修饰符失效原因
  • Sora 2:当AI视频“以假乱真”,内容创作进入新纪元,体验AI创作能力
  • 推荐一个浏览器代理插件(Tajang Proxy),支持Chrome和Edge
  • conda|如何通过命令行在mac上下载conda
  • VS Code 二次开发:跨平台图标定制全攻略
  • 关于微信小程序开发几点总结