FSI

将模型预测的概率分为100个档次,落入一个档次的个数除以总数,得到档次百分比 两个数据集上档次百分比(a,b)代入以下公式: (a-b)*log(a/b) 极限为0,越相近越接近0,反之越大

请以lightgbm算法在breast_cancer数据集上的训练预测为例, 举例说明模型稳定性FSI的计算方法

LightGBM算法在breast_cancer数据集上的训练预测是一个典型的机器学习应用案例, 而模型稳定性FSI (通常指的是模型稳定性指标,而非流固耦合FSI,后者是工程领域的一个概念) 的计算则涉及到模型在实际应用中的表现一致性评估。 不过,直接计算模型稳定性的FSI指标并不常见, 更常见的是使用如PSI(Population Stability Index,群体稳定性指标)等来衡量模型稳定性。 由于FSI在模型稳定性评估中不是一个标准术语, 这里我将基于模型稳定性的通用概念,特别是PSI指标, 来说明如何在LightGBM模型上进行类似评估, 同时结合breast_cancer数据集的训练预测过程。 LightGBM在breast_cancer数据集上的训练预测 首先,简要概述LightGBM在breast_cancer数据集上的训练预测过程: 数据加载与预处理:使用sklearn.datasets加载breast_cancer数据集,并进行必要的预处理,如特征选择、缺失值处理等。 数据集划分:将数据集划分为训练集和测试集,通常按一定比例(如70%训练集,30%测试集)进行划分。 模型训练:使用LightGBM的LGBMClassifier或lgb.train函数进行模型训练,设置适当的参数如学习率、树的数量、叶子节点数等。 模型预测与评估:在测试集上进行预测,并使用准确率、AUC等指标评估模型性能。 模型稳定性评估(以PSI为例) 虽然直接计算FSI指标不常见,但我们可以使用PSI来评估模型稳定性。PSI衡量的是模型分数或概率分布在实际样本与建模样本之间的变化程度。以下是PSI在LightGBM模型稳定性评估中的应用步骤: 模型分数生成: 使用训练好的LightGBM模型对建模样本(通常是历史数据)和验证样本(新收集的数据)进行预测,生成预测概率或分数。 分数分档: 将预测概率或分数划分为多个区间(分档),例如10个或20个区间。 计算实际占比与预期占比: 在每个分档内,计算验证样本(实际占比)和建模样本(预期占比)中样本的比例。 计算PSI值: 使用PSI的计算公式:PSI=∑i=1n​(实际占比i​−预期占比i​)×ln(预期占比i​实际占比i​​),其中n是分档的数量。 评估稳定性: 根据PSI值判断模型的稳定性: 若PSI < 0.1,则模型稳定性良好。 若PSI在0.1~0.25之间,则模型稳定性一般,可能需要关注。 若PSI > 0.25,则模型稳定性较差,需要调查原因并可能需要对模型进行调整。 注意事项 PSI的计算依赖于建模样本和验证样本的代表性,因此确保样本的多样性和质量至关重要。 PSI主要用于监控模型在生产环境中的表现变化,及时发现并处理可能的模型漂移问题。 在实际应用中,除了PSI外,还可以结合其他指标如KS统计量、Lift图等来全面评估模型性能。 综上所述,虽然直接计算FSI指标在模型稳定性评估中不常见,但我们可以使用类似PSI的指标来评估LightGBM模型在breast_cancer数据集上的稳定性。

在LightGBM模型上直接计算PSI(Population Stability Index)通常涉及将模型预测的概率或分数分档, 并比较这些分档在训练集(或历史数据)和测试集(或新数据)中的分布差异。 然而,由于load_breast_cancer数据集是一个二分类问题,并且我们通常直接预测类别(0或1),而不是概率,我们需要稍微调整方法来计算PSI。 一种常见的方法是将预测概率转换为分数(例如,使用预测为正类的概率), 然后根据这些分数计算PSI。 但是,由于LightGBM的predict方法默认返回类别标签(对于二分类问题),我们需要设置predict方法的raw_score参数为True来获取原始分数(即对数几率)。 以下是在上述代码之后添加的计算PSI的示例代码:

import numpy as np # 获取原始分数(对数几率) y_pred_raw = gbm.predict(X_train, num_iteration=gbm.best_iteration, raw_score=True) y_pred_raw_test = gbm.predict(X_test, num_iteration=gbm.best_iteration, raw_score=True)

# 定义分档数量 num_bins = 10 # 对训练集和测试集的分数进行分档 bins = np.percentile(np.concatenate([y_pred_raw, y_pred_raw_test]), np.linspace(0, 100, num_bins + 1))

在模型稳定性评估中,PSI(Population Stability Index,群体稳定性指标)用于量化评估观测样本与开发样本(或基准样本)之间的分布差异。分档/分桶的个数对PSI的最终结果具有显著影响,因为它决定了数据分布的细化程度以及变化检测的灵敏度。以下是如何设置分桶数才合适的几点考虑: 1. 平衡灵敏度与稳定性 过多的分桶: 如果分桶过多,可能会导致每个分桶内的样本量过少,从而增加统计误差。 此外,过多的分桶也可能使得模型对微小变化的反应过于敏感,导致PSI值波动较大,不利于稳定性评估。 过少的分桶: 如果分桶过少,则可能无法捕捉到数据分布中的细微变化,降低PSI的灵敏度。

