我们在解决监督机器学习的问题上取得了巨大的进步。这也意味着我们需要大量的数据来构建我们的图像分类器。但是,这并不是人类思维的学习方式。一个人的大脑不需要上百万个数据来进行训练,需要通过多次迭代来完成相同的图像来理解一个主题。它所需要的只是在基础模式上用几个指导点训练自己。显然,我们在当前的机器学习方法中缺少一些东西。我们能否可以建立一个系统,能够要求最低限度的监督,并且能够自己掌握大部分的任务。

本文将介绍一种称为伪标签(Pseudo-Labelling)的技术。我会给出一个直观的解释,说明伪标签是什么,然后提供一个实际的实现。

内容

  • 什么是半监督学习?
  • 不加标签的数据有何帮助?
  • 介绍伪标签
  • 实现半监督学习
  • 采样率的依赖
  • 半监督学习的应用

什么是半监督学习?

比方说,我们有一个简单的图像分类问题。训练数据由两个被标记的图像Eclipse(日食)和Non-eclipse(非日食)组成,如下所示。

我们需要从非日食图像中对日食的图像进行分类。但是,问题是我们需要在仅仅两张图片的训练集上建立我们的模型。

因此,为了应用任何监督学习算法,我们需要更多的数据来构建一个鲁棒性的模型。为了解决这个问题,我们找到了一个简单的解决方案,我们从网上下载一些图片来增加我们的训练数据。

但是,对于监督的方法,我们也需要这些图像的标签。因此,我们手动将每个图像分类为如下所示的类别。

在对这些数据进行监督的算法之后,我们的模型肯定会比在训练数据中包含两个图像的模型表现得更突出。但是这种方法只适用于解决较小目的的问题,因为对大型数据集的注释可能非常困难且昂贵。

因此,我们定义了一种不同类型的学习,即半监督学习,即使用标签数据(受监督的学习)和不加标签的数据(无监督的学习)。

因此,让我们了解不加标签的数据如何有助于改进我们的模型。

不加标签的数据有何帮助?

考虑如下所示的情况:

你只有两个属于两个不同类别的数据点,而所绘制的线是任何受监督模型的决策边界。现在,假设我们将一些不加标记的数据添加到这个数据中,如下图所示。

如果我们注意到上面两个图像之间的差异,你可以说,在添加了不加标签的数据之后,我们的模型的决策边界变得更加准确。因此,使用不加标签数据的好处是:

1.被贴上标签的数据既昂贵又困难,而没有标签的数据则是充足而廉价的。
2.它通过更精确的决策边界来改进模型的鲁棒性。

现在,我们对半监督学习有了一个基本的了解。有多种不同的技术在应用着半监督学习,在本文中,我们将尝试理解一种称为伪标签的技术。

介绍伪标签

在这种技术中,我们不需要手动标记不加标签的数据,而是根据标签的数据给出近似的标签。让我们通过分解如下图所示的步骤来使它更容易理解。

第一步:使用标签数据训练模型

第二步:使用训练的模型为不加标签的数据预测标签

第三步:同时使用pseudo和标签数据集重新训练模型

在第三步中训练的最终模型用于对测试数据的最终预测。

实现半监督学习

现在,我们将使用来自AV数据处理平台的大市场销售(Big Mart Sales)问题。因此,让我们从下载数据部分中的训练和测试文件开始。

那么,让我们从导入基本库开始。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.preprocessing import LabelEncoder

现在,看一下我们下载的训练和测试文件,并进行一些基本的预处理,以形成模型。

