跳转到内容
技术文章
作者资料照片侯丽坤万博新体育手机客户端

从标记异常中学习,使用Python机器学习客户端进行有效的异常检测

在几篇独立的博客文章中,我们讨论了使用以下技术在具有多个特征的数据集中进行异常检测的问题看到下面成了一个分类集群(DBSCAN)还有统计测试。然而,当感兴趣的数据集是高维的(即:包含许多特征),或者正常点与异常点之间的边界复杂。在这种情况下,更好的方法是手动标记数据集中的异常点,然后训练有监督的机器学习模型对正常点和异常点进行分类。

在这篇博文中,我们将分析一个带有标记异常的特定数据集,并在中使用决策树算法SAP HANA预测分析库(PAL)通过SAP HANA Python机器学习客户端(hana_ml)建立异常检测分类模型。同时,为了从不同角度提高训练模型的性能,还采用了多种重采样技术。

介绍

使用标记的数据集将异常数据与正常数据分离似乎与常规分类问题一样简单。然而,正常和异常数据点之间的高度倾斜分布对建立任何有效的分类模型都是一个巨大的挑战,因为在数据集中异常通常很少被观察到,而正态则是压倒性的。例如,我们考虑一种患病率为0.1%的疾病,如果我们使用一个天真的模型,预测所有人都是非这种疾病的患者,那么这个模型的“高”准确率为99.9%,看起来不错。然而,如果我们欣然采用这种幼稚的模型来检测这种疾病,那么对所有真正的患者来说,这将是一场灾难。正常和异常标签之间的分布不平衡是异常检测问题的一个典型特征,特别是当正常点和异常点在数据集的特征空间中纠缠在一起时。

同时,异常情况通常比正常情况更有价值。例如,如果我们未能检测到银行账户之间的欺诈性交易,那么我们可能会有很大的损失;然而,如果我们怀疑一笔交易是欺诈的,而事实证明它不是真的,我们只需要支付一些人工验证程序,这非常便宜。与正常情况相比,异常情况的重要性更高是异常检测的另一个典型特征。

在这篇博文中,我们将做一个使用标记数据集进行异常检测的案例研究,以下内容将包括在我们的讨论中:

  1. 介绍和背景知识的数据集为我们的案例研究,与简要的问题分析
  2. 利用各种重采样技术从分类模型中进行异常检测

案例研究:甲状腺功能亢进的分类检测

数据集描述和问题分析

本文关注的问题是甲状腺疾病的识别。原始的完整数据集可在UCI机器学习存储库中获得[1]。原始数据集包含21个属性,其中15个是分类属性,6个是数字属性。数据集分为3类:正常、亚正常和超功能。机能亢进是这个数据集中的少数类别,但也是我们最感兴趣的情况,因为一旦获得,它可能会加速身体的新陈代谢,带来诸如体重无意下降、心跳加快或不规则、紧张、焦虑和易怒等症状。

在这篇博文中,我们指定的任务是区分超功能病例和非超功能病例(例如:正常和次正常),只使用6个数值属性。在ODDS库中可以获得此目标数据集的简化版本[2],其中所有属性值都使用Min-Max标量缩放到范围[0,1]。此外,该数据集中的label列的值为0和1,其中1表示hyperfunction, 0表示非hyperfunction。

让我们检查相应的数据集以进行进一步分析。我们假设数据已经存储在SAP HANA平台数据库中名为“PAL_THYROID_DATA_TBL”的表中。然后可以通过使用hana_ml建立到数据库的连接来访问数据集,如下所示:

从hana_ml导入hana_ml。dataframe import ConnectionContext cc = ConnectionContext('xx.xxx.xxx. xxx. conf ')xx', 30x15, 'XXX', 'Xxxxxxx') df = cc.table('PAL_THYROID_DATA_TBL')

然后,thyroid_dfhana_ml。包含数据集信息的DataFrame,可以通过如下方式获得该数据集的简要描述:

