处理不平衡数据–
机器学习,计算机视觉和NLP
在现实世界中,大多数时候我们收集的数据会严重失衡。那么,什么是不平衡数据集?训练样本在目标类别之间分布不均。例如,如果我们以个人贷款分类问题为例,则与“已批准”的详细信息相比,毫不费力地获取“未批准”的数据。结果,模型更偏向具有大量训练实例的类,这降低了模型的预测能力。
在典型的二进制分类问题中,这还会导致II型错误的增加。这个绊脚石不仅限于机器学习模型,而且还可以在计算机视觉和NLP领域中主要观察到。通过对每个区域分别使用不同的技术,可以有效地解决这些问题。
注意:本文将简要概述可用的各种数据增强方法,而无需深入技术细节。此处显示的所有图像均来自Kaggle。
目录
机器学习–不平衡数据(上采样和下采样)
计算机视觉–不平衡数据(图像数据增强)
NLP-数据不平衡(Google交易和分类权重)
(1)。机器学习–不平衡数据:
解决类不平衡的主要两种方法是上采样/过采样和下采样/欠采样。采样过程仅应用于训练集,而对验证和测试数据不做任何更改。python中的Imblearn库可方便地实现数据重采样。
上采样是将合成生成的数据点(对应于少数类)注入数据集中的过程。在此过程之后,两个标签的计数几乎相同。此均衡过程可防止模型向多数类倾斜。此外,目标类别之间的交互作用(边界线)保持不变。而且,由于附加信息,上采样机制将偏差引入了系统。
我们可以采用Analytics Vidhya的贷款预测问题来解释这些步骤。可在hackathon链接中找到此处使用的训练数据集。
下面提到的所有代码都可以在GitHub存储库中找到。
SMOTE(SyntheticMinorityOversamplingTechnique)—上采样:-
它基于KNearestNeighbours算法工作,综合生成落在已经存在的数量超出的组附近的数据点。应用此方法时,输入记录不应包含任何null值。
#import imblearn库
从imblearn.over_sampling导入SMOTENC
过采样= SMOTENC(categorical_features = [0
X,y = oversample.fit_resample(X,y)
DataDuplication —上采样:-用这种方法,随机选择和复制对应于已标注标签的现有数据点。
从sklearn.utils导入重新采样
最大数量= 332
train_nonnull_resampled = train_nonnull [0:0]
对于train_nonnull ['Loan_Status']。unique()中的grp:
GrpDF = train_nonnull [train_nonnull ['Loan_Status'] == grp]
重新采样=重新采样(GrpDF,replace = True,n_samples = int(maxcount),random_state = 123)
train_nonnull_resampled = train_nonnull_resampled.append(重新采样)
下采样 是一种减少大多数类别下的训练样本数量的机制。因为它有助于均衡目标类别的数量。通过删除收集的数据,我们往往会丢失大量有价值的信息。
数据不平衡
Tomek(T-Links):-
T-Link基本上是一对来自不同类别(最近邻居)的数据点。目的是丢弃对应于
多数的样品,从而使主要标签的数量最少。这也增加了两个标签之间的边界空间,从而提高了性能精度。
数据不平衡
从imblearn.under_sampling导入TomekLinks
欠采样= TomekLinks()
X,y = undersample.fit_resample(X,y)
基于质心:-该算法尝试找到多数类中的同质簇,并且仅保留质心。这将减少多数标签的最大份额。它利用了KMeans集群中使用的逻辑。但是浪费了很多有用的信息。
(2)。计算机视觉–不平衡数据:
对于诸如图像和文本输入之类的非结构化数据,上述平衡技术将无效。在计算机视觉的情况下,模型的输入是图像中存在的像素的张量表示。因此,仅随机更改像素值(以添加更多输入记录)就可以完全改变图片本身的含义。有一个称为数据增强的概念,其中图像经过了很多转换,但仍保持其含义不变。
各种图像变换包括缩放,剪裁,翻转,填充,旋转,亮度,对比度,饱和度水平的变化。这样,仅用一个图像,就可以创建巨大的图像数据集。
让我们来看看Analyticsvidhya中发布的计算机视觉黑客马拉松,可以在这里找到使用的数据集。要求是将车辆分为紧急和非紧急类别。为了说明的目的,考虑图像“ 0.jpg”。
不平衡
从keras.preprocessing.image导入ImageDataGenerator,array_to_img,img_to_array,load_img
datagen = ImageDataGenerator(
rotation_range = 40,
width_shift_range = 0.2,
height_shift_range = 0.2,
shear_range = 0.2,
zoom_range = 0.2,
horizo??ntal_flip =真实,
fill_mode ='nearest')
img = load_img('images / 0.jpg')
x = img_to_array(img)
x = x.reshape(((1,)+ x.shape)
打印(x.shape)
#下面的.flow()命令生成一批随机变换的图像
#并将结果保存到`preview /`目录中
我= 0
对于datagen.flow(x,batch_size = 1,
save_to_dir ='预览',save_prefix ='vehichle',save_format ='jpeg'):
我+ = 1
如果我> 19:
break#否则生成器将无限循环
完整代码以及经过预训练的模型可以在GitHub存储库中找到。
可以参考该链接以获取ImageDataGenerator的详细用法。
(3)。NLP –不平衡数据:
自然语言处理模型处理诸如文本,运动图像之类的顺序数据,其中当前数据与先前数据具有时间依赖性。由于文本输入属于非结构化数据的类别,因此我们对这种情况的处理方式有所不同。例如,如果采用票证分类语言模型,则必须根据输入文本中出现的单词顺序将IT票证分配给各个组。
Google翻译(google trans python软件包): 这是扩展少数群体数量的有用技术之一。在这里,我们将给定的句子翻译为“非英语”语言,然后再次翻译为“英语”。以这种方式,保持了输入消息的重要细节,但是将词的顺序/有时将具有相似含义的新词作为新记录引入,从而增加了不足类的数量。
数据不平衡
数据不平衡
输入文本–“使用Windows磁盘空间的警告”
数据增强文本–“有关使用Windows存储空间的警告”
即使以上句子的含义相同,也引入了新词,因此通过扩展输入样本数来增强语言模型的学习能力。
可以在GitHub存储库中找到以下执行的代码。此示例仅包含一个非英语代码。它们很多,可以在google trans中使用的语言代码的完整列表可以在这里找到。
从googletrans导入Translatortranslator = Translator()
def German_translation(x):print(x)german_translation = translator.translate(x,dest ='de')返回german_translation.text
def English_translation(x):打印(x)
english_translation = translator.translate(x,dest ='en')返回english_translation.text
x = German_translation(“警告使用Windows磁盘空间”)
English_translation(x)
类权重: 第二个选择是在拟合模型过程中利用类权重参数。对于目标中的每个类别,将分配一个权重。与多数班相比,少数班将获得更多权重。结果,在反向传播期间,更多的损耗值与少数类相关联,并且模型将对输出中存在的所有类给予同等的关注。
将numpy导入为np
从tensorflow import keras
从sklearn.utils.class_weight导入compute_class_weight
y_integers = np.argmax(raw_y_train,axis = 1)
class_weights = compute_class_weight('balanced',np.unique(y_integers),y_integers)
d_class_weights = dict(枚举(class_weights))
历史记录= model.fit(input_final,raw_y_train,batch_size = 32,class_weight = d_class_weights,epochs = 8,回调= [checkpoint,reduceLoss],validation_data =(val_final,raw_y_val),详细= 1)
此选项在机器学习分类器(例如“ SVM”)中也可用,我们在其中将class_weight ='balanced'给出。
#使训练数据集适合分类器
SVM = svm.SVC(C = 1.0,内核='线性',度= 3,伽马='自动',class_weight ='balanced',random_state = 100)
可以在GitHub链接中找到使用类权重的整个python代码。
题库