train = pd.read_csv('/Users/shubhamjain/Downloads/AV/Big Mart/train.csv')
test = pd.read_csv('/Users/shubhamjain/Downloads/AV/Big Mart/test.csv')
# preprocessing### mean imputations
train['Item_Weight'].fillna((train['Item_Weight'].mean()), inplace=True)
test['Item_Weight'].fillna((test['Item_Weight'].mean()), inplace=True)### reducing fat content to only two categories
train['Item_Fat_Content'] = train['Item_Fat_Content'].replace(['low fat','LF'], ['Low Fat','Low Fat'])
train['Item_Fat_Content'] = train['Item_Fat_Content'].replace(['reg'], ['Regular'])
test['Item_Fat_Content'] = test['Item_Fat_Content'].replace(['low fat','LF'], ['Low Fat','Low Fat'])
test['Item_Fat_Content'] = test['Item_Fat_Content'].replace(['reg'], ['Regular'])## for calculating establishment year
train['Outlet_Establishment_Year'] = 2013 - train['Outlet_Establishment_Year']
test['Outlet_Establishment_Year'] = 2013 - test['Outlet_Establishment_Year']### missing values for size
train['Outlet_Size'].fillna('Small',inplace=True)
test['Outlet_Size'].fillna('Small',inplace=True)### label encoding cate. var.
col = ['Outlet_Size','Outlet_Location_Type','Outlet_Type','Item_Fat_Content']
test['Item_Outlet_Sales'] = 0
combi = train.append(test)
number = LabelEncoder()
for i in col:combi[i] = number.fit_transform(combi[i].astype('str'))combi[i] = combi[i].astype('int')
train = combi[:train.shape[0]]
test = combi[train.shape[0]:]
test.drop('Item_Outlet_Sales',axis=1,inplace=True)## removing id variables
training = train.drop(['Outlet_Identifier','Item_Type','Item_Identifier'],axis=1)
testing = test.drop(['Outlet_Identifier','Item_Type','Item_Identifier'],axis=1)
y_train = training['Item_Outlet_Sales']
training.drop('Item_Outlet_Sales',axis=1,inplace=True)features = training.columns
target = 'Item_Outlet_Sales'X_train, X_test = training, testing

从不同的监督学习算法开始,让我们来看看哪一种算法给了我们最好的结果。

from xgboost import XGBRegressor
from sklearn.linear_model import BayesianRidge, Ridge, ElasticNet
from sklearn.neighbors import KNeighborsRegressor
from sklearn.ensemble import RandomForestRegressor, ExtraTreesRegressor, GradientBoostingRegressor
#from sklearn.neural_network import MLPRegressorfrom sklearn.metrics import mean_squared_error
from sklearn.model_selection import cross_val_score
model_factory = [RandomForestRegressor(),XGBRegressor(nthread=1),#MLPRegressor(),Ridge(),BayesianRidge(),ExtraTreesRegressor(),ElasticNet(),KNeighborsRegressor(),GradientBoostingRegressor()
]for model in model_factory:model.seed = 42num_folds = 3scores = cross_val_score(model, X_train, y_train, cv=num_folds, scoring='neg_mean_squared_error')score_description = " %0.2f (+/- %0.2f)" % (np.sqrt(scores.mean()*-1), scores.std() * 2)print('{model:25} CV-5 RMSE: {score}'.format(model=model.__class__.__name__,score=score_description))

我们可以看到XGB算法为我们提供了最佳的模型性能。注意,我没有为了本文的简单性而调整任何算法的参数。

现在,让我们来实现伪标签,为了这个目的,我将使用测试数据作为不加标签的数据。