.collect thyroid_df.describe () ()
独特的 零位 的意思是 性病 最小值 马克斯 中位数 25 _percent_cont 25 _percent_disc 50 _percent_cont 50 _percent_disc 75年_percent_cont 75年_percent_disc
0 ID 3772 3772 0 1885.500000 1089.026935 0.0 3771.0 1886.000000 942.750000 942.000000 1885.500000 1885.000000 2828.250000 2828.000000
1 3772 93 0 0.543121 0.203790 0.0 1.0 0.569892 0.376344 0.376344 0.569892 0.569892 0.709677 0.709677
2 V1 3772 280 0 0.008983 0.043978 0.0 1.0 0.003019 0.001132 0.001132 0.003019 0.003019 0.004528 0.004528
3. V2 3772 72 0 0.186826 0.070405 0.0 1.0 0.190702 0.156546 0.156546 0.190702 0.190702 0.213472 0.213472
4 V3 3772 243 0 0.248332 0.080579 0.0 1.0 0.241822 0.203271 0.203271 0.241822 0.240654 0.282710 0.282710
5 V4 3772 141 0 0.376941 0.087382 0.0 1.0 0.375587 0.328638 0.328638 0.375587 0.375587 0.413146 0.413146
6 V5 3772 324 0 0.177301 0.054907 0.0 1.0 0.173770 0.149180 0.149180 0.173770 0.173770 0.196721 0.196721
7 类型 3772 2 0 0.024655 0.155093 0.0 1.0 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000

的平均值所揭示的类型列中,功能亢进病例占数据集中所有病例的不到3%,因此数据集是高度倾斜的W.R.T.甲状腺功能类型。

现在我们分别检查功能亢进和非功能亢进。

cc.sql('select * from ({}) where TYPE=1'.format(thyroid_df.select_statement)).describe().collect()
独特的 零位 的意思是 性病 最小值 马克斯 中位数 25 _percent_cont 25 _percent_disc 50 _percent_cont 50 _percent_disc 75年_percent_cont 75年_percent_disc
0 ID 93 93 0 1873.645161 1065.693167 19.000000 3679.000000 1853.000000 1042.000000 1042.000000 1853.000000 1853.000000 2702.000000 2702.000000
1 93 45 0 0.525494 0.201366 0.000000 0.892473 0.537634 0.376344 0.376344 0.537634 0.537634 0.666667 0.666667
2 V1 93 71 0 0.176248 0.212708 0.011698 1.000000 0.096226 0.049057 0.049057 0.096226 0.096226 0.203774 0.203774
3. V2 93 26 0 0.086889 0.060211 0.014231 0.241935 0.080645 0.033207 0.033207 0.080645 0.080645 0.128083 0.128083
4 V3 93 55 0 0.074221 0.050246 0.000000 0.203271 0.072430 0.028037 0.028037 0.072430 0.072430 0.112150 0.112150
5 V4 93 51 0 0.397900 0.085781 0.197183 0.615023 0.399061 0.333333 0.333333 0.399061 0.399061 0.455399 0.455399
6 V5 93 58 0 0.050884 0.033034 0.000000 0.101639 0.050820 0.018033 0.018033 0.050820 0.050820 0.080328 0.080328
7 类型 93 1 0 1.000000 0.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000
cc.sql('select * from ({}) where TYPE=0'.format(thyroid_df.select_statement)).describe().collect()
独特的 零位 的意思是 性病 最小值 马克斯 中位数 25 _percent_cont 25 _percent_disc 50 _percent_cont 50 _percent_disc 75年_percent_cont 75年_percent_disc
0 ID 3679 3679 0 1885.799674 1089.750477 0.00000 3771.000000 1888.000000 940.500000 940.000000 1888.000000 1888.000000 2831.500000 2832.000000
1 3679 93 0 0.543566 0.203859 0.00000 1.000000 0.569892 0.376344 0.376344 0.569892 0.569892 0.709677 0.709677
2 V1 3679 235 0 0.004755 0.011221 0.00000 0.273585 0.002830 0.001075 0.001075 0.002830 0.002830 0.004340 0.004340
3. V2 3679 71 0 0.189353 0.068794 0.00000 1.000000 0.190702 0.156546 0.156546 0.190702 0.190702 0.213472 0.213472
4 V3 3679 212 0 0.252734 0.076211 0.03972 1.000000 0.245327 0.205607 0.205607 0.245327 0.245327 0.282710 0.282710
5 V4 3679 141 0 0.376411 0.087369 0.00000 1.000000 0.375587 0.328638 0.328638 0.375587 0.375587 0.399061 0.399061
6 V5 3679 284 0 0.180496 0.051472 0.02459 1.000000 0.175410 0.150820 0.150820 0.175410 0.175410 0.198361 0.198361
7 类型 3679 1 0 0.000000 0.000000 0.00000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000