2. 考虑数据分布特性 数据分布: 观察模型分数的分布情况, 如果数据分布较为均匀,可以适当增加分桶数以更好地捕捉分布变化。 如果数据分布存在明显的偏态或集中趋势,则应适当减少分桶数以避免过度细化。 极端值: 考虑数据中是否存在极端值或异常值,这些值可能会对分桶结果产生较大影响。 在分桶前可以进行数据清洗或预处理,以减少极端值的影响。

3. 参考行业标准或常用做法 行业标准: 不同领域或行业可能有其特定的分桶设置标准或常用做法。 可以参考这些标准或做法来设置分桶数。 常用做法: 在实践中,将模型分数划分为10个档位是一个较为常见的做法。 这既能够保持一定的灵敏度,又能够避免过多的分桶导致的统计误差。

4. 实证分析与调整 实证分析: 在实际应用中,可以通过实证分析来检验不同分桶数对PSI结果的影响。 例如,可以尝试使用不同的分桶数来计算PSI值,并观察其对结果的影响。 调整优化: 根据实证分析的结果,可以对分桶数进行调整优化。 如果发现某个分桶数下的PSI值波动较大或不稳定, 可以考虑调整分桶数以获得更稳定的结果。

综上所述,设置合适的分桶数需要综合考虑 灵敏度、稳定性、数据分布特性以及行业标准或常用做法等因素。 在实际应用中, 建议通过实证分析来检验不同分桶数的效果,并根据具体情况进行调整优化。

下面是lightgbm在breast_cancer上的分桶表现

# 两个数据集在不同档次的分布比 train_rate,test_rate = bin_rate(y_pred_raw,y_pred_raw_test,num_bins = 25, scale=100) # 计算PSI def calculate_psi(train_rate, test_rate): """基于一个前提,训练集与测试集的数据分布一致,在此基础上才能显现出模型的稳定性 """ psi = 0.0 for base, comp in zip(train_rate, test_rate): if base == 0 or comp == 0: continue # 避免除以零 psi += (base - comp) * np.log(base / comp) return psi def show_psi(train_rate, test_rate): psi_value = calculate_psi(train_rate, test_rate) print(f"PSI Value: {psi_value}") # 根据PSI值评估模型稳定性 if psi_value < 0.1: print("Model stability is good.") elif psi_value >= 0.1 and psi_value < 0.25: print("Model stability is moderate, may need monitoring.") else: print("Model stability is poor, requires investigation.") show_psi(train_rate, test_rate)

10 PSI Value: 0.02379957410568267 20 PSI Value: 0.04160187856909415 25 PSI Value: 0.08861926228731742 30 PSI Value: 0.11814402036024935 100 PSI Value: 0.12007754671784303

分桶数从20-30波动越大, 之后从30-100波动微小,分桶数增加70,结果波动0.002 在模型及参数不变的情况下,表现的是数据的分布情况, 从这里可以看出,数据分布主要集中于30个档次

评估指标

概述

模型稳定性评估指标是用于衡量预测模型在不同条件下的稳定性和可靠性的重要工具。这些指标可以帮助分析人员评估模型在长期和短期内的性能变化,判断模型的有效性和可靠性,进而为决策提供支持。以下是一些常用的模型稳定性评估指标: 1. PSI(Population Stability Index,群体稳定性指标) 定义与原理:PSI指标用于量化评估观测样本与开发样本的分布差异。它通过对比历史样本分布和当前样本分布的波动,来衡量数据的稳定性。PSI值越小,说明模型的稳定性越好;反之,PSI值越大,说明模型的稳定性越差。 应用场景:广泛应用于机器学习模型的稳定性评估,特别是在金融风控领域。 计算方法:将模型分数划分为多个档位(如10个档位),统计各档位跨时间窗口分布的变化程度,使用特定的计算公式得出PSI值。 2. 方差(Variance) 定义:方差是衡量随机变量或一组数据时离散程度的度量。在模型稳定性评估中,方差可以用来衡量模型预测结果在不同样本或条件下的波动情况。 应用:方差越小,说明模型的预测结果越稳定;方差越大,说明模型的预测结果波动较大,可能缺乏稳定性。 3. 偏差(Bias) 定义:偏差是衡量模型预测结果与真实结果之间差异的指标。在模型稳定性评估中,偏差的稳定性也是关注的重点之一。 重要性:如果模型的偏差随时间或条件变化较大,说明模型的预测能力可能不稳定。 4. 误差平方和(Sum of Squared Errors, SSE) 定义:误差平方和是所有观测值与模型预测值之差的平方和。它反映了模型预测误差的总体大小。 应用:在模型稳定性评估中,误差平方和的变化情况可以反映模型预测误差的稳定性。如果误差平方和波动较大,说明模型的预测误差可能不稳定。 5. 相关系数(Correlation Coefficient) 定义:相关系数是衡量两个变量之间线性相关程度的指标。在模型稳定性评估中,可以计算模型预测结果与真实结果之间的相关系数来评估模型的稳定性。 应用:如果相关系数在不同时间窗口或条件下保持相对稳定,说明模型的预测结果与真实结果之间的线性关系较为稳定,从而反映模型的稳定性。 需要注意的是,不同的评估指标适用于不同的场景和需求。在实际应用中,应根据具体情况选择合适的评估指标来评估模型的稳定性。同时,模型稳定性的评估往往需要结合多个指标进行综合分析,以得出更为全面和准确的结论。

