参考网址:https://datawhatnow.com/pseudo-labeling-semi-supervised-learning/

每一个机器学习项目的基础都是数据——这是你离不开的东西。在这篇文章中,我将展示一种称为伪标记的简单半监督学习方法,它可以利用未标记的数据提高您最喜欢的机器学习模型的性能。

伪标签

为了训练具有监督学习的机器学习模型,必须对数据进行标记。这是否意味着未标记的数据对于分类和回归等监督任务是无用的?当然不!除了将额外的数据用于分析目的之外,我们甚至可以用它来帮助用半监督学习来训练我们的模型——结合未标记和标记数据来进行模型训练。

其主要思想很简单。首先,在标记数据上训练模型,然后使用训练后的模型预测未标记数据上的标签,从而创建伪标签。此外,将标记数据和新伪标记数据合并到用于培训数据的新数据集中。

当 fast.ai MOOC (original paper)提到这个方法时,我受到了启发,开始尝试这个方法。虽然这个方法是在深度学习(在线算法)的背景下提到的,但是我在传统的机器学习模型上进行了尝试,并得到了一些改进。

数据预处理和探索

在比赛中,比如 Kaggle上的比赛,参赛者接收训练集(标记数据)和测试集(未标记数据)。这是测试伪标记的好地方。我们将使用的数据集来自the Mercedes-Benz Greener Manufacturing competition——目标是基于汽车的特性(回归)预测测试的持续时间。和往常一样,所有带有附加描述的代码都可以在这个notebook中找到。

import pandas as pd
# Load the data
train = pd.read_csv('input/train.csv')
test = pd.read_csv('input/test.csv')
print(train.shape, test.shape)
# (4209, 378) (4209, 377)

可以看出,训练数据集并不理想,数据点的数量较少(4209),特征较多(376)。为了改进数据集,我们应该减少特征的数量,并尽可能增加数据点的数量。我在前一篇博客文章中讨论了特性的重要性(特性减少),这个主题将被跳过,因为这篇博客文章的主要关注点是增加带有伪标记的数据点的数量。该数据集体积小,标记与未标记数据的比例为1:1,适合于伪标记。

下表显示了整个培训数据集的子集。特性X0-X8是分类变量,我们必须将它们转换成模型可用的形式——数值。

这是使用scikit-learn的LabelEncoder类完成的。

from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
features = train.columns[2:]
for column_name in features:label_encoder = LabelEncoder() # Get the column valuestrain_column_values = list(train[column_name].values)test_column_values = list(test[column_name].values)# Fit the label encoderlabel_encoder.fit(train_column_values + test_column_values)# Transform the featuretrain[column_name] = label_encoder.transform(train_column_values)test[column_name] = label_encoder.transform(test_column_values)

结果:

现在,数据已经为我们的机器学习模型准备好了。

使用Python和scikit-learn实现伪标记

让我们创建一个函数来创建由伪标记和标记数据组成的“增强训练集”。函数的参数包括模型、训练和测试集信息(数据和特性)以及参数sample_rate。Sample_rate允许我们控制将与真正的标记数据混合的伪标记数据的百分比。将sample_rate设置为0.0意味着模型将只使用真实的标记数据,而sample_rate 0.5意味着模型将使用所有真实的标记数据和一半的伪标记数据。无论哪种情况,模型都将使用所有真正标记的数据。

def create_augmented_train(X, y, model, test, features, target, sample_rate):'''Create and return the augmented_train set that consistsof pseudo-labeled and labeled data.'''num_of_samples = int(len(test) * sample_rate)# Train the model and creat the pseudo-labelesmodel.fit(X, y)pseudo_labeles = model.predict(test[features])# Add the pseudo-labeles to the test setaugmented_test = test.copy(deep=True)augmented_test[target] = pseudo_labeles# Take a subset of the test set with pseudo-labeles and append in onto# the training setsampled_test = augmented_test.sample(n=num_of_samples)temp_train = pd.concat([X, y], axis=1)augemented_train = pd.concat([sampled_test, temp_train])# Shuffle the augmented dataset and return itreturn shuffle(augemented_train)

此外,我们还需要一种拟合方法——一种训练模型的方法——它将采用增强训练集并使用它训练模型。这是另一个函数,我们之前写的那个函数已经有很多参数了。这是一个很好的机会,可以创建一个类来增强内聚性,使代码更干净,并将方法放入该类中。我们将创建的类将被称为PseudoLabeler。它将使用一个scikit-learn模型,并使用增强训练集对其进行训练。scikit-learn允许我们创建自己的回归函数,但我们必须遵循它们的库标准。