对数据的进一步研究告诉我们,在V1、V2、V3和V5等属性上,超功能病例和非超功能病例的分布有很大的不同(以分位数计算)。所以这些数值属性有可能区分甲状腺功能亢进和非功能亢进。

数据集的可视化是另一种评估分类问题难度的方法。由于数据集的特征空间为6维,因此必须进行降维。这里应用PCA将数据集从6D转换为2D,以绘制数据集的散点图(不涉及类型列)。

从hana_ml.algorithms.pal.decomposition导入PCA res = PCA()。fit_transform (thyroid_df、关键=“ID”特性=[‘半’,‘V1’,‘V2’,‘V3’,‘V4’,‘V5))
thyroid_2d = res[['ID', 'COMPONENT_1', 'COMPONENT_2']] hyper_ids = 'SELECT ID FROM ({}) WHERE TYPE=1'.format(thyroid_df.select_statement) non_hyper_ids = 'SELECT ID FROM ({}) WHERE TYPE=0'.format(thyroid_df.select_statement) thyroid_2d_hyper = cc.sql('SELECT * FROM ({}) WHERE ID IN ({})'.format(thyroid_2d. sql)select_statement, hyper_ids)) thyroid_2d_non_hyper = cc.sql('SELECT * FROM ({}) WHERE ID IN ({})'.format(thyroid_2d. ids)。select_statement, non_hyper_ids))
进口matplotlib。pyplot as plt h1 = plt.scatter(thyroid_2d_non_hyper.collect()['COMPONENT_1'], thyroid_2d_non_hyper.collect()['COMPONENT_1'], c='red') h2 = plt.scatter(thyroid_2d_hyper.collect()['COMPONENT_1'], thyroid_2d_hyper.collect()['COMPONENT_2'], s = 5, c='blue') plt。legend((h1, h2),('正常/亚正常','功能亢进'))plt.show()

从上图可以看出,超功能案例与非超功能案例的分布是不同的(在约简属性空间中),但这两个类别并没有很好地分开。

数据分区

在建立任何异常检测分类模型之前,我们首先将整个数据集划分为训练部分和测试部分train_test_val_split ()方法,其中训练百分比设置为0.7,测试百分比设置为0.3(没有验证数据)。

罗hana_ml.algorithms.pal。train_test_val_split(data = thyroid_df, id_column='ID', random_seed=2, partition_method='stratified', stratified_column='TYPE', training_percentage=0.7, testing_percentage=0.3, validation_percentage=0)

现在我们可以构建一个分类模型了。下面使用决策树分类器进行说明,其他分类算法也适用于类似的工作流程。

直接培训

首先,我们直接在训练数据集上构建一个决策树分类器,而不进行任何修改。决策树分类器通过UnifiedClassification类,通过这样做,我们可以通过调用相应的方法获得测试数据集上训练模型的许多评估度量值分数()函数。整个过程如下所示:

