不平衡分类速成课程。
在 7 天内掌握不平衡分类。
分类预测建模是将标签分配给样本的任务。
不平衡分类是指各类样本数量分布不均的分类任务。
实际的不平衡分类需要使用一套专门的技术、数据准备技术、学习算法和性能指标。
在本速成课程中,您将发现如何在七天内使用 Python 开始并自信地完成一个不平衡分类项目。
这是一篇内容丰富且重要的文章。您可能想把它加入书签。
让我们开始吧。
- 2021 年 1 月更新:更新了 API 文档链接。

使用 Python 进行不平衡分类(7 天迷你课程)
图片来源:Arches National Park,保留部分权利。
本速成课程适合谁?
在开始之前,让我们确保您来对了地方。
本课程面向可能了解一些应用机器学习的开发人员。也许您知道如何使用流行工具从头到尾解决一个预测建模问题,或者至少了解大部分主要步骤。
本课程的课程假设您具备以下几点:
- 您熟悉基本的Python编程。
- 您可能了解一些基本的NumPy用于数组操作。
- 您可能了解一些基本的 scikit-learn 建模知识。
您不需要是
- 成为数学高手!
- 成为机器学习专家!
本速成课程将把您从一个略懂机器学习的开发者转变为一个能够驾驭不平衡分类项目的开发者。
注意:本速成课程假设您有一个可用的 Python 3 SciPy 环境,并且至少安装了 NumPy。如果您的环境需要帮助,您可以按照这里的分步教程进行操作。
想要开始学习不平衡分类吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
速成课程概览
本速成课程分为七节课。
您可以每天完成一节课(推荐),也可以一天内完成所有课程(硬核)。这取决于您可用的时间和您的热情程度。
以下是七节课程列表,它们将帮助您开始使用 Python 进行不平衡分类并提高效率。
- 第 01 课:不平衡分类的挑战
- 第 02 课:不平衡数据的直觉
- 第 03 课:评估不平衡分类模型
- 第 04 课:多数类的欠采样
- 第 05 课:少数类的过采样
- 第 06 课:结合数据欠采样和过采样
- 第 07 课:成本敏感算法
每节课可能需要60秒到30分钟不等。请慢慢来,按照自己的节奏完成课程。在下面的评论中提问,甚至发布结果。
这些课程可能会要求您自行查找如何完成任务。我将为您提供提示,但每节课的重点之一是迫使您学习在哪里寻找关于算法和 Python 中一流工具的帮助。(提示:我在此博客上直接提供了所有答案;请使用搜索框。)
在评论中发布您的结果;我会为您加油!
坚持下去;不要放弃。
注意:这只是一个速成课程。有关更多详细信息和更完善的教程,请参阅我关于此主题的书籍,题为《使用 Python 进行不平衡分类》。
第 01 课:不平衡分类的挑战
在本课程中,您将了解不平衡分类问题的挑战。
不平衡分类问题对预测建模构成了挑战,因为大多数用于分类的机器学习算法都是围绕每个类别具有相同数量样本的假设设计的。
这导致模型的预测性能不佳,特别是对于少数类别。这是一个问题,因为通常情况下,少数类别更重要,因此与多数类别相比,该问题对少数类别的分类错误更敏感。
- 多数类:超过一半的样本属于此类,通常是负例或正常情况。
- 少数类:少于一半的样本属于此类,通常是正例或异常情况。
分类问题可能略有倾斜,例如存在轻微不平衡。或者,分类问题可能存在严重不平衡,在给定的训练数据集中,一个类别可能有数百或数千个样本,而另一个类别只有几十个样本。
- 轻微不平衡。训练数据集中样本分布略不均匀(例如 4:6)。
- 严重不平衡。训练数据集中样本分布严重不均匀(例如 1:100 或更多)。
我们实际感兴趣的许多分类预测建模问题都是不平衡的。
因此,不平衡分类没有得到更多关注是令人惊讶的。
您的任务
在本课程中,您必须列出五个本质上具有类别不平衡问题的通用示例。
一个例子可能是欺诈检测,另一个可能是入侵检测。
请在下面的评论中发布您的答案。我很想看看您能想出什么。
在下一课中,您将了解如何培养对倾斜类别分布的直觉。
第 02 课:不平衡数据的直觉
在本课程中,您将发现如何培养对不平衡分类数据集的实际直觉。
初学者处理不平衡分类问题的一个挑战是特定倾斜类别分布的含义。例如,1:10 与 1:100 的类别比例有什么区别和影响?
scikit-learn 函数 make_classification() 可用于定义具有所需类别不平衡的合成数据集。“weights”参数指定负类中样本的比例,例如 [0.99, 0.01] 表示 99% 的样本将属于多数类,其余 1% 将属于少数类。
1 2 3 |
... # 定义数据集 X, y = make_classification(n_samples=1000, n_features=2, n_redundant=0, n_clusters_per_class=1, weights=[0.99], flip_y=0) |
定义后,我们可以使用 Counter 对象总结类别分布,以了解每个类别中确切有多少个样本。
1 2 3 4 |
... # 总结类别分布 counter = Counter(y) print(counter) |
我们还可以创建数据集的散点图,因为只有两个输入变量。然后可以按每个类别对点进行着色。此图提供了对 99% 与 1% 多数/少数类别不平衡在实践中具体表现的视觉直觉。
创建和总结不平衡分类数据集的完整示例如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# 绘制不平衡分类问题 from collections import Counter from sklearn.datasets import make_classification from matplotlib import pyplot from numpy import where # 定义数据集 X, y = make_classification(n_samples=1000, n_features=2, n_redundant=0, n_clusters_per_class=1, weights=[0.99, 0.01], flip_y=0) # 总结类别分布 counter = Counter(y) print(counter) # 按类别标签绘制样本散点图 for label, _ in counter.items(): row_ix = where(y == label)[0] pyplot.scatter(X[row_ix, 0], X[row_ix, 1], label=str(label)) pyplot.legend() pyplot.show() |
您的任务
在本课程中,您必须运行示例并查看图表。
额外奖励:您可以测试不同的类别比例并查看结果。
请在下面的评论中发布您的答案。我很想看看您能想出什么。
在下一课中,您将发现如何评估不平衡分类模型。
第 03 课:评估不平衡分类模型
在本课程中,您将了解如何评估不平衡分类问题上的模型。
预测准确率是分类任务最常用的指标,但在不平衡分类任务中使用时,它是不恰当的,并且可能具有危险的误导性。
其原因是,如果 98% 的数据属于负类,那么您只需一直预测负类,就能平均达到 98% 的准确率,这 naive 地看起来很不错,但实际上并没有任何技能。
相反,必须采用替代的性能指标。
流行的替代方案是精确率和召回率分数,它们通过关注少数类(称为正类)来考虑模型的性能。
精确率计算正确预测的正例数除以预测的正例总数之比。最大化精确率将最小化假正例。
- 精确率 = 真阳性 / (真阳性 + 假阳性)
召回率预测正确预测的正例总数除以可能预测的正例总数之比。最大化召回率将最小化假负例。
- 召回率 = 真阳性 / (真阳性 + 假阴性)
模型的性能可以通过一个将精确率和召回率平均的单一分数来总结,称为 F-Measure。最大化 F-Measure 将同时最大化精确率和召回率。
- F-measure = (2 * 精确率 * 召回率) / (精确率 + 召回率)
以下示例将逻辑回归模型拟合到不平衡分类问题上,并计算准确率,然后可以将其与精确率、召回率和F-measure进行比较。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# 使用不同指标评估不平衡分类模型 from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score from sklearn.metrics import precision_score from sklearn.metrics import recall_score from sklearn.metrics import f1_score # 生成数据集 X, y = make_classification(n_samples=10000, n_features=2, n_redundant=0, n_clusters_per_class=1, weights=[0.99], flip_y=0) # 以相同类别比例分割为训练/测试集 trainX, testX, trainy, testy = train_test_split(X, y, test_size=0.5, stratify=y) # 定义模型 model = LogisticRegression(solver='liblinear') # 拟合模型 model.fit(trainX, trainy) # 在测试集上进行预测 yhat = model.predict(testX) # 评估预测 print('准确率:%.3f' % accuracy_score(testy, yhat)) print('精确率:%.3f' % precision_score(testy, yhat)) print('召回率:%.3f' % recall_score(testy, yhat)) print('F-measure:%.3f' % f1_score(testy, yhat)) |
您的任务
在本课程中,您必须运行示例并比较分类准确率与其他指标,例如精确率、召回率和 F-measure。
额外奖励:尝试其他指标,如 Fbeta-measure 和 ROC AUC 分数。
请在下面的评论中发布您的答案。我很想看看您能想出什么。
在下一课中,您将发现如何对多数类进行欠采样。
第 04 课:多数类的欠采样
在本课程中,您将了解如何对训练数据集中的多数类进行欠采样。
在不平衡数据集上使用标准机器学习算法的一个简单方法是更改训练数据集以使其具有更平衡的类别分布。
这可以通过删除多数类中的样本来实现,这被称为“欠采样”。一个可能的缺点是,在建模过程中有帮助的多数类中的样本可能会被删除。
imbalanced-learn 库提供了许多欠采样算法的示例。此库可以使用 pip 轻松安装;例如
1 |
pip install imbalanced-learn |
一种快速可靠的方法是随机删除多数类中的样本,以将不平衡程度降低到不那么严重甚至使类别均匀的比例。
以下示例创建了一个合成的不平衡分类数据,然后使用 RandomUnderSampler 类将类别分布从少数类与多数类的 1:100 更改为不那么严重的 1:2。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# 多数类欠采样示例 from collections import Counter from sklearn.datasets import make_classification from imblearn.under_sampling import RandomUnderSampler # 生成数据集 X, y = make_classification(n_samples=10000, n_features=2, n_redundant=0, n_clusters_per_class=1, weights=[0.99, 0.01], flip_y=0) # 总结类别分布 print(Counter(y)) # 定义欠采样策略 undersample = RandomUnderSampler(sampling_strategy=0.5) # 拟合并应用变换 X_under, y_under = undersample.fit_resample(X, y) # 总结类别分布 print(Counter(y_under)) |
您的任务
在本课程中,您必须运行示例并注意在对多数类进行欠采样之前和之后类别分布的变化。
额外奖励:尝试其他欠采样比例,甚至尝试 imbalanced-learn 库提供的其他欠采样技术。
请在下面的评论中发布您的答案。我很想看看您能想出什么。
在下一课中,您将了解如何对少数类进行过采样。
第 05 课:少数类的过采样
在本课程中,您将发现如何对训练数据集中的少数类进行过采样。
与从多数类中删除样本的替代方法是添加来自少数类的新样本。
这可以通过简单地复制少数类中的样本来实现,但这些样本不会添加任何新信息。相反,可以使用训练数据集中现有样本合成少数类的新样本。这些新样本将“接近”特征空间中的现有样本,但在微小但随机的方式上有所不同。
SMOTE 算法是过采样少数类的流行方法。该技术可用于减少不平衡或使类别分布均匀。
下面的示例演示了如何在合成数据集上使用 imbalanced-learn 库提供的 SMOTE 类。初始类别分布为 1:100,少数类被过采样为 1:2 分布。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# 少数类过采样示例 from collections import Counter from sklearn.datasets import make_classification from imblearn.over_sampling import SMOTE # 生成数据集 X, y = make_classification(n_samples=10000, n_features=2, n_redundant=0, n_clusters_per_class=1, weights=[0.99, 0.01], flip_y=0) # 总结类别分布 print(Counter(y)) # 定义过采样策略 oversample = SMOTE(sampling_strategy=0.5) # 拟合并应用变换 X_over, y_over = oversample.fit_resample(X, y) # 总结类别分布 print(Counter(y_over)) |
您的任务
在本课程中,您必须运行示例并注意在对少数类进行过采样之前和之后类别分布的变化。
额外奖励:尝试其他过采样比例,甚至尝试 imbalanced-learn 库提供的其他过采样技术。
请在下面的评论中发布您的答案。我很想看看您能想出什么。
在下一课中,您将发现如何结合欠采样和过采样技术。
第 06 课:结合数据欠采样和过采样
在本课程中,您将了解如何在训练数据集上结合数据欠采样和过采样。
数据欠采样将从多数类中删除样本,而数据过采样将向少数类中添加样本。这两种方法可以结合使用,并应用于单个训练数据集。
鉴于有如此多的不同数据采样技术可供选择,选择哪些方法进行组合可能会令人困惑。值得庆幸的是,有一些常见的组合已被证明在实践中效果良好;一些例子包括
- 随机欠采样与 SMOTE 过采样。
- Tomek Links 欠采样与 SMOTE 过采样。
- 编辑最近邻欠采样与 SMOTE 过采样。
这些组合可以通过先应用一个采样算法,然后再应用另一个采样算法来手动应用于给定训练数据集。值得庆幸的是,imbalanced-learn 库提供了常见组合数据采样技术的实现。
以下示例演示了如何使用 SMOTEENN,它结合了少数类的 SMOTE 过采样和多数类的编辑最近邻欠采样。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# 欠采样和过采样的示例 from collections import Counter from sklearn.datasets import make_classification from imblearn.combine import SMOTEENN # 生成数据集 X, y = make_classification(n_samples=10000, n_features=2, n_redundant=0, n_clusters_per_class=1, weights=[0.99, 0.01], flip_y=0) # 总结类别分布 print(Counter(y)) # 定义采样策略 sample = SMOTEENN(sampling_strategy=0.5) # 拟合并应用变换 X_over, y_over = sample.fit_resample(X, y) # 总结类别分布 print(Counter(y_over)) |
您的任务
在本课程中,您必须运行示例并注意数据采样前后类别分布的变化。
额外奖励:尝试其他组合数据采样技术,甚至尝试手动在数据集上应用过采样,然后进行欠采样。
请在下面的评论中发布您的答案。我很想看看您能想出什么。
在下一课中,您将了解如何使用成本敏感算法进行不平衡分类。
第 07 课:成本敏感算法
在本课程中,您将了解如何使用成本敏感算法进行不平衡分类。
大多数机器学习算法都假设模型所做的所有错误分类错误都是相同的。对于不平衡分类问题,通常情况并非如此,其中漏掉一个正类或少数类比错误分类一个负类或多数类中的样本更糟糕。
成本敏感学习是机器学习的一个子领域,它在训练机器学习模型时会考虑预测错误的成本(以及可能存在的其他成本)。许多机器学习算法可以更新为成本敏感的,其中模型对一个类的错误分类错误的惩罚比对另一个类(例如少数类)的惩罚更大。
scikit-learn 库通过在定义模型时指定的 `class_weight` 属性为一系列算法提供了此功能。可以指定与类别分布成反比的权重。
如果多数类和少数类的类别分布为 0.99 到 0.01,那么 `class_weight` 参数可以定义为一个字典,该字典定义多数类的错误惩罚为 0.01,少数类的错误惩罚为 0.99,例如 {0:0.01, 1:0.99}。
这是一种有用的启发式方法,可以通过将 `class_weight` 参数设置为字符串“`balanced`”来自动配置。
以下示例演示了如何在不平衡分类数据集上定义和拟合成本敏感逻辑回归模型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# 不平衡分类中成本敏感逻辑回归的示例 from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import f1_score # 生成数据集 X, y = make_classification(n_samples=10000, n_features=2, n_redundant=0, n_clusters_per_class=1, weights=[0.99], flip_y=0) # 以相同类别比例分割为训练/测试集 trainX, testX, trainy, testy = train_test_split(X, y, test_size=0.5, stratify=y) # 定义模型 model = LogisticRegression(solver='liblinear', class_weight='balanced') # 拟合模型 model.fit(trainX, trainy) # 在测试集上进行预测 yhat = model.predict(testX) # 评估预测 print('F-Measure: %.3f' % f1_score(testy, yhat)) |
您的任务
在本课程中,您必须运行示例并查看成本敏感模型的性能。
额外奖励:将其性能与成本不敏感的逻辑回归版本进行比较。
请在下面的评论中发布您的答案。我很想看看您能想出什么。
这是迷你课程的最后一课。
结束!
(看看您取得了多大的进步)
您做到了。干得好!
花点时间回顾一下您已经走了多远。
您发现了:
- 不平衡分类的挑战在于少数类的样本不足以及不同类别之间分类错误的重要性差异。
- 如何培养对不平衡分类数据集的空间直觉,这可能有助于数据准备和算法选择。
- 分类准确率的不足以及诸如精确率、召回率和 F-measure 等替代指标如何更好地总结不平衡数据集上的模型性能。
- 如何从训练数据集中删除多数类中的样本,称为数据欠采样。
- 如何在训练数据集中合成少数类中的新样本,称为数据过采样。
- 如何在训练数据集上结合数据过采样和欠采样技术,以及导致良好性能的常见组合。
- 如何使用成本敏感的修改版机器学习算法来提高不平衡分类数据集的性能。
再进一步,查看我的《使用 Python 进行不平衡分类》一书。
总结
您对这个迷你课程的学习情况如何?
您喜欢这个速成课程吗?
您有什么问题吗?是否有任何难点?
告诉我。在下面留言。
我目前正在处理的一个真实案例是预测医疗服务提供者的爽约。在我正在处理的数据集中,大约 5% 的预约是爽约。其余的是赴约或已发生的预约。有趣的类别是爽约。
非常好,谢谢分享 Ken!
我关心的一个现实世界案例是预测赛马的获胜者。通常每场比赛平均有 11 匹赛马,其中 10 匹将是“0”,表示它们没有赢得比赛,而一匹赛马将是获胜者,为“1”。有趣的是,使用 GBM 我没有发现平衡有帮助,但也许我的平衡技术存在一些错误的视角。
有趣的问题。
我建议研究评级系统。
我从事潜在客户数据方面的工作,预测各种电信和潜在客户生成活动的呼叫中心销售额,其中响应总是失衡的。也就是说,销售与未销售,以及热门潜在客户与非潜在客户。我通常只是在将数据导入 Python 之前,从我的样本中随机抽取与积极响应等量的消极响应。由于业务的性质,呼叫中心数据响应总是失衡的。我渴望学习其他平衡响应的方法。
这听起来像是一种随机欠采样。
您可以尝试多种方法。我希望很快能在博客上分享一个框架,或者您可以查看我关于此主题的新书。
https://machinelearning.org.cn/imbalanced-classification-with-python/
将 flip_y 设置为零后,1 和 0 的创建方式非常独特,几乎没有重叠。它们似乎也与预测变量呈线性关系。
是的。
FBeta-score 作为精确度和召回率的组合很有趣,但你可以将其偏向精确度或召回率。对于博彩,精确度可能更重要,因为输掉的赌注会让你损失金钱,而假阴性虽然烦人但不会造成财务损失。
很好。这真的取决于领域。
我目前正在处理的一个不平衡分类的实际例子是大型分布式应用程序监控数据中的异常检测。
太棒了,谢谢!
不平衡数据的真实世界例子是服务器监控日志和尝试预测服务故障
听起来很棒!我渴望听到您的进展!
你好 Jason。感谢您这篇富有洞察力的文章!!
您的代码运行良好 Jason。但我无法理解这部分
for label, _ in counter.items(): (<— 这是为了遍历 counter.items() 字典)
row_ix = where(y == label)[0] (<— 这是否意味着 row_ix 等于仅属于类别 0 的那些计数器项的 x 值?)
pyplot.scatter(X[row_ix, 0], X[row_ix, 1], label=str(label)) (<— 绘制类别 0 和 1 的点)
能解释一下吗?我对 Python 不太熟练
谢谢。
我们遍历标签。
我们可以获取所有具有该标签的 y 示例的行索引。
然后我们用这些行索引绘制点。
客户流失和客户拒付是两个经典案例。
很棒的例子!
不平衡数据的真实世界示例是医学图像分类
很棒的例子!
现实世界中的恶意软件检测本质上是严重不平衡的。
非常好!
我曾使用 3 个类别的 A1C 水平预测 2 型糖尿病风险:无糖尿病 (77%)、糖尿病前期 (6%) 和糖尿病 (17%)。
好的,谢谢分享。
我处理的高度不平衡数据问题是预测用户广告点击,其中大部分是非点击(99%)和点击(1%)。
很好,谢谢分享!
第 1 课:类别不平衡的五个通用示例
1. 稀有和/或濒危物种的数量
2. 稀有疾病的发生率
3. 极端天气模式
4. 非必需品过度消费
5. 导致极高故障概率的机械问题
干得好!
我认为不平衡数据分类的错误分类成本对于每个类别来说是不同的,因为训练样本的数量不同。所以,性能指标可能取决于所有训练类别。
请给我一些关于我的看法的建议。
是的,尽管这取决于数据集的具体情况。
第 01 课答案:不平衡分类的挑战
1. 癌细胞预测
2. 垃圾邮件/非垃圾邮件分类
3. 地震预测
4. 页面块分类
5. 玻璃识别
干得好!
数据集将在原始数据集上平衡,还是我们需要先将其分割成训练集和测试集,然后平衡训练集?
我们只平衡训练数据集。
仅来自社会领域的示例
1. 富人/穷人数量
2. —“– 富裕/患病
3. —“– 出生/死亡
4. —“– 买家/卖家
5. —“– 欲望(愿望)/成就
太棒了!
先生,有哪些技术可以解决数据集中的不平衡问题
有很多
– 选择正确的指标
– 尝试数据过采样/欠采样
– 尝试成本敏感模型
– 尝试阈值移动
– 尝试一类模型
– 尝试专门的集成方法
– ……
将所有内容与默认模型进行比较,以证明它们增加了价值/技能。
另一个实时示例可以是预测在线门户的销售退货…
很棒的例子!
很棒的课程,真的很有帮助。
这里我有两个关于多数类和少数类建议权重的疑问。
(1) 就像示例中一样,假设 IR 给定为 99(标签 0 为 0.99,标签 1 为 0.01),您建议多数类权重为 0.01,少数类权重为 0.99。与权重相乘后结果将是平衡的。是否有任何参考文献和论文支持?
(2) 如果误分类错误的成本是预定义的(对于 FP 和 FN),但没有给出奖励(对于 TP 和 TN),那么遵循成本敏感性操作(即分配权重)仍然是一个好方法吗?
谢谢。
是的,也许从这里开始,它进一步解释了计算
https://machinelearning.org.cn/cost-sensitive-logistic-regression/
是的,也许从这里开始
https://machinelearning.org.cn/cost-sensitive-learning-for-imbalanced-classification/
生物识别中存在一个不平衡类别的例子。
通常的数据集具有 Nu 个个体/用户和每个个体 Ns_u 个样本。
从给定数据集的真实对和冒名顶替对中,我们获得两类匹配分数:真实分数和冒名顶替分数。
这包括 Nu*(Ns_u-1)*(Ns_u)/2 个真实分数和 (Ns_u^2)*Nu*(Nu-1)/2 个冒名顶替分数。
假设您有 100 个个体,每个个体有 10 个样本。
那么,您将有 4500 个真实分数和 495000 个冒名顶替分数。
这是多生物识别中一个重要问题,您需要训练一个分类器进行分数融合。
很好,谢谢分享!
不平衡类别的五个例子可能是:细胞中的癌症检测、检测有学习障碍的学生、呼叫中心接到意外主题的电话、贷款违约或从患者病历中检测罕见疾病。
非常好,谢谢分享!
嗨,Jason,
分享我作为不平衡分类第 1 天任务的示例。
1-检测高血糖患者
2-彩票中奖率
3-技术故障导致的通话中断
4-在 Tinder 上获得右滑(严重不平衡)
5-二月下雨的几率(在印度非常非常罕见)
6-在 Google Pay 中刮开礼品卡后获得现金返还(使用此应用程序付款的人可以很好地理解这个例子)
谢谢你
干得好!
我正在研究一个项目,预测具有某些人口特征的人是否可能通过邮件活动成为客户。数据集显示,只有 1.3% 的人成为客户。
听起来是一个很棒的项目!
你好 Jason,分享我的不平衡分类第 1 天示例
1. 检测医疗数据库中患有罕见遗传疾病的患者
2. 预测电话营销中的客户流失行为
3. 预测多视图人脸识别
4. 从医学图像中预测皮肤癌
5. 豹/猎豹分类
非常好!
第 01 课任务
我正在尝试建模一个 l2r 算法。相关性的衡量标准是,给定一个项目列表,那些被点击的项目比那些被看到但未被点击的项目更相关。
在我的示例数据集中,只有 6.5% 的项目是相关的,而其余 93.5% 则不是。
感谢分享。
1-如何在 Keras 中处理多标签分类的不平衡数据?
我正在处理一个不平衡数据集的多标签分类问题。我想用 SMOTE 进行过采样。但是,我不知道如何实现,因为标签是 [0,1,0,0,1,0,1,1,0,0,0,0] 这样的。
2-如何在 Keras 中为多标签数据集设置 class_weight?
您必须为给定指标或采样算法定义哪些类别是“正”的,哪些是“负”的。
以下是如何在 keras 中设置类别权重
https://machinelearning.org.cn/cost-sensitive-neural-network-for-imbalanced-classification/
嗨,Jason,
除了这些过采样 SMOTE 或其变体技术(例如“smoteenn”,包括欠采样 ENN)或仅随机欠采样,我最近了解到 Keras 还提供了一个工具作为“.fit”方法的参数,称为“class_weight”,您可以在其中以字典形式指定整数类别标签与要应用于每个类别标签的损失函数的加权百分比。请参阅参考:https://keras.org.cn/models/sequential/
您有没有关于这种 keras 技术的教程?它是否是基本的欠采样(过采样技术),例如在训练期间删除一些数据?这种 fit 参数 keras 方法与这里解释的方法(过采样和欠采样)之间主要区别是什么?
先谢谢了
致敬
你总是问最好的问题!我需要雇用你 🙂
是的,就在这里。
https://machinelearning.org.cn/cost-sensitive-neural-network-for-imbalanced-classification/
数据采样在拟合任何模型之前对数据集进行操作。
https://machinelearning.org.cn/data-sampling-methods-for-imbalanced-classification/
成本敏感学习是对模型本身的修改
https://machinelearning.org.cn/cost-sensitive-learning-for-imbalanced-classification/
非常感谢 Jason!
您不仅是一位伟大的 ML/DL 计算机工程师,还是一位出色的教授,取得了令人难以置信的推广成就,对我来说,您是最有价值、最伟大的人!
此致,
JG
谢谢 JG。
你好 Jason,感谢这门课程。
这是我想到的列表
1. 道路异常与良好路面
2. 正常地震活动传感器数据与火山爆发地震活动
3. 健康肺部 X 光图像与肺癌 X 光图像
4. 合法电子邮件与垃圾邮件
5. 正常海浪传感器数据与海啸波
干得好!
第 5 课 – 比较过采样后的类别分布
from collections import Counter
从 sklearn.datasets 导入 make_classification
from imblearn.over_sampling import SMOTE
# 生成数据集
X, y = make_classification(n_samples=10000, n_features=2, n_redundant=0,
n_clusters_per_class=1, weights=[0.99, 0.01],
flip_y=0, random_state=11)
# 总结类别分布
counter=Counter(y)
print(‘过采样前:’,counter)
fig, ax = plt.subplots(1,2,figsize=(15,5),constrained_layout=True)
# 按类别标签绘制样本散点图
for label, amount in counter.items()
row_ix = where(y == label)[0]
ax[0].scatter(X[row_ix, 0], X[row_ix, 1], label=str(label))
# 定义过采样策略
oversample = SMOTE(sampling_strategy=0.5)
# 拟合并应用变换
X_over, y_over = oversample.fit_resample(X, y)
# 总结类别分布
counter=Counter(y_over)
print(‘过采样后:’,counter)
# 按类别标签绘制样本散点图
for label, amount in counter.items()
row_ix = where(y_over == label)[0]
ax[1].scatter(X_over[row_ix, 0], X_over[row_ix, 1], label=str(label))
ax[1].legend
ax[1].set_title((‘过采样后’),fontsize=14)
ax[0].legend
ax[0].set_title((‘过采样前’),fontsize=14)
干得好!
非常棒的课程,谢谢 Jason!对于 Python 初学者来说尤其清晰。
谢谢!
但是,如果您有 sklearn 0.20+,这些过采样和欠采样方法不起作用…
ModuleNotFoundError: 没有名为“sklearn.externals.six”的模块
它们工作正常,但您必须更新到至少 sklearn v0.23.1 和 imblearn v0.6.2。
不平衡问题的例子
1. 任何异常检测(预测奥斯卡奖得主、挑选未来三个月上涨 1,000% 的股票、飓风或海啸预测等)
2. 边境违禁品检测
3. 大规模生产产品缺陷的自动检测
4. 从一年级学生中挑选未来的高中毕业生
事实上,不平衡问题 == 异常检测,所以 2-4 可以看作是 1 的更多例子。
干得好!
我目前正在进行的一个例子是土地覆盖分类。类别通常是不平衡的,最少和最常见的类别之间存在 1:100 的差异(即严重不平衡)是常见的。
如果是图像数据,这可能会有所帮助
https://machinelearning.org.cn/best-practices-for-preparing-and-augmenting-image-data-for-convolutional-neural-networks/
欺诈检测。
索赔预测
违约预测。
客户流失预测。
垃圾邮件检测。
异常检测。
离群值检测。
入侵检测
转化预测。
干得好!
嗨,Jason,
感谢您的课程!
我有一个快速问题。我正在处理一个分类问题,其中我有一个不平衡的数据集,为了解决这个问题,我简单地收集了更多数据,并且训练集的不平衡问题得到了解决。我构建了一个分类器,并以非常好的准确率、精确率和召回率对其进行了测试。现在我想用新收集的数据(未见过的数据)对其进行评估,但是这个评估集存在不平衡问题。这个集合用于测试模型以进行部署。在我看来,这个不平衡问题将永远存在。我应该怎么做才能确保我的模型已准备好部署?谢谢
好问题。
也许您可以仔细选择一个最能捕捉模型重要性的指标。
https://machinelearning.org.cn/tour-of-evaluation-metrics-for-imbalanced-classification/
也许您也可以为测试集获取更多数据?
第 4 课:欠采样
我正在进行一个预测网球比赛冷门的项目。我的数据集冷门与非冷门的比例大致为 1:4。在对非冷门进行欠采样后,我的逻辑回归模型有所改进。
重采样前:734 个非冷门,279 个冷门。
[[139 1]
[ 61 2]]
精确率 召回率 f1分数 支持数
0 0.69 0.99 0.82 140
1 0.67 0.03 0.06 63
准确率 0.69 203
宏平均 0.68 0.51 0.44 203
加权平均 0.69 0.69 0.58 203
ROC AUC:均值 0.668 (标准差 0.051)
欠采样后:558 个非冷门,279 个冷门
[[99 8]
[39 22]]
精确率 召回率 f1分数 支持数
0 0.72 0.93 0.81 107
1 0.73 0.36 0.48 61
准确率 0.72 168
宏平均 0.73 0.64 0.65 168
加权平均 0.72 0.72 0.69 168
ROC AUC:均值 0.728 (0.084)
正例的召回率有了很大的提高!我还看到了更高的 ROC AUC。
谢谢 Jason!
干得好!
第 5 课:过采样
与我的随机欠采样相比,过采样方法导致了更高的 ROC AUC 和 f1 分数。(通过随机实验,我发现采样策略为 0.62 时,两个指标都达到了最高值。)
欠采样结果:ROC AUC = 0.728 (0.084) f1 = 正例为 0.48
过采样结果:ROC AUC = 0.763 (0.056) f1 = 正例为 0.56
一个有趣的结果是,当我将 sampling_strategy 设置为 1 时,意味着它将精确地平衡这两个案例,ROC AUC 和 f1 分数急剧下降。我想这是因为我给代表性不足的一方添加了太多的随机性,以至于模糊了这些案例中的信息。
我还需要学习另一件事:在评估 f1 分数时,我一直关注我关心的案例(欠采样的一方)的分数。我的目标是能够预测何时会发生这种情况,并且假正例很少。是否有更好的分数供我评估?
谢谢 Jason!
干得好!
这有助于选择分数
https://machinelearning.org.cn/tour-of-evaluation-metrics-for-imbalanced-classification/
不平衡数据的一个例子是在钻井/套管油井时发生的严重情况。我的工作是预测套管问题,因为我遇到了钻井问题。
干得好!
你好先生。我一直是您的教程的追随者,它们多次对我很有用。所以首先感谢您。
我有一个问题,那就是,您在使用过采样/欠采样/SMOTEENN 等组合以及成本敏感学习方面的经验如何?我的意思是,您如何选择一种方法而不是另一种方法?我现在对如何决定欠采样、过采样或组合采样有了直觉。但这些似乎完全是同一个选项,即采样。而成本敏感学习似乎是一种完全不同的方法。那么,在不同的场景下,如何决定何时以及为何选择哪种方法呢?
(我的脑海中已经形成了两个集群:采样和成本敏感学习!!)
谢谢。
好问题,使用这个框架
https://machinelearning.org.cn/framework-for-imbalanced-classification-projects/
我目前正在处理的一个示例是虚假招聘信息分类
类别 0(非欺诈性):17014
类别 1(欺诈性):866
太棒了,谢谢分享!
首先,非常感谢Jason所做的一切工作。
我立即想到的一个不平衡学习的例子与罕见疾病的诊断有关。这让我想到,事实上,试图检测任何罕见事物,根据定义,都会导致不平衡分类问题。因此,这个列表可以扩展到在普遍性中寻找罕见事物,例如,检测假币、预测高尔夫中的一杆进洞,或者将流行的操作系统版本分类为有缺陷或无缺陷。
很好,谢谢分享。
一个不平衡类别的例子是申请人是否被新墨西哥大学、华盛顿大学和佛罗里达州立大学等学院的医学项目录取。
谢谢!
嗨,Jason,
感谢您一直提供出色的教程。我尝试注册免费课程,但从未收到电子邮件。请您帮忙。谢谢。
很抱歉听到这个消息,也许可以试试这里
https://machinelearningmastery.lpages.co/icwp-mini-course/
然后检查您所有的电子邮件文件夹,包括垃圾邮件。
谢谢。这个链接有效。
太棒了!
嗨 Jason,我为电信客户工作,我看到的大多数问题似乎都是不平衡分类问题
1. 电信客户流失问题
2. 携号转出分类
3. 电子邮件退订预测
4. 设备AAL/升级
根据我的理解,任何不平衡问题是指多数类和少数类之间的比例为1:100或更高的情况。当我们向模型提供这种倾斜的数据时,模型无法正确学习少数类。
然而,我的问题是,如果我的数据倾斜为1:100的比例,但我有大量数据,并且少数类样本超过50万,我们仍然需要平衡数据吗?或者说这么多少数类记录足以让模型理解?
干得好!
是的,针对这种情况有一系列技术,例如
https://machinelearning.org.cn/framework-for-imbalanced-classification-projects/
这也是我这本书的重点
https://machinelearning.org.cn/imbalanced-classification-with-python/
嗨,Jason,
不平衡分类的几个例子
1. 机场安检识别恐怖分子威胁旅行者。(TSA预检等)
2. 异常信用卡交易——欺诈检测
3. 根据植物属性检测杂草。
4. 数据中心服务器故障情况。
5. COVID-19暴露检测。
金舒克
干得好!
嗨,Jason,
非常感谢您的电子邮件教程……我有一些问题
我正在对银行贷款数据集进行建模。目标类别存在1:10的类别不平衡。我从您的课程中了解到,在这种情况下,召回率很重要,因为最大程度地减少误报很重要(银行有兴趣通过针对可能购买贷款的客户的营销活动来吸引客户,我想即使有不太可能购买的客户,他们也不会介意,但仍需要平衡)。
所以我的第一个问题是
1. 我是否只考虑在此处最大化召回率,而不使用F1分数(F1分数在这两者之间更平衡)?
2. 如果我考虑在召回率和精确率之间取得平衡,我理解我选择F1分数以及精确率召回曲线的AUC来平衡评估和比较模型性能。我的理解正确吗?
3. 我有一个关于F1分数与精确率召回AUC的问题。这两个分数是否等效,我可以选择其中任何一个来比较和评估不同的模型性能,或者AUC-PR是否包含比F1分数更多的信息,如果是,那是什么,以及我该如何解释?
谢谢
沙利尼
抱歉,我需要更正“我从您的课程中了解到,在这种情况下,召回率很重要,因为最大程度地减少误报很重要”
推广到
“我从您的课程中了解到,在这种情况下,召回率很重要,因为最大程度地减少漏报很重要”
不客气。
我认为最好关注f-measure分数,而不是仅仅关注召回率或精确率,例如,寻求一种平衡的考虑。
也许可以考虑f-beta并根据您的项目要求进行配置;
https://machinelearning.org.cn/fbeta-measure-for-machine-learning/
不,F1和精确召回AUC不等价,我推荐这个教程
https://machinelearning.org.cn/tour-of-evaluation-metrics-for-imbalanced-classification/
剖腹产预测
电子邮件分类,
电影评分,
肿瘤预测/分析,
糖尿病分析
农业作物预测
干得漂亮!
嗨,Jason,
根据我的观察
分类是不平衡的
990个“0”点——多数类
10个“1”点——10个少数类
干得好!
以下是一些导致类别不平衡的问题。
– 在制造过程中识别产品缺陷。
– 检测手机屏幕裂缝以申请保险。
– 从胸部X光片或MRI扫描图像中检测罕见疾病。
– 检测核反应堆的故障情况。
– 检测银行客户的可疑行为。
干得好!
运行第2课代码几次,得到这个观察结果。这发生在1和0完全重叠时。希望能在这里展示一张图片。
准确率:0.987
精确率:0.000
召回率:0.000
F-measure:0.000
抱歉,是第3课代码。
这是图片链接 – https://drive.google.com/file/d/1vlqXC9FPPmDSSE_J-yVUK9SaFIqccc7-/view?usp=sharing
干得好!
真实世界案例
1-感染新冠后谁会发展成急性呼吸窘迫综合征(ARDS,约1/20)
2-因新冠插管后谁更有可能死亡,因此是采取更绝望措施的候选人(约1/5)
3-哪些青少年根据社交媒体发帖和行为更容易有自杀风险(比例未知,但小于1~100)
4-哪些乳腺X光片包含足够的浸润性癌症证据(约0.5%)
5-哪一小部分女孩(或男孩)如果成为伴侣会让人感到快乐(估计为10E-7)。
干得好!
不平衡分类问题的五个一般示例
.
垃圾邮件检测。
异常检测。
离群值检测。
入侵检测
转化预测。
干得好!
我是一名研究员,目前在许多涉及不平衡数据的领域工作,例如
1- 早期发现癌前病变
2- 人机界面的语音欺骗检测
3- 城市声音分析
太棒了!
任务3
在重叠和权重=0.9的情况下,我得到了以下结果
准确率:0.898
精确率:0.491
召回率:0.540
F-measure:0.514
ROC-AUC:0.739
PR-AUC:0.538
这里ROC-AUC似乎高估了分类器。什么时候建议使用精确召回AUC以避免高估?
干得好!
好问题,请参阅此教程了解如何选择指标
https://machinelearning.org.cn/tour-of-evaluation-metrics-for-imbalanced-classification/
异常检测
垃圾邮件/非垃圾邮件检测
盗电
客户流失率
发动机等级预测(0/1)
干得好!
亲爱的 Jason,
非常感谢您的分享。
我正在尝试使用基于不平衡数据集拟合的ML模型进行预测。我只想问一下如何才能精确地在预测分布中重现训练分布?这对于我的研究非常重要。
先谢谢您了。
诚挚的问候
我们使用数据的随机样本或分层随机样本来训练和评估模型。
大多数模型假设样本是独立同分布的(iid)
https://zh.wikipedia.org/wiki/独立同分布随机变量
那么,我们不能精确地重现预测的类别分布吗?
抱歉,我不太明白——我认为我们没有在同一个频道上交流。也许您可以详细阐述您的问题?
很抱歉我的误解。
例如,我有一个包含两个类别的训练数据集(35%为类别1,65%为类别2)。
我将使用一个已拟合的模型对一个预测数据集进行预测。我必须为这个数据集生成相同的类别分布(35%为类别1,65%为类别2)。
训练数据集 - 100个样本 - 35%为类别1,65%为类别2
预测数据集 - 500个样本 - 35%为类别1,65%为类别2
这可能吗?
是的,这被称为分层抽样,您可以在这里了解更多
https://machinelearning.org.cn/cross-validation-for-imbalanced-classification/
使用 smoteenn 进行重新采样时花费了很长时间
也许可以尝试使用更少的数据,直到你看看它是否有帮助?
感谢您的本教程!
第7课(成本敏感学习)中的代码能否用于序列模型而非仅回归?
我不明白为什么不行。试试看吧。
类别不平衡示例
->收到电子邮件并购买昂贵产品的客户的转化率
->任何类型的疾病或疾病检测
->消费超过平均消费80%的客户(高价值客户检测)
->客户流失预测
干得好!
嗨 Jason,对处理不平衡的基本方法进行了简明扼要的解释!
我们如何在keras中有效使用它们?或者有什么特殊的工具吗?
当然,我们可以在将整个数据集输入神经网络之前进行过采样/欠采样,但这种方法似乎很粗糙……
我们应该将不平衡问题交给某种生成器,在每个epoch之前甚至在batch级别更新输入吗?
没有特殊的工具。scikit-learn 中可能有一些方便的函数可以帮助您预处理数据,但最重要的是要了解概念并在输入网络之前应用它。使用什么工具并不是那么关键。
我可能会预测工业过程中的故障。这是一种罕见的情况,但总的来说影响很大。
速成班结束后,我仍然有一个疑问。
我如何使用创建的欠采样和过采样样本来训练我的模型?
我应该从我新的欠采样和过采样样本中创建 X_train、X_test、y_train、y_test,还是只对原始基础中的 X_train 和 y_train 进行欠采样和过采样?
我认为从原始基础创建更简单。你觉得这种方法有什么问题吗?
实际上,我一直在尝试自己观察。
https://github.com/IsmaelMiranda11/cienciadedados/blob/main/classes%20desbalanceadas
类别不平衡可见于
1. 情感分析中,我们看到更多正面评价
2. 电子邮件是否是垃圾邮件——大多数电子邮件都是垃圾邮件
3. 产品保修期满后是否需要服务——大多数情况会是肯定
4. 接种疫苗后的症状——大多数情况会是肯定
5. 购买手机时是否购买了屏幕保护膜——大多数情况是肯定。
我有一个关于真阳性(TP)案例的问题。让我以泰坦尼克号Kaggle问题为例,挑战是预测一个人是否会幸存或死亡。如果死亡是0,幸存是1。在这种情况下,TP是幸存并被报告幸存的人。如果在相同情景下,死亡是1,幸存是0。那么,在这种情况下,TP是死亡并被报告死亡的人。
你说得对。一个标签是正还是负是主观的设计选择。但有时我们更倾向于将某些东西称为正,因为我们想关注它(例如,疾病,我们关心感染者,并假设未感染者是正常的,而较少关注)。
你好 Jason,
感谢您的精彩课程!
我有一个关于使用SMOTE平衡稀有事件数据的问题。我的数据事件率约为7%。我使用SMOTE将事件率提高到约40%。现在我想使用SMOTE模型来预测新患者的风险,我该如何调整或修正新患者的风险概率,以反映原始数据(未SMOTE)中7%的风险概率。
新数据使用SMOTE后的风险概率为30% – 50%,我得到的反馈是风险不应远离7%。
希望我的问题说得清楚。
谢谢!
恐怕你在这里有所误解。SMOTE旨在帮助你生成更多数据,从而帮助你的模型训练(否则,盲目猜测多数类会自动给你1-7% = 93%的准确率);但是一旦你的模型训练完成,你应用SMOTE之前的原始数据,你就应该大致看到它在实践中的表现。你不需要做任何其他事情。
非常感谢Jason博士的这门精彩的短期课程,它解答了我对不平衡分类的许多疑问。
我需要您的建议,因为我正在处理一个严重不平衡的多类别模型。输出标签是1、2、3,它们分别是(类别1:94%,类别2:3%,类别3:3%)。正如您所怀疑的,捕获类别2、3比类别1更重要。我正在使用多项逻辑回归,我尝试了过采样,但模型性能很低,例如f1分数是45%。我尝试使用类别权重作为字典,但没有找到正确的组合,我的问题是大多数文章都处理二元输出的不平衡分类,而不是多类别。您有什么建议吗?或者我可以参考的文章/资源?
非常感谢
嗨,莉莉……您可能需要考虑集成学习来提高准确性
https://machinelearning.org.cn/ensemble-diversity-for-machine-learning/
谢谢你,詹姆斯,集成学习的问题在于我只能使用逻辑回归作为VotingClassifier中的贡献模型,因为多项逻辑回归是我能找到的唯一可以预测多类别(而非仅二项式)的模型。你有什么建议吗?
非常感谢
嗨,Jason,
不平衡分类的一些例子
– 根据电能质量分析仪数据预测停电
– 用于检测设备故障的条件监测
– 医学诊断图像分类
– 欺诈检测
– 异常检测
完全正确,Fikret!继续努力!
不平衡分类的例子
恐怖分子乘客检测(机场等)
电影票预订
异常检测。
离群值检测。
转化
感谢HR对我们讨论的贡献!请随时向我们报告您的进展!
既然有过采样,为什么还要欠采样呢?