半监督学习代码实战

article/2025/3/15 21:17:56

sklearn官方例子——用半监督学习做数字识别
 

什么是半监督学习

半监督学习很重要,为什么呢?因为人工标注数据成本太高,现在大家参加比赛的数据都是标注好的了,那么如果老板给你一份没有标注的数据,而且有几百万条,让你做个分类什么的,你怎么办?不可能等标注好数据再去训练模型吧,所以你得会半监督学习算法。

不过我在这里先打击大家一下,用sklearn的包做不了大数据量的半监督学习,我用的数据量大概在15000条以上就要报MemoryError错误了,这个是我最讨厌的错误。暂时我还没有解决的办法,如果同志们是小数据量,那就用这个做着玩玩吧


算法流程

假设我们有一份数据集,共330个数字,其中前十个是已知的,已经标注好了,后320个是未知的,需要我们预测出来的。

  • 首先把这330个数据全部都放到半监督学习算法里,训练模型,预测那320个标签
  • 然后用某种方法(看下面代码的操作)得知这320个数据里最不确定的前5个数据,对它进行人工标注,然后把它放到之前的10个数据里,现在就有15个已知数据了
  • 这样循环个几次,已标注的数据就变多了,那么分类器的效果肯定也就变好了

  • 一共330个点,都是已经标注好的了,我们把其中的320个点赋值为-1,这样就可以假装这320个点都是没有标注的了
  • 训练一个只有10个标记点的标签传播模型
  • 然后从所有数据中选择要标记的前五个最不确定的点,把它们(带有正确标签)放到原来的10个点中
  • 接下来可以训练15个标记点(原始10个 + 5个新点)
  • 重复这个过程四次,就可以使用30个标记好的点来训练模型
  • 可以通过改变max_iterations将这个值增加到30以上

 

LabelSpreading是一个半监督学习模型

 

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
from sklearn import datasets
from sklearn.semi_supervised import label_propagation
from sklearn.metrics import classification_report,confusion_matrix# 再加下面这个,不然会报错
from scipy.sparse.csgraph import *digits = datasets.load_digits()
rng = np.random.RandomState(0)# indices是随机产生的0-1796个数字,且打乱
#indices:[1081 1707  927 ... 1653  559  684]
indices = np.arange(len(digits.data))
rng.shuffle(indices)# 取前330个数字来玩
X = digits.data[indices[:330]]
y = digits.target[indices[:330]]
images = digits.images[indices[:330]]n_total_samples = len(y) # 330
n_labeled_points = 10 # 标注好的数据共10条
max_iterations = 5 # 迭代5次#未标注的数据320条
#即[10 11 12 ... 329]
unlabeled_indices = np.arange(n_total_samples)[n_labeled_points:] f = plt.figure() # 画图用的for i in range(max_iterations):if len(unlabeled_indices) == 0:print("no unlabeled items left to label") # 没有未标记的标签了,全部标注好了breaky_train = np.copy(y)y_train[unlabeled_indices] = -1 #把未标注的数据全部标记为-1,也就是后320条数据lp_model = label_propagation.LabelSpreading(gamma=0.25,max_iter=5) # 训练模型lp_model.fit(X,y_train)predicted_labels = lp_model.transduction_[unlabeled_indices] # 预测的标签true_labels = y[unlabeled_indices] # 真实的标签print('**************************')print(predicted_labels)print(true_labels)print('**************************')cm = confusion_matrix(true_labels,predicted_labels,labels = lp_model.classes_)print("iteration %i %s" % (i,70 * "_")) # 打印迭代次数print("Label Spreading model: %d labeled & %d unlabeled (%d total)"% (n_labeled_points,n_total_samples-n_labeled_points,n_total_samples))print(classification_report(true_labels,predicted_labels))print("Confusion matrix")print(cm)# 计算转换标签分布的熵# lp_model.label_distributions_作用是Categorical distribution for each itempred_entropies = stats.distributions.entropy(lp_model.label_distributions_.T)# 选择分类器最不确定的前5位数字的索引# 首先计算出所有的熵,也就是不确定性,然后从320个中选择出前5个熵最大的# numpy.argsort(A)提取排序后各元素在原来数组中的索引。具体情况可看下面#  np.in1d 用于测试一个数组中的值在另一个数组中的成员资格,返回一个布尔型数组。具体情况可看下面uncertainty_index = np.argsort(pred_entropies)[::1]uncertainty_index = uncertainty_index[np.in1d(uncertainty_index,unlabeled_indices)][:5] # 这边可以确定每次选前几个作为不确定的数,最终都会加回到训练集# 跟踪我们获得标签的索引delete_indices = np.array([])# 可视化前5次的结果if i < 5:f.text(.05,(1 - (i + 1) * .183),'model %d\n\nfit with\n%d labels' %((i + 1),i*5+10),size=10)for index,image_index in enumerate(uncertainty_index):# image_index是前5个不确定标签# index就是0-4image = images[image_index]# 可视化前5次的结果if i < 5:sub = f.add_subplot(5,5,index + 1 + (5*i))sub.imshow(image,cmap=plt.cm.gray_r)sub.set_title("predict:%i\ntrue: %i" % (lp_model.transduction_[image_index],y[image_index]),size=10)sub.axis('off')# 从320条里删除要那5个不确定的点# np.where里面的参数是条件,返回的是满足条件的索引delete_index, = np.where(unlabeled_indices == image_index)delete_indices = np.concatenate((delete_indices,delete_index))unlabeled_indices = np.delete(unlabeled_indices,delete_indices)# n_labeled_points是前面不确定的点有多少个被标注了n_labeled_points += len(uncertainty_index)f.suptitle("Active learning with label propagation.\nRows show 5 most""uncertain labels to learn with the next model")
plt.subplots_adjust(0.12,0.03,0.9,0.8,0.2,0.45)
plt.show()

 