from sklearn.utils import shuffle
from sklearn.base import BaseEstimator, RegressorMixin
class PseudoLabeler(BaseEstimator, RegressorMixin):def __init__(self, model, test, features, target, sample_rate=0.2, seed=42):self.sample_rate = sample_rateself.seed = seedself.model = modelself.model.seed = seedself.test = testself.features = featuresself.target = targetdef get_params(self, deep=True):return {"sample_rate": self.sample_rate,"seed": self.seed,"model": self.model,"test": self.test,"features": self.features,"target": self.target}def set_params(self, **parameters):for parameter, value in parameters.items():setattr(self, parameter, value)return selfdef fit(self, X, y):if self.sample_rate > 0.0:augemented_train = self.__create_augmented_train(X, y)self.model.fit(augemented_train[self.features],augemented_train[self.target])else:self.model.fit(X, y)return selfdef __create_augmented_train(self, X, y):num_of_samples = int(len(test) * self.sample_rate)# Train the model and creat the pseudo-labelsself.model.fit(X, y)pseudo_labels = self.model.predict(self.test[self.features])# Add the pseudo-labels to the test setaugmented_test = test.copy(deep=True)augmented_test[self.target] = pseudo_labels# Take a subset of the test set with pseudo-labels and append in onto# the training setsampled_test = augmented_test.sample(n=num_of_samples)temp_train = pd.concat([X, y], axis=1)augemented_train = pd.concat([sampled_test, temp_train])return shuffle(augemented_train)def predict(self, X):return self.model.predict(X)def get_model_name(self):return self.model.__class__.__name__

除了“fit”和“_create_augmented_train”方法之外,scikit-learn还需要几个更小的方法来使用这个类作为回归器(您可以在官方文档中阅读关于这个主题的更多信息)。现在我们已经创建了用于伪标记的scikit-learn类,让我们来看一个例子。

target = 'y'
# Preprocess the data
X_train, X_test = train[features], test[features]
y_train = train[target]
# Create the PseudoLabeler with XGBRegressor as the base regressor
model = PseudoLabeler(XGBRegressor(nthread=1),test,features,target
)
# Train the model and use it to predict
model.fit(X_train, y_train)
model.predict(X_train)

在本例中,pseudolabeler类使用XGBRegressor对伪标记进行回归。“sample_rate”的默认参数是0.2,这意味着伪标记程序将使用未标记数据集的20%。

结果

To test out the PseudoLabeler, I used XGBoost (when the competition was live I was getting the best results with XGBoost). To evaluate the model, we compare the raw XGBoost against the pseudo-labeled XGBoost. Using eight-fold cross-validation (on 4k data points, each fold got a small dataset – around 500 data points). The evaluation metric is R2-score, the official metric of the competition.

伪随机变量具有略高的均值得分和较低的偏差,这使得它(略)优于原始模型。我在笔记本上做了更详细的分析,你可以在这里看到。性能提升可能看起来很低,但请记住这是一个Kaggle竞赛,分数的每一次提高都可能让你在排行榜上的排名更高。这里介绍的复杂性不是太大(~70 LOC),但是在这个例子中,问题和模型非常简单,在尝试将其用于更复杂的问题或领域时,请记住这一点。

结论

伪标记允许我们在训练机器学习模型时使用未标记的数据。这听起来像一个强大的技术,是的,它通常会提高我们模型的性能。但是,很难进行调优并使其正常工作,即使在工作时,也只能稍微提高性能。在Kaggle这样的比赛中,我相信这个技巧是有用的,因为,通常,即使是分数的轻微增加也能在排行榜上给你一个提升。尽管如此,在将其用于生产环境之前,我还是会三思而后行,因为它似乎会引入额外的复杂性,而不会显著提高性能,而这可能不是您想要的。