从hana_ml.algorithms.pal。unified_classification import UnifiedClassification dtc = UnifiedClassification(func=' decision - tree ', algorithm='cart') dtc。fit(data=train_, partition_method='no', key='ID', label='TYPE', categorical_variable='TYPE') res_direct = dtc。分数(数据= test_键=“ID”,功能=[‘半’,‘V1’,‘V2’,‘V3’,‘V4’,‘V5))

的返回结果的第2元素中提供了训练模型在测试数据集上的评价指标的值分数()函数,它可以被收集到python客户端,如下所示:

res_direct [1] .collect ()
STAT_NAME STAT_VALUE CLASS_NAME
0 AUC 0.9938162544169611 没有一个
1 回忆 0.9972826086956522 0
2 精度 0.9963800904977376 0
3. F1_SCORE 0.9968311453146219 0
4 支持 1104 0
5 回忆 0.8571428571428571 1
6 精度 0.8888888888888888 1
7 F1_SCORE 0.8727272727272727 1
8 支持 28 1
9 精度 0.9938162544169611 没有一个
10 卡巴 0.8695594916705077 没有一个
11 世纪挑战集团 0.8697105036187616 没有一个

值得一提的几个关键统计值:

  1. 总体准确率为~99.38%,高于朴素的“总是非超功能”分类器。
  2. 决策树分类器为测试中约85.7%的超功能病例分配了正确的标签
  3. 决策树分类器预测的功能亢进病例约88.9%为真实的功能亢进病例。

训练模型的性能已经相当好了。然而,由于类在训练数据集中是不平衡的,平衡类数量的重采样技术有进一步提高分类模型性能的潜力。我们将在后面的小节中验证这一理由。我们的第一个尝试是对少数类进行过采样,以实现训练数据中的类平衡。

基于少数类过采样的模型训练

我们首先在训练数据集中使用超功能病例的数量增加几次合成少数派过采样技术(即SMOTE),使功能亢进病例数与非功能亢进病例数具有可比性。

train_pos = cc.sql('SELECT * FROM ({}) WHERE TYPE=1'.format(train_select_statement)) train_neg = cc.sql('SELECT * FROM ({}) WHERE TYPE=0'.format(train_select_statement)) multi = int(train_neg.count()/train_pos.count())#次用于非超功能情况相对于超功能情况的计数
从hana_ml.algorithms.pal。预处理导入SMOTE SMOTE = SMOTE(smote_amount=multi*100) #smote_amount由百分比反映train_smote = SMOTE。fit_transform (data = train_[[‘半’,‘V1’,‘V2’,‘V3’,‘V4’,‘V5’,'类型']],标签=“类型”,minority_class = 1)
dtc。fit(data=train_smote, partition_method='no', label='TYPE', categorical_variable='TYPE') score_res = dtc。分数(数据= test_键=“ID”,功能=[‘半’,‘V1’,‘V2’,‘V3’,‘V4’,‘V5))
score_res [1] .collect ()
STAT_NAME STAT_VALUE CLASS_NAME
0 AUC 0.9990487145550575 没有一个
1 回忆 0.9981884057971014 0
2 精度 0.99909338168631 0
3. F1_SCORE 0.9986406887177163 0
4 支持 1104 0
5 回忆 0.9642857142857143 1
6 精度 0.9310344827586207 1
7 F1_SCORE 0.9473684210526316 1
8 支持 28 1
9 精度 0.9973498233215548 没有一个
10 卡巴 0.9460095389507154 没有一个
11 世纪挑战集团 0.9461627755815293 没有一个

因此,通过对训练数据中的超功能病例进行过采样,使其与非超功能病例的大小大致相同,并重新训练决策树模型,我们看到以下关键统计数据显示出一些改进:

  1. 总体准确率从~99.38%提高到~99.73%(相对于没有重新采样的训练)
  2. 在测试中,96.4%的超功能病例被决策树分类器分配到正确的标签(而没有重新采样的病例为85.7%)
  3. ~93.1%的决策树分类器预测的功能亢进病例是真正的功能亢进病例(88.9%没有重采样)

