如何建立一种检测漏油的不平衡分类模型
许多不平衡的分类任务需要一个熟练的模型来预测清晰的类别标签,其中两个类别同等重要。
不平衡分类问题的一个例子是检测卫星图像中的漏油或浮油,其中需要一个类别标签,并且两个类别同等重要。检测漏油需要动员昂贵的响应,而错过事件同样代价高昂,会造成环境破坏。
评估预测清晰标签的不平衡分类模型的一种方法是分别计算正类和负类的准确率,即灵敏度和特异性。然后可以使用几何平均值(称为 G 均值)对这两个指标进行平均,该几何平均值对倾斜的类别分布不敏感,并能正确报告模型在两个类别上的技能。
在本教程中,您将了解如何开发一个模型来预测卫星图像中是否存在漏油,并使用 G 均值指标对其进行评估。
完成本教程后,您将了解:
- 如何加载和探索数据集并为数据准备和模型选择产生想法。
- 如何评估一套概率模型并通过适当的数据准备来提高其性能。
- 如何拟合最终模型并用它来预测特定情况的类标签。
教程概述
本教程分为五个部分,分别是:
-
石油泄漏数据集
-
探索数据集
-
模型试验及基线结果
-
评估模型
- 评估概率模型
- 评估平衡逻辑回归
- 使用概率模型评估重采样
-
对新数据进行预测
石油泄漏数据集
在这个项目中,我们将使用一个标准的不平衡机器学习数据集,称为“漏油”数据集、“浮油”数据集或简称为“石油”。
该数据集由Miroslav Kubat等人在 1998 年的论文《机器学习在卫星雷达图像中检测漏油》中引入。该数据集通常归功于该论文的合著者Robert Holte 。
该数据集是从海洋卫星图像开始开发的,其中一些包含石油泄漏,一些则没有。图像被分成几部分,并使用计算机视觉算法进行处理,以提供特征向量来描述图像部分或补丁的内容。
[系统] 的输入是来自雷达卫星的原始像素图像,使用图像处理技术 […] 图像处理的输出是每个可疑区域的固定长度特征向量。在正常运行期间,这些特征向量被输入到分类器中,以决定哪些图像和图像中的哪些区域可供人工检查。
—机器学习用于检测卫星雷达图像中的漏油,1998 年。
该任务给出一个描述卫星图像块内容的向量,然后预测该块是否包含漏油,例如非法或意外向海洋倾倒石油。
共有 937 个案例。每个案例由 48 个数值计算机视觉衍生特征、一个补丁编号和一个类标签组成。
总共有九张卫星图像被处理成补丁。数据集中的案例按图像排序,数据集的第一列表示图像的补丁编号。这是为了评估每张图像的模型性能而提供的。在这种情况下,我们对图像或补丁编号不感兴趣,可以删除第一列。
正常情况是没有漏油,其类别标签为 0,而漏油则用类别标签 1 表示。没有漏油的情况有 896 个,漏油的情况有 41 个。
漏油领域的第二个关键特征可以称为不平衡训练集:与浮油相似的负面示例比正面示例多得多。与 41 个正面示例相比,我们有 896 个负面示例,因此多数类几乎占数据的 96%。
我们无法访问用于从卫星图像中准备计算机视觉特征的程序,因此我们只能使用收集并提供的提取特征。
接下来我们来仔细看一下数据。
探索数据集
首先,下载数据集并将其保存在当前工作目录中,名称为“ oil-spill.csv ”
查看文件的内容。
该文件的前几行应如下所示:
1,2558,1506.09,456.63,90,6395000,40.88,7.89,29780,0.19,214.7,0.21,0.26,0.49,0.1,0.4,99.59,32.19,1.84,0.16,0.2,87.65,0,0.47,132.78,-0.01,3.78,0.22,3.2,-3.71,-0.18,2.19,0,2.19,310,16110,0,138.68,89,69,2850,1000,763.16,135.46,3.73,0,33243.19,65.74,7.95,1
2,22325,79.11,841.03,180,55812500,51.11,1.21,61900,0.02,901.7,0.02,0.03,0.11,0.01,0.11,6058.23,4061.15,2.3,0.02,0.02,87.65,0,0.58,132.78,-0.01,3.78,0.84,7.09,-2.21,0,0,0,0,704,40140,0,68.65,89,69,5750,11500,9593.48,1648.8,0.6,0,51572.04,65.73,6.26,0
3,115,1449.85,608.43,88,287500,40.42,7.34,3340,0.18,86.1,0.21,0.32,0.5,0.17,0.34,71.2,16.73,1.82,0.19,0.29,87.65,0,0.46,132.78,-0.01,3.78,0.7,4.79,-3.36,-0.23,1.95,0,1.95,29,1530,0.01,38.8,89,69,1400,250,150,45.13,9.33,1,31692.84,65.81,7.84,1
4,1201,1562.53,295.65,66,3002500,42.4,7.97,18030,0.19,166.5,0.21,0.26,0.48,0.1,0.38,120.22,33.47,1.91,0.16,0.21,87.65,0,0.48,132.78,-0.01,3.78,0.84,6.78,-3.54,-0.33,2.2,0,2.2,183,10080,0,108.27,89,69,6041.52,761.58,453.21,144.97,13.33,1,37696.21,65.67,8.07,1
5,312,950.27,440.86,37,780000,41.43,7.03,3350,0.17,232.8,0.15,0.19,0.35,0.09,0.26,289.19,48.68,1.86,0.13,0.16,87.65,0,0.47,132.78,-0.01,3.78,0.02,2.28,-3.44,-0.44,2.19,0,2.19,45,2340,0,14.39,89,69,1320.04,710.63,512.54,109.16,2.58,0,29038.17,65.66,7.35,0
...
我们可以看到第一列包含表示补丁编号的整数。我们还可以看到计算机视觉派生的特征是实数值,具有不同的尺度,例如第二列中的千位和其他列中的分数。
所有输入变量都是数字,并且没有用“ ? ”字符标记的缺失值。
首先,我们可以加载CSV数据集并确认行数和列数。
可以使用read_csv() Pandas 函数将数据集加载为 DataFrame ,并指定位置和没有标题行的事实。
| 1 | ... |
|---|---|
| 2 | # define the dataset location |
| 3 | filename = 'oil-spill.csv' |
| 4 | # load the csv file as a data frame |
| 5 | dataframe = read_csv(filename, header=None) |
加载后,我们可以通过打印DataFrame的形状来汇总行数和列数。
...
# summarize the shape of the dataset
print(dataframe.shape)
我们还可以使用Counter对象来汇总每个类中的示例数量。
...
# summarize the class distribution
target = dataframe.values[:,-1]
counter = Counter(target)
for k,v in counter.items():
per = v / len(target) * 100
print('Class=%d, Count=%d, Percentage=%.3f%%' % (k, v, per))
综合以上几点,下面列出了加载和汇总数据集的完整示例。
# load and summarize the dataset
from pandas import read_csv
from collections import Counter
# define the dataset location
filename = 'oil-spill.csv'
# load the csv file as a data frame
dataframe = read_csv(filename, header=None)
# summarize the shape of the dataset
print(dataframe.shape)
# summarize the class distribution
target = dataframe.values[:,-1]
counter = Counter(target)
for k,v in counter.items():
per = v / len(target) * 100
print('Class=%d, Count=%d, Percentage=%.3f%%' % (k, v, per))
运行示例首先加载数据集并确认行数和列数。
然后总结类别分布,确认漏油和非漏油的数量以及少数和多数类别中病例的百分比。
(937, 50)
Class=1, Count=41, Percentage=4.376%
Class=0, Count=896, Percentage=95.624%
我们还可以通过为每个变量创建直方图来查看每个变量的分布。
有 50 个变量,图表数量很多,但我们可能会发现一些有趣的模式。此外,由于图表数量如此之多,我们必须关闭轴标签和图表标题以减少混乱。完整示例如下。
# create histograms of each variable
from pandas import read_csv
from matplotlib import pyplot
# define the dataset location
filename = 'oil-spill.csv'
# load the csv file as a data frame
dataframe = read_csv(filename, header=None)
# create a histogram plot of each variable
ax = dataframe.hist()
# disable axis labels
for axis in ax.flatten():
axis.set_title('')
axis.set_xticklabels([])
axis.set_yticklabels([])
pyplot.show()
运行该示例将为数据集中的 50 个变量中的每一个变量创建一个直方图子图。
我们可以看到许多不同的分布,一些具有高斯分布,另一些具有看似指数或离散的分布。
根据建模算法的选择,我们希望将分布缩放到相同范围是有用的,并且可能使用一些功率变换。


1295

被折叠的 条评论
为什么被折叠?