伪标记是一种简单的半监督学习方法相关推荐

  1. 几种典型的半监督学习方法

    半监督学习前提假设 1.连续性假设(Continuity Assumption) 分类问题- input是比较接近的时候,ouput的后验概率矩阵也应该距离比较小 2.聚类假设(Cluster Ass ...

  2. 监督学习和无监督学习_让半监督学习再次伟大!谷歌最新无监督数据增强研究,全面超越现有半监督学习方法...

      新智元报道   来源:GoogleAI 编辑:元子 [新智元导读]Google AI最新研究用无监督数据增强推进半监督学习,取得令人瞩目的成果.该方法超越了所有现有的半监督学习方法,并实现了仅使用 ...

  3. 半监督学习matlab,基于自适应图的半监督学习方法与流程

    本发明属计算机视觉.图形处理 技术领域: ,具体涉及一种基于自适应图的半监督学习方法. 背景技术: :随着计算机网络技术的快速发展和人们对数据访问的多样化,人们可以获得的信息呈指数级别增长,如何利用这 ...

  4. python去除图像光照不均匀_CVPR 2020 | 从重建质量到感知质量:用于低光照增强的半监督学习方法...

    CVPR 2020 | 从重建质量到感知质量: 用于低光照增强的半监督学习方法 Code: https://github.com/flyywh/CVPR-2020-Semi-Low-Light 1 背 ...

  5. 文献记录(part57)--半监督学习方法

    学习笔记,仅供参考,有错必究 关键词 :半监督学习:有类标签的样本:无类标签的样例:类标签:成对约束 文章目录 半监督学习方法 引言 半监督学习概述 半监督学习研究的发展历程(略) 半监督学习依赖的假 ...

  6. 工程流体力学笔记暂记21 (几种简单的平面势流及其叠加)

    简单的平面势流一般都具有某种物理意义,能够代表某些实际流动,利用简单势流的叠加 可得到许多复杂流场的速度势和流函数 速度势https://baike.baidu.com/item/%E9%80%9F% ...

  7. [总结] 半监督学习方法: 协同训练类协同训练(Co-training)

    Co-training 最早在 1998 年提出, 是基于分歧的方法, 其假设每个数据可以由不同的视图(View)表示, 不同视图可以训练出不同的分类器, 利用这些分类器对无标签样本进行分类, 再挑选 ...

  8. 图像分类最新技术综述论文: 21种半监督、自监督和无监督学习方法一较高低

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 编辑:Sophia 计算机视觉联盟  报道  | 公众号 CVLianMeng 转载于 :专知 AI博士笔记系列推荐 ...

  9. 论文阅读笔记:《一种改进的图卷积网络半监督节点分类》

    论文阅读笔记:<一种改进的图卷积网络半监督节点分类> 文章目录 论文阅读笔记:<一种改进的图卷积网络半监督节点分类> 摘要: 引言 非欧几里得数据 1 深度池化对偶图神经网络 ...

  10. 【长尾分布】用半监督或自监督解决

    目录 1.研究背景 2.研究动机和思路 3. 半监督框架下的不均衡学习 01半监督的不平衡学习框架 02实验 4.关于半监督不均衡学习的进一步思考 5.自监督框架下的不均衡学习 01自监督的不平衡学习 ...

最新文章

  1. TWRP-recovery中文界面安装方法[转]
  2. [html] 页面刷新时sessionStroage会变(会清空)吗?
  3. javascript option 菜单图标_MacBook上神奇的Option键
  4. oracle用户新增数据文件,[数据库]20200722_Oracle添加表空间、用户,用户授权
  5. python3图像处理_Python3与OpenCV3.3 图像处理(二)--图像基本操作
  6. JQuery学习笔记 [Ajax] (6-1)
  7. 关于codesmith及其相关资源--破解的
  8. Scala:数据类型和变量
  9. Ubuntu安装caffe教程
  10. 35岁 计算机 学 什么好,35岁一事无成, 想重新学习, 应该学习哪方面的技能?
  11. 微信红包数字变化动态图片_微信红包数字跳动动图gif|微信红包金额跳动图下载-乐游网游戏下载...
  12. blog放在 http://cunsh.ycool.com/
  13. Do You Even Need Attention? A Stack of Feed-Forward Layers Does Surprisingly Well on ImageNet
  14. android硬盘格式化时间,安卓手机格式化恢复
  15. LabVIEW控制Arduino采集多路模拟量、数字量(进阶篇—1)
  16. xp系统计算机无线开关在哪,xp怎么设置无线网络?xp系统设置无线网络的方法
  17. 二进制和 四,八,十,十六,三十二进制的转换
  18. matlab文件批量重命名并编号排序
  19. 2021-01-11小米随身wifi网络创建总是失败是什么问题?
  20. 计算机关闭状态有哪三种,电脑怎么退出安全模式有几种方法

热门文章

  1. 幽冥问答录:兼职阴间判官介绍阴间是什么样子
  2. 64 位SQL Server 2005通过DB link链接32位SQL Server 2000 的bug解决
  3. jdk8 lambda表达式
  4. 你所不知道的 CSS 阴影技巧与细节
  5. Linux下MySQL的简单使用(一)
  6. 线程之生产汽车与购买汽车
  7. 如何去掉Eclipse里面自动追加的一些注释!!!内详
  8. (原创)c#学习笔记03--变量和表达式03--变量01--简单类型
  9. 五款app原型设计工具对比
  10. 如何评估一个算法效果