模型在测试数据集上的性能增量是不可忽略的,这表明了对少数类过采样的有效性。

对少数类进行过采样的另一种方法是直接复制,这相当于某种意义上的自举。

导入numpy为np train_mult = train_neg for I in range(np.int64(mult)): train_mult = train_multi .union(train_pos)#将阳性的情况重复多次,使其组大小与阴性组大致相同
dtc =统一分类(func=' decision - tree ', algorithm='cart')fit (data = train_mult[[‘半’,‘V1’,‘V2’,‘V3’,‘V4’,‘V5’,'类型']],partition_method =“不”,标签=“类型”,categorical_variable =“类型”)score_res = dtc。分数(数据= test_键=“ID”,功能=[‘半’,‘V1’,‘V2’,‘V3’,‘V4’,‘V5))
score_res [1] .collect ()
STAT_NAME STAT_VALUE CLASS_NAME
0 AUC 0.9990487145550575 没有一个
1 回忆 0.9981884057971014 0
2 精度 0.99909338168631 0
3. F1_SCORE 0.9986406887177163 0
4 支持 1104 0
5 回忆 0.9642857142857143 1
6 精度 0.9310344827586207 1
7 F1_SCORE 0.9473684210526316 1
8 支持 28 1
9 精度 0.9973498233215548 没有一个
10 卡巴 0.9460095389507154 没有一个
11 世纪挑战集团 0.9461627755815293 没有一个

得分统计结果与应用SMOTE时基本相同。

多数类欠抽样模型训练

对少数类训练数据进行过采样通常可以提高少数类训练数据的相关精度和查全率指标,而不会对多数类训练数据的评价指标产生太大影响。然而,它有一些缺点:一是过度采样的训练数据会消耗额外的内存/计算资源,另一个是它通常缺乏对少数类实现非常高的召回率的潜力。当一个带有少数类标签的案例的错分类已经高到不可接受的程度时,我们必须想出一个聪明的方法来提高它的召回率,而天真地将所有数据都贴上少数类标签显然不是一个明智的选择聪明的我们应该避免这样做。

这就是多数类欠抽样,在这种情况下,带有多数类标签的数据集合是次抽样的。因此,大多数类数据点覆盖的区域变得更小,密度更低,这为机器学习方法提供了空间,以便更好地建模少数类点,并减少争议。这通常会导致覆盖率的直接增加(例如:召回率)少数类点,但多数类点也会被误分类为少数类(准确率下降)。然而,只要后者所付出的代价小于前者所节省的价值,我们就乐意做出改变。

对多数阶层的抽样不足可以通过许多不同的方式实现。我们在这里的第一个尝试是TomekLinks算法,它在SAP HANA预测分析库(PAL)中提供,并封装在SAP HANA的Python机器学习客户端(hana_ml)中。

从hana_ml.algorithms.pal。预处理导入TomekLinks tmk = TomekLinks() train_tmk = tmk。fit_transform (train_、标签=“类型”)
dtc。fit(data=train_tmk, key =' ID', partition_method='no', label='TYPE', categorical_variable='TYPE') score_res = dtc。分数(数据= test_键=“ID”,功能=[‘半’,‘V1’,‘V2’,‘V3’,‘V4’,‘V5))
score_res [1] .collect ()
STAT_NAME STAT_VALUE CLASS_NAME
0 AUC 0.9964664310954063 没有一个
1 回忆 0.9972826086956522 0
2 精度 0.9990925589836661 0
3. F1_SCORE 0.9981867633726201 0
4 支持 1104 0
5 回忆 0.9642857142857143 1
6 精度 0.9 1
7 F1_SCORE 0.9310344827586207 1
8 支持 28 1
9 精度 0.9964664310954063 没有一个
10 卡巴 0.9292234587970489 没有一个
11 世纪挑战集团 0.9298058529321855 没有一个