from sklearn.utils import shufflefrom sklearn.base import BaseEstimator, RegressorMixinclass PseudoLabeler(BaseEstimator, RegressorMixin):'''Sci-kit learn wrapper for creating pseudo-lebeled estimators.'''def __init__(self, model, unlabled_data, features, target, sample_rate=0.2, seed=42):'''@sample_rate - percent of samples used as pseudo-labelled datafrom the unlabelled dataset'''assert sample_rate <= 1.0, 'Sample_rate should be between 0.0 and 1.0.'self.sample_rate = sample_rateself.seed = seedself.model = modelself.model.seed = seedself.unlabled_data = unlabled_dataself.features = featuresself.target = targetdef get_params(self, deep=True):return {"sample_rate": self.sample_rate,"seed": self.seed,"model": self.model,"unlabled_data": self.unlabled_data,"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):'''Fit the data using pseudo labeling.'''augemented_train = self.__create_augmented_train(X, y)self.model.fit(augemented_train[self.features],augemented_train[self.target])return selfdef __create_augmented_train(self, X, y):'''Create and return the augmented_train set that consistsof pseudo-labeled and labeled data.'''num_of_samples = int(len(self.unlabled_data) * self.sample_rate)# Train the model and creat the pseudo-labelsself.model.fit(X, y)pseudo_labels = self.model.predict(self.unlabled_data[self.features])# Add the pseudo-labels to the test setpseudo_data = self.unlabled_data.copy(deep=True)pseudo_data[self.target] = pseudo_labels# Take a subset of the test set with pseudo-labels and append in onto# the training setsampled_pseudo_data = pseudo_data.sample(n=num_of_samples)temp_train = pd.concat([X, y], axis=1)augemented_train = pd.concat([sampled_pseudo_data, temp_train])return shuffle(augemented_train)def predict(self, X):'''Returns the predicted values.'''return self.model.predict(X)def get_model_name(self):return self.model.__class__.__name__

看起来很复杂,但是你不必为此担心,因为它是我们在上面学习的方法的相同实现。因此,每次需要执行伪标签时,都要复制相同的代码。

现在,让我们来检查一下数据集上的伪标签的结果。

model_factory = [XGBRegressor(nthread=1),PseudoLabeler(XGBRegressor(nthread=1),test,features,target,sample_rate=0.3),
]for model in model_factory:model.seed = 42num_folds = 8scores = cross_val_score(model, X_train, y_train, cv=num_folds, scoring='neg_mean_squared_error', n_jobs=8)score_description = "MSE: %0.4f (+/- %0.4f)" % (np.sqrt(scores.mean()*-1), scores.std() * 2)print('{model:25} CV-{num_folds} {score_cv}'.format(model=model.__class__.__name__,num_folds=num_folds,score_cv=score_description))

在这种情况下,我们得到了一个rmse值,这个值比任何受监督的学习算法都要小。sample_rate(采样率)是其中一个参数,它表示不加标签数据的百分比被用作建模目的的伪标签。

因此,让我们检查一下采样率对伪标签性能的依赖性。

采样率的依赖

为了找出样本率对伪标签性能的依赖,让我们在这两者之间画一个图。在这里,我只使用了两种算法来表示对时间约束(time constraint)的依赖,但你也可以尝试其他算法。

sample_rates = np.linspace(0, 1, 10)def pseudo_label_wrapper(model):return PseudoLabeler(model, test, features, target)# List of all models to test
model_factory = [RandomForestRegressor(n_jobs=1),XGBRegressor(),
]# Apply the PseudoLabeler class to each model
model_factory = map(pseudo_label_wrapper, model_factory)# Train each model with different sample rates
results = {}
num_folds = 5for model in model_factory:model_name = model.get_model_name()print('%s' % model_name)results[model_name] = list()for sample_rate in sample_rates:model.sample_rate = sample_rate# Calculate the CV-3 R2 score and store itscores = cross_val_score(model, X_train, y_train, cv=num_folds, scoring='neg_mean_squared_error', n_jobs=8)results[model_name].append(np.sqrt(scores.mean()*-1))
plt.figure(figsize=(16, 18))i = 1
for model_name, performance in results.items(): plt.subplot(3, 3, i)i += 1plt.plot(sample_rates, performance)plt.title(model_name)plt.xlabel('sample_rate')plt.ylabel('RMSE')plt.show()

我们可以看到,rmse对于采样率的特定值来说是最小值,这对于算法来说是不同的。因此,对采样率进行调优是很重要的,以便在使用伪标签时获得更好的结果。

半监督学习的应用

在过去,半监督学习的应用数量有限,但目前在这一领域仍有很多工作要做。下面列出了一些我感兴趣的应用。

1.多模态半监督学习(Multimodal semi-supervised learning)图像分类

一般来说,在图像分类中,目标是对图像进行分类,无论它属于这个类别还是不属于类别。本文不仅利用图像进行建模,还利用半监督学习的方法来改进分类器,从而提高分类器的使用效果。

2.检测人口贩卖

人口贩卖是最残忍的犯罪之一,也是法律执行所面临的挑战问题之一。半监督学习使用标签和不加标签的数据,以产生比一般方法更好的结果。

本文的完整代码:https://github.com/shubhamjn1/Pseudo-Labelling—A-Semi-supervised-learning-technique

var jiathis_config={
data_track_clickback:true,
summary:"",
shortUrl:false,
hideMore:false
}

posted @ 2019-03-28 21:56 Le1B_o 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/leebxo/p/10617992.html

Pseudo Labelling相关推荐

  1. SSL for Medical Image Classification系列论文阅读笔记 -- ACPL

    ACPL: Anti-curriculum Pseudo-labelling for Semi-supervised Medical Image Classification(CVPR 2022) C ...

  2. 深度学习——名词总结篇

    103. HIN(异构信息网络) 102. Hypergraph(超图): 一条边上有多个点的图 二阶超图: 平时使用的图 三阶超图: 101.hard sample mining: 取那些识别不好的 ...

  3. CVPR 2021 | 北大MSRA提出CPS:基于交叉伪监督的半监督语义分割

    点击下方卡片,关注"CVer"公众号 AI/CV重磅干货,第一时间送达 作者:Charles  |  源:知乎 https://zhuanlan.zhihu.com/p/37812 ...

  4. 什么是交换(Swap)与伪交换(Pseudo swap)

    http://bbs.chinaunix.net/viewthread.php?tid=746261 与其他版本的 Unix 一样,HP-UX 也使用 Virtual Memory 将进程加载到内存中 ...

  5. 用于稠密检索的无监督领域适应方法—Generative Pseudo Labeling (GPL)

    ©作者 | 刘璐 学校 | 北京邮电大学 研究方向 | 问题生成与QA 论文标题: GPL: Generative Pseudo Labeling for Unsupervised Domain Ad ...

  6. 什么是前端开发中的Pseudo elements

    Pseudo元素的定义语法:连续出现的两个冒号.很早期的pseudo元素甚至使用了单冒号的定义语法. 看一个具体的例子:下图article元素里包含了一个p节点,节点内包含了一段话.现在我想把这个段落 ...

  7. A pseudo attribute name is expected.解决方法

    今天配置database.conf.xml的时候一直提示这个问题:A pseudo attribute name is  expected,好像其他配置没多大错误 第一个是XML的声明,其中versi ...

  8. 【论文笔记】PSEUDOSEG: DESIGNING PSEUDO LABELS FOR SEMANTIC SEGMENTATION

    论文笔记 1.论文题目 2.作者及研究单位 3.摘要 4.简介 (1)这篇论文针对什么问题展开的研究 (2)已有工作是如何解决这些问题的(已有工作存在什么不足) (3)这篇论文是如何做的(如何弥足已有 ...

  9. PseudoSeg: Designing Pseudo Labels for Semantic Segmentation阅读笔记

    原文链接:https://arxiv.org/abs/2010.09713  PseudoSeg比较少见地采用了将pixel-level label和image-level label结合在一起的设定 ...

  10. 半监督学习之伪标签(pseudo label,entropy minimization,self-training)

    1.什么是伪标签 伪标签方法是一种同时从未标记数据和标记数据中学习的监督范式.将具有最大预测概率的类作为伪标签.形式化后等价于熵正则化(Entropy Regularization)或熵最小化(Ent ...

最新文章

  1. Pjax是什么以及为什么推荐大家用
  2. WebSocket 网页聊天室的实现(服务器端:.net + windows服务,前端:Html5)
  3. linux svn可视化,Ubuntu 14.04如何安装可视化SVN
  4. 学习OGRE - 读取天龙八部scene文件
  5. Linux云自动化运维第六课
  6. 腾讯光子《黎明觉醒》技术美术负责人:如何制作超真实的开放世界?
  7. linux的 vi编辑器在哪,Linux Vi编辑器的使用
  8. 不入oracle数据库,Oracle数据库之操作符及函数
  9. msvcrt python linux,Python msvcrt.CrtSetReportMode方法代码示例
  10. 转: 参数修饰符ref,out ,params的区别
  11. 浏览器模式电子海图快速显示的研究
  12. 拼多多爆款商品采集工具
  13. 出现这十种症状,说明你不适合干程序员
  14. 微信手机浏览器多图片即时预览
  15. python代码风格指南_记录Python代码:完整指南
  16. Detecting Faces in Images: A Survey( 翻译)
  17. C#视频处理,调用强大的ffmpeg
  18. 百度网盘怎么批量转存到阿里云盘
  19. MySQL在服务里找不到(未卸载)
  20. 数据挖掘中的分类与预测

热门文章

  1. 【饭谈】为什么有的技术博文你看不懂?
  2. 运算放大器基本参数—压摆率(直观解释)
  3. 教室录播系统方案_《课堂教学录播专用教室》建设方案及装备标准
  4. mac上投屏android_简单实用的手机投屏Mac电脑
  5. mysql c盘满了 怎么办_C盘太满清理技巧
  6. Prometheus踩坑记
  7. 有什么软件测试固态硬盘,SSD差距有多大?两款主流NVMe固态硬盘测试,一看就包懂...
  8. 实战 | 一步步排查基于业务场景的Elasticsearch难题!
  9. 数据挖掘 模型的衡量标准与建模
  10. 《python股票量化交易从入门到实践》摘要