参考:

https://www.jianshu.com/p/a21817a81890


http://chatgpt.dhexx.cn/article/DbG53QAC.shtml

相关文章

半监督学习综述

Chapter 7 Semi-supervised Learning 翻译不易&#xff0c;未经允许请勿转载&#xff01; Author: Mohamed Farouk Abdel Hady and Friedhelm Schwenker Translator: Howard Wonanut 摘要 传统的监督学习方法需要使用有标签数据建立模型。然而&#xff0c;在现实世界中给训练…

半监督学习(一)

什么是半监督学习? 传统的机器学习技术分为两类&#xff0c;一类是无监督学习&#xff0c;一类是监督学习。 无监督学习只利用未标记的样本集&#xff0c;而监督学习则只利用标记的样本集进行学习。 但在很多实际问题中&#xff0c;只有少量的带有标记的数据&#xff0c;因为…

半监督学习简介

“我们预计从长远来看&#xff0c;无监督学习将变得更加重要。人类和动物的学习在很大程度上是不受监督的&#xff1a;我们通过观察来发现世界的结构&#xff0c;而不是通过被告知每个物体的名称。”——LeCun, Bengio, Hinton, Nature (2015)。 Semi-Supervised Learning 半监…

半监督学习

1. 介绍 1.1 什么是半监督学习 所给的数据有的是有标签的&#xff0c;而有的是没有标签的。常见的两种半监督的学习方式是直推学习&#xff08;Transductive learning&#xff09;和归纳学习&#xff08;Inductive learning&#xff09;。   直推学习&#xff08;Transduct…

半监督学习(SEMI-Supervised Learning)

半监督学习的工作原理 想象一下&#xff0c;收集了大量未标记的数据&#xff0c;您想在这些数据上训练模型。手动标记所有这些信息可能会花费你一大笔钱&#xff0c;除了需要几个月的时间来完成注释。这时候半监督机器学习方法就派上用场了。工作原理很简单。无需将标签添加到…

半监督学习概述

1、半监督学习 今天在阅读一篇论文时了解了这个之前一直不太清晰的概念。下面是查阅了相关资料后对半监督学习的理解。如有错误&#xff0c;望更正。 半监督学习是一种介于监督学习和无监督学习之间的学习凡是&#xff0c;我们都知道&#xff0c;在监督学习中&#xff0c;样本…

JS中使数组倒序排列