与不重新采样训练数据的直接分类结果相比,我们有:

  1. 总体准确率从99.38%提高到99.64%(相对于没有重新采样的训练)
  2. 96.4%的功能亢进病例现在被正确预测(85.7%没有重新采样)
  3. 90%的预测功能亢进病例现在是正确的(而没有重新采样的88.9%)

对于超功能情况,召回率有很大提高(与少数类过采样相同),但精度的增量要小得多,其值也小于少数类过采样。结果与我们之前对多数类子抽样的分析一致。

接下来我们尝试对大多数类进行随机子抽样,我们对大多数类数据进行大的子抽样,这样最终两个类在训练数据中具有相似的大小。

从hana_ml.algorithms.pal。采样dsp_rate=0.03 #非超功能病例的子采样率sp = Sampling(method='simple_random_without_replacement', sampling_size=int(dsp_rate*train_neg.count()), random_state=2)# train_neg_sub = sp.fit_transform(train_neg) train_balanced = train_neg_sub.union(train_pos)
dtc。fit(data=train_balanced, key='ID', partition_method='no', label='TYPE', categorical_variable='TYPE') score_res = dtc。分数(数据= test_键=“ID”,功能=[‘半’,‘V1’,‘V2’,‘V3’,‘V4’,‘V5))
score_res [1] .collect ()
STAT_NAME STAT_VALUE CLASS_NAME
0 AUC 0.9787985865724381 没有一个
1 回忆 0.9782608695652174 0
2 精度 1 0
3. F1_SCORE 0.989010989010989 0
4 支持 1104 0
5 回忆 1 1
6 精度 0.5384615384615384 1
7 F1_SCORE 0.7000000000000001 1
8 支持 28 1
9 精度 0.9787985865724381 没有一个
10 卡巴 0.6900328587075575 没有一个
11 世纪挑战集团 0.72577947948589 没有一个

现在训练的模型对于测试数据集中的超功能案例获得了完美的召回分数,但相应的精度分数也大大降低,说明产生了很多错误预测功能亢进病例在测试数据集中。

混合模型训练方法

多数类的高欠采样率可能会导致少数类的高召回率,但也有欠拟合多数类的风险,因为在训练阶段会丢弃很多类的点。我们已经看到了许多的生产错误预测功能亢进病例训练数据中非功能亢进病例抽样不足导致。相比之下,结合少数类过采样和多数类过采样,即混合方法,可能是处理类不平衡问题的更聪明和更稳健的方法。

SMOTETomek是一种结合了这两种采样策略的算法,它也在SAP HANA预测分析库(PAL)中提供,并封装在SAP HANA的Python机器学习客户端(hana_ml)中。在下面的上下文中,我们使用SMOTETomek对训练数据进行重新采样。

从hana_ml.algorithms.pal。预处理导入SMOTETomek stk = SMOTETomek(smote_amount=multi*100) train_stk = stk.fit_transform(data=train_, label='TYPE', minority_class=1)
从hana_ml.algorithms.pal。unified_classification import UnifiedClassification dtc = UnifiedClassification(func=' decision - tree ', algorithm='cart') dtc。fit (data = train_stk[[‘半’,‘V1’,‘V2’,‘V3’,‘V4’,‘V5’,'类型']],partition_method =“不”,标签=“类型”,categorical_variable =“类型”)score_res = dtc。分数(数据= test_键=“ID”,功能=[‘半’,‘V1’,‘V2’,‘V3’,‘V4’,‘V5))
score_res [1] .collect ()
STAT_NAME STAT_VALUE CLASS_NAME
0 AUC 0.9990487145550575 没有一个
1 回忆 0.9981884057971014 0
2 精度 0.99909338168631 0
3. F1_SCORE 0.9986406887177163 0
4 支持 1104 0
5 回忆 0.9642857142857143 1
6 精度 0.9310344827586207 1
7 F1_SCORE 0.9473684210526316 1
8 支持 28 1
9 精度 0.9973498233215548 没有一个
10 卡巴 0.9460095389507154 没有一个
11 世纪挑战集团 0.9461627755815293 没有一个

