技术分析:计算机视觉与机器学习等领域不平衡数据处理综述
简介在现实世界中,我们收集的数据在大多数时候是严重不平衡的,所谓不平衡数据集就是训练样本不是平均分布在目标类中,例如,如果我们以个人贷款分类问题为例,就很容易得到“未批准”的数据,而不是“已批准”的信息,结果,模型会更偏向具有大量训练实例的类,这降低了模型的预测能力。在典型的二元分类问题中,它还会II型错误的增加。这一障碍不仅局限于机器学习模型,而且也主要存在于计算机视觉和自然语言处理领域。这些问题可以通过对每个区域分别使用不同的技术来有效地处理。注意:本文将简要概述各种可用的数据增强方法,但不深入技术细节,这里展示的所有图像都来自Kaggle。
目录
- 机器学习——不平衡数据(上采样和下采样)
- 计算机视觉——不平衡数据(图像数据增强)
NLP——不平衡数据(Google交易和分类权重)
1. 机器学习——不平衡数据
处理类不平衡的两种主要方法是上采样/过采样和下采样/欠采样。抽样过程只应用于训练集,对验证和测试数据不作任何更改。python中的Imblearn库可以方便地实现数据重采样。上采样是将合成生成的数据点(对应于少数类)注入数据集的过程,在这个过程之后,两个标签的计数几乎是相同的,这种均衡过程防止了模型向多数类倾斜,而且目标类之间的交互(边界)保持不变,同时,上采样机制由于附加信息的存在而给系统带来偏差。我们可以通过分析Google Analytics的贷款预测问题来解释这些步骤。这里使用的训练数据集可以在以下链接中找到。
SMOTE(SyntheticMinorityOversamplingTechnique)——upsampling: 上采样SMOTE基于knearestneighbors算法,综合生成数据点,这些数据点位于已经存在的数量被超过的群体附近。应用此方法时,输入记录不应包含任何空值。
#import imblearn library
from imblearn.over_sampling import SMOTENC
oversample = SMOTENC(categorical_features=[0,1,2,3,4,9,10], random_state = 100)
X, y = oversample.fit_resample(X, y)
datduplicate—upsampling: 在这种方法中,已存在的数据点被随机抽取并重复。from sklearn.utils import resample
maxcount = 332
train_nonnull_resampled = train_nonnull[0:0]
for grp in train_nonnull['Loan_Status'].unique():
GrpDF = train_nonnull[train_nonnull['Loan_Status'] == grp]
resampled = resample(GrpDF, replace=True, n_samples=int(maxcount), random_state=123)
train_nonnull_resampled = train_nonnull_resampled.append(resampled)
下采样是一种减少训练样本落在多数类下的机制。因为它有助于平衡目标类别的计数,但删除收集到的数据,我们往往会丢失很多有价值的信息。
Tomek (T-Links): -
T-Link基本上是来自不同类(最近的邻居)的一对数据点,其目标是丢弃与多数类(数量较多的类)相对应的样本,从而减少占主导地位的标签的数量。这也增加了两个标签之间的边界空间,从而提高了性能准确性。
from imblearn.under_sampling import TomekLinks
undersample = TomekLinks()
X, y = undersample.fit_resample(X, y)
质心
2. 计算机视觉——不平衡数据
对于非结构化数据,如图像和文本输入,上述平衡技术将不会有效。在计算机视觉中,模型的输入是图像中像素的张量表示,所以只是随机改变像素值(为了添加更多的输入记录)就可以完全改变图片本身的意义。有一种概念叫做数据增强,即图像经过大量转换后仍然保持其意义不变。各种图像转换包括缩放、剪切、翻转、填充、旋转、亮度、对比度和饱和度变化,通过这样做,仅使用单个图像,就可以创建一个庞大的图像数据集。让我们看看Analyticsvidhya中发布的计算机视觉hackathon,使用的数据集可以在这里找到。
要求是将车辆分为紧急和非紧急两类。为了便于说明,我们使用“0.jpg”图像。
from keras.preprocessing.image import 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,
horizontal_flip=True,
fill_mode='nearest')
img = load_img('images/0.jpg')
x = img_to_array(img)
x = x.reshape((1,) + x.shape)
print(x.shape)
# the .flow() command below generates batches of randomly transformed images
# and saves the results to the `preview/` directory
i = 0
for batch in datagen.flow(x, batch_size=1,
save_to_dir='preview', save_prefix='vehichle', save_format='jpeg'):
i += 1
if i > 19:
break # otherwise the generator would loop indefinitely
在GitHub存储库中可以找到整个代码和一个预训练过的模型。
3. NLP——不平衡数据
自然语言处理模型处理序列数据,如文本、移动图像,其中当前数据与之前的数据有时间依赖性。由于文本输入属于非结构化数据,所以我们要以不同的方式处理这些场景。例如,以票据分类语言模型为例,其中IT票据必须根据输入文本中出现的单词顺序分配给不同的组。谷歌翻译(google trans python包): 这是扩展少数群体数量的有用技术之一。
在这里,我们把给定的句子翻译成“非英语”语言,然后再翻译成“英语”,通过这种方式,可以维护输入消息的重要细节,但是单词的顺序/有时具有相似意义的新词作为新记录引入,从而增加了不足类的计数。输入文字- "warning for using windows disk space"数据补充文字-“Warning about using Windows storage space”即使上面的句子的意思是一样的,它也引入了新单词,从而通过扩大输入样本的数量来提高语言模型的学习能力。下面执行的代码可以在GitHub存储库中找到。googletrans.readthedocs.io/en/latest/from googletrans import Translatortranslator = Translator()
def German_translation(x): print(x) german_translation = translator.translate(x, dest='de') return german_translation.text
def English_translation(x): print(x)
english_translation = translator.translate(x, dest='en') return english_translation.text
x = German_translation("warning for using windows disk space")
English_translation(x)
类权重: 该方法是在拟合模型过程中利用类权重参数。对于目标中的每个类别,都分配一个权重,与多数类相比,少数类将获得更多的权重,因此,在反向传播过程中,与少数类相关联的损失值越大,模型会对输出中的所有类一视同仁。import numpy as np
from tensorflow import keras
from sklearn.utils.class_weight import 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(enumerate(class_weights))
history = model.fit(input_final, raw_y_train, batch_size=32, class_weight = d_class_weights, epochs=8,callbacks=[checkpoint,reduceLoss],validation_data =(val_final, raw_y_val), verbose=1)
这个选项在机器学习分类器中也可用,如我们给class_weight = ' balanced '的' SVM '。# fit the training dataset on the classifier
SVM = svm.SVC(C=1.0, kernel='linear', degree=3, gamma='auto', class_weight='balanced', random_state=100)
结论到目前为止,我们已经讨论了不同领域处理不平衡数据的各种方法,如机器学习、计算机视觉和自然语言处理。尽管这些方法只是解决多数Vs少数目标群体问题的开始,还有其他先进的技术可以进一步探索。