交叉验证

import lightgbm as lgb from sklearn.datasets import load_breast_cancer from sklearn.model_selection import StratifiedKFold from sklearn.metrics import accuracy_score from sklearn.preprocessing import StandardScaler # 加载乳腺癌数据集 data, target = load_breast_cancer(return_X_y=True) # 数据标准化处理 scaler = StandardScaler() data_scaled = scaler.fit_transform(data) # 设置LightGBM的参数 params = { 'boosting_type': 'gbdt', 'objective': 'binary', 'metric': 'binary_logloss', 'num_leaves': 3, 'learning_rate': 0.05, 'feature_fraction': 0.9, 'bagging_fraction': 0.8, 'bagging_freq': 5, 'verbose': 0, 'max_depth':2 } # 设置交叉验证的折数,这里我们设置r=5 r = 5 folds = StratifiedKFold(n_splits=r, shuffle=True, random_state=42) # 初始化结果列表来存储每一折的准确率 accuracies = [] # 进行r交叉验证 for fold_n, (train_index, valid_index) in enumerate(folds.split(data_scaled, target)): print(f'Fold {fold_n + 1} started') X_train, X_valid = data_scaled[train_index], data_scaled[valid_index] y_train, y_valid = target[train_index], target[valid_index] # 创建LightGBM的数据集格式 dtrain = lgb.Dataset(X_train, label=y_train) dvalid = lgb.Dataset(X_valid, label=y_valid, reference=dtrain) # 训练模型 model = lgb.train(params, dtrain, num_boost_round=1000, valid_sets=[dtrain, dvalid], valid_names=['train', 'valid']) # 预测验证集 y_pred = model.predict(X_valid, num_iteration=model.best_iteration) y_pred = (y_pred >= 0.5).astype(int) # 计算准确率 accuracy = accuracy_score(y_valid, y_pred) print(f'Fold {fold_n + 1} Accuracy: {accuracy:.4f}') accuracies.append(accuracy) # 打印所有折的平均准确率 print(f'Average Accuracy: {sum(accuracies) / r:.4f}')

Fold 1 started Fold 1 Accuracy: 0.9912 Fold 2 started Fold 2 Accuracy: 0.9561 Fold 3 started Fold 3 Accuracy: 0.9561 Fold 4 started Fold 4 Accuracy: 0.9825 Fold 5 started Fold 5 Accuracy: 0.9646 Average Accuracy: 0.9701

代码说明

数据加载与预处理: 加载乳腺癌数据集并进行标准化处理,这对于许多机器学习算法来说都是很重要的步骤, 因为可以确保不同量纲的特征对模型的影响是相同的。 LightGBM参数设置: 定义了一系列LightGBM的模型参数,包括树的类型、目标函数、评估指标等。 交叉验证: 使用StratifiedKFold进行分层抽样,以确保每一折中的类别分布都是均匀的。 这对于不平衡数据集尤为重要。 模型训练与验证: 在每一折中,数据被分为训练集和验证集,用于训练LightGBM模型, 并通过验证集上的表现进行模型调优。 性能评估: 每一折的模型训练完成后,都在验证集上进行预测,并计算准确率。 所有折的准确率将被计算平均值,以评估模型的整体性能。

分层抽样(Stratified Sampling)在处理不平衡数据集时非常重要, 因为它确保了在划分数据集时每一类的样本比例都保持接近原始数据集的比例。

交叉验证 是一种按不同方法拆分数据集,进行模型训练,然后给出一个平均预测值的方法

模型从数据集中学习规律,在训练前会将数据集拆分为训练,验证,测试 三部分 理论上训练集应该包括所有的规律, 但实际上,整个数据集也不一定包括所有的规律, 很有可能将部分 不重复的/唯一的数据 分到验证集中去了, 导致训练集缺失一部分需要学习的数据 尤其是数据量少的情况下, 不同的拆分方式,会让训练集中包括的规律产生波动, 进而模型的预测能力也随之波动

因此,多拆分几次, 这几次拆分得到的训练集中包含的规律也是有多有少,即数据的质量有好有坏, 在相应数据集上训练的模型的效果也有好有次, 平均一下,得到一次相对稳定的预测值

如果数据量本身数据量宏大,自身存在大量重复的数据, 那么划分出去的验证集,测试集大概率不会导致训练集的数据缺失, 如此,就没必要使用交叉验证

相关性

参考