总体而言,测试数据集上的评估指标与将SMOTE应用于训练数据时的情况类似。这是合理的,因为通常在数据集中只有几个点与TomekLinks相关,因此欠采样效应是微不足道的。

在下面的情况下,我们对训练数据中的非超功能病例进行一半的过采样(随机不替换),同时使用SMOTE对超功能病例进行过采样,以便两个类最终具有相似的大小。

从hana_ml.algorithms.pal。预处理导入采样dsp_rate=0.5 sp = Sampling(method='simple_random_without_replacement', sampling_size=int(dsp_rate*train_neg.count()), random_state=2) mult =int(train_neg.count()/train_pos.count()) train_neg_sub = sp.fit_transform(train_neg) from hana_ml.algorithms.pal。预处理导入SMOTE SMOTE = SMOTE(smote_amount=int(multi*100*dsp_rate)) train_pos_sup = SMOTE。fit_transform(train_pos, label='TYPE', minority_class=1) train_balanced = train_neg_sub.union(train_pos_sup)
dtc。fit(data=train_balanced, key='ID', partition_method='no', label='TYPE', categorical_variable='TYPE') score_res = dtc。分数(数据= test_键=“ID”,功能=[‘半’,‘V1’,‘V2’,‘V3’,‘V4’,' V5 ']) score_res [1] .collect ()
STAT_NAME STAT_VALUE CLASS_NAME
0 AUC 0.9973498233215548 没有一个
1 回忆 0.9972826086956522 0
2 精度 1 0
3. F1_SCORE 0.998639455782313 0
4 支持 1104 0
5 回忆 1 1
6 精度 0.9032258064516129 1
7 F1_SCORE 0.9491525423728813 1
8 支持 28 1
9 精度 0.9973498233215548 没有一个
10 卡巴 0.9477956096661133 没有一个
11 世纪挑战集团 0.9490897684093421 没有一个

训练后的模型在测试数据中对功能亢进病例的召回率也很好,与单纯对非功能亢进病例进行过采样的结果相比,功能亢进病例的召回率提高了很多(从~53.85%提高到~90.32%)。与以往的结果相比,这种混合重采样方法的结果是最令人满意的。

总结与讨论

在这篇博客文章中,我们做了一个通过分类进行异常检测的案例研究,其中提供了一个带有正常和异常标签的训练数据集。异常分类检测的主要难点在于正常和异常标签的分布通常是高度不平衡的,这对建立高效的分类模型提出了挑战。我们已经证明,通过适当地重新采样训练数据,我们可以潜在地提高分类模型在预测阶段的性能,特别是对于异常数据点的精度和召回率。在我们的案例研究中,结合SMOTE和随机子抽样(无替换)的混合重采样方法给出了最令人满意的结果。

然而,应该强调的是,即使在类中训练数据高度不平衡的情况下,重新采样也并不总是能得到更好的机器学习模型(例如。看到[3])而不是不重新采样训练数据。人们必须足够小心,通过重新采样训练数据来验证增益,特别是当收集到的特征可以很好地区分类之间的差异时。

参考文献

[1]杜瓦,D.和格拉夫,C.(2019)。UCI机器学习资料库[http://archive.ics.uci.edu/ml]。加州欧文市:加州大学信息与计算机科学学院
[2] Shebuti Rayana(2016)。ODDS图书馆[http://odds.cs.stonybrook.edu]。纽约州石溪分校:石溪大学计算机科学系
[3]冯阳,周敏,童欣(2020),不平衡分类:以目标为导向的回顾,技术报告,纽约大学,全球公共卫生学院

指定的标签

      第一个留下评论
      你一定是登录评论:评论或回复一篇文章