使用reverse方法 注意&#xff1a;reverse方法会使得原数组发生变化

JS实现数组和数组对象倒序(reverse方法)

const arr1 [{a:1},{b:2},{c:3},{d:4}]; const arr2 [1,2,3,4,5,6,7]; console.log(倒序前,arr1,arr2); arr1.reverse(); arr2.reverse(); console.log(倒序后,arr1,arr2);

js实现数组翻转(倒序输出)

//倒序排列var arr[2,30,1,9,5,7];var brrarr.reverse();for(var i0;i<brr.length;i){document.write(brr[i]);}console.log(brr);//控制台也能看到数组的输出

js实现数组元素的倒序

模拟循环录入采集名单存储到数组中并编码实现数组元素的倒序查看名单 :例如数组原名单: A B C D E ,倒序后展示为: E D C B A 运行后的结果如下图所示&#xff1a;

JS数组对象的正序、倒序和根据中文首字母排序

//数组对象方法排序:升序 sortByKey(array,key){return array.sort(function(a,b){var xa[key];var yb[key];return ((x<y)?-1:((x>y)?1:0));}); },//数组对象方法排序:降序 sortDownByKey(array,key){return array.sort(function(a,b){var xa[key];var yb[key];return…

js中数组反向、排序reverse、sort

全栈工程师开发手册 &#xff08;作者&#xff1a;栾鹏&#xff09; js系列教程1-数组操作全解 js中数组反向、排序 数组反向使用reverse函数&#xff0c;数组排序使用sort函数&#xff0c;排序函数可以传入比较函数&#xff0c;也可以修改数组圆形&#xff0c;自定义添加排序…

数组倒序排序

Array.reverse()&#xff0c;数组元素的排序排列 今天做项目的时候遇到了一个需求&#xff0c;把下单字段的时间倒序排列&#xff0c;也就是最新的时间显示在前面&#xff0c;像这样 因为这个字段是一个数组元素&#xff0c;所以就想到了让数组元素倒序排列&#xff0c;然后就…

js数组排序,数组按照某个字段正序倒序排序方法,sort()

话不多说直接看案例哈 比如后端返回了一个数组集合&#xff0c;需要吧默认选项放在第一条 let arr [{isDefault: 0},{isDefault: 0},{isDefault: 1},{isDefault: 0}]arr.sort((a,b)> a.isDefault-b.isDefault)console.log(arr,正序)输出结果&#xff1a;正序&#xff0c;从…

js-实现数组翻转(倒序)

源代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>翻转数组</title></head><body><script>var arr[1,2,3,4,5,6,7,8];var newArr [];console.log(arr);for(var iarr.length-1;…

js 数组倒序排列

1.使用reverse()函数&#xff1a; var array[我,喜,欢,你];array.reverse(); // 输出&#xff1a; ["你", "欢", "喜", "我"]2.循环遍历一一使其倒序&#xff1a; var array[我,喜,欢,你];var temp;for(let i0; i<array.length/2;…

重磅!超详细的 JS 数组方法整理出来了

作者&#xff1a;Yushia https://juejin.cn/post/6907109642917117965 数组是 js 中最常用到的数据集合&#xff0c;其内置的方法有很多&#xff0c;熟练掌握这些方法&#xff0c;可以有效的提高我们的工作效率&#xff0c;同时对我们的代码质量也是有很大影响。 一、创建数组 …

VS Code字体总是安装不上,vscode字体安装

VS Code字体安装&#xff0c;顽固版本 tmd&#xff0c;Vs Code老是把l看成i或者是1急死了首先要下载字体&#xff0c;下载好安装对应的字体&#xff0c;windows字体文件一般是ttf&#xff0c;安装好之后 这里有免费的供开发编程使用的字体 —》链接 下载好之后&#xff0c;解压…

VsCode字体颜色修改和背景图片修改 字体高亮

1.打开VS Code编辑器&#xff0c;在编辑器中设置。根据以下步骤&#xff0c;打开settin.json文件。 2.在json文件中若有代码覆盖即可没有代码直接添加下面代码。看注释可以自定义设置喜欢的颜色。 {//设置用户选中代码段的颜色"workbench.colorCustomizations": {/…