半监督学习

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

  • 介绍
  • 一、Self Training自训练
    • 1、介绍
    • 2、代码示例
    • 3、参数解释
  • 二、Label Propagation(标签传播)
    • 1、介绍
    • 2、代码示例
    • 3、参数解释
  • 三、Label Spreading(标签扩散)
    • 1、介绍
    • 2、代码示例
    • 3、参数解释


介绍

半监督学习(Semi-Supervised Learning,SSL)是机器学习领域中的一个重要分支,它结合了监督学习和无监督学习的思想,用于处理标签数据稀缺而无标签数据丰富的场景。
常用方法:

  • Self Training自训练
  • Label Propagation标签传播
  • Label Spreading标签扩散

一、Self Training自训练

1、介绍

Self Training自训练是一种简单的半监督学习方法,它首先使用已标记的数据训练一个监督学习模型。然后,该模型用于预测未标记数据的标签。预测最自信的标签可以被选择添加到训练集中,然后模型在新的、更大的训练集上重新训练。先训练一个小模型,再继续预测标签,类似于迁移学习。当无标签数据和有标签数据分布相同时,使用自训练方法效果最佳。

2、代码示例

  • 读入数据
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"

import numpy as np
import pandas as pd
import warnings
warnings.filterwarnings("ignore")

# 数据预处理计算函数
def preprocessing(df):
    from sklearn.impute import SimpleImputer
    from sklearn.preprocessing import StandardScaler
    from sklearn.pipeline import Pipeline
    from sklearn.preprocessing import OrdinalEncoder
    from sklearn.compose import ColumnTransformer
    
    cat_cols= df.select_dtypes(include=["object"])   # 分类型变量
    num_cols= df.select_dtypes(include=["int", "float"])   # 数值型变量

    # 连续型数据
    num_imp= SimpleImputer(strategy='mean')  # 缺失值
    num_std= StandardScaler()  # 标准化
    num_pipeline= Pipeline(steps=[("num_imp", num_imp), ("num_std", num_std)])
    # 分类型数据
    cat_imp= SimpleImputer(strategy="most_frequent")  # 缺失值
    cat_encode= OrdinalEncoder()   # 数据编码
    cat_pipeline= Pipeline(steps=[("cat_imp", cat_imp), ("cat_encode", cat_encode)])

    col_trans= ColumnTransformer(transformers=[("num_pipeline", num_pipeline, num_cols.columns),
                                           ("cat_pipeline", cat_pipeline, cat_cols.columns),])
    # 数据集处理的计算
    transfer= col_trans.fit(df)
    return transfer

# 读入数据
raw_data= pd.read_csv('半监督学习.csv')
labels= raw_data.pop("resp_flag")  # 标签
  • 缺失数据对比
print("缺失值/总样本:"+str(labels.isnull().sum())+"/"+str(len(labels)))

在这里插入图片描述

  • 数据处理
    注意:切分的测试数据集一定是有标签的样本
# sklearn中的半监督学习算法要求,所有缺失的标签必须用-1填充
labels_fill= labels.fillna(-1)

# 特征数据处理
transfer= preprocessing(raw_data)
data_trans= transfer.transform(raw_data)

data_concat= pd.concat([labels_fill, pd.DataFrame(data_trans)], axis= 1)

# 保存一部分有标签样本作为测试集
mask_labeled= (labels_fill != -1)
mask_unlabeled= (labels_fill == -1)

data_labeled= data_concat[mask_labeled]
data_unlabeled= data_concat[mask_unlabeled]

# 切分测试集
from sklearn.model_selection  import train_test_split
train, test= train_test_split(data_labeled, test_size=0.2, stratify= data_labeled["resp_flag"], random_state= 42)

Xtrain= pd.concat([train, data_unlabeled])
Ytrain= Xtrain.pop("resp_flag")
  • 使用模型
from sklearn.ensemble import RandomForestClassifier
RF= RandomForestClassifier(oob_score=True)

# Self Training
from sklearn.semi_supervised import SelfTrainingClassifier
RF_self_training= SelfTrainingClassifier(RF)
RF_self_training.fit(Xtrain, Ytrain)

# 测试集模型评估
Xtest= test
Ytest= Xtest.pop("resp_flag")

from sklearn.metrics import roc_auc_score
print("AUC: ", roc_auc_score(Ytest, RF_self_training.predict_proba(Xtest)[:, 1]))

在这里插入图片描述

3、参数解释

base_estimator: BaseEstimator,# 基学习器
threshold: Float = 0.75,# 默认阈值0.75,大于0.75,小于0.25会被打标签,该参数比k_best更为常用
criterion: Literal['threshold', 'k_best'] = "threshold",# 默认值threshold,为该值时和threshold参数相同,即设阈值,k_best超参数阈值,如为10,则不考虑预测概率,只取排名前10的打标签
k_best: Int = 10,# 超参数阈值,如为10,则不考虑预测概率,只取排名前10的打标签
max_iter: int | None = 10,# 最大迭代次数
verbose: bool = False

二、Label Propagation(标签传播)

在sklearn中,基于图算法的半监督学习有Label Propagation和Label Spreading两种。他们的主要区别是第二种方法带有正则化机制。

1、介绍

Label Propagation(标签传播)基本原理:Label Propagation算法基于图理论。算法首先构建一个图,其中每个节点代表一个数据点,无论是标记的还是未标记的。节点之间的边代表数据点之间的相似性。算法的目的是通过图传播标签信息,使未标记数据获得标签。

关键特点:
相似性度量:通常使用K近邻(KNN)或者基于核的方法来定义数据点之间的相似性。
标签传播:标签信息从标记数据点传播到未标记数据点,通过迭代过程实现。
适用场景:适合于数据量较大、标记数据稀缺的情况。

  • 以环形数据为例,绿色全是为打标签的数据:
    在这里插入图片描述
    打标签后数据结果如图:
from sklearn.semi_supervised import LabelPropagation

label_propagation = LabelPropagation(kernel="knn")
label_propagation.fit(X, labels)

output= np.asarray(label_propagation.transduction_)
outer_numbers = np.where(output == outer)[0]
inner_numbers = np.where(output == inner)[0]

plt.figure(figsize=(4, 4))
plt.scatter(X[outer_numbers, 0], X[outer_numbers, 1],)
plt.scatter(X[inner_numbers, 0], X[inner_numbers, 1],);

在这里插入图片描述

2、代码示例

from sklearn.semi_supervised import LabelPropagation

label_propagation = LabelPropagation(kernel="knn")
label_propagation.fit(Xtrain, Ytrain)

Ytrain_propagation= label_propagation.transduction_

from sklearn.ensemble import RandomForestClassifier
RF_propagation= RandomForestClassifier(oob_score=True)
RF_propagation.fit(Xtrain, Ytrain_propagation)

print("AUC: ", roc_auc_score(Ytest, RF_propagation.predict_proba(Xtest)[:, 1]))

在这里插入图片描述

3、参数解释

    kernel: ((...) -> Any) | Literal['knn', 'rbf'] = "rbf",# knn:k近邻,RBF核用于计算图中节点之间的相似度。这些相似度值随后用于传播标签信息,从而根据相邻节点的标签来预测未知节点的标签,rbf函数和正态分布比较相似
    *,
    gamma: Float = 20, # rbf函数的系数,可以简单理解为正态分布的方差
    n_neighbors: Int = 7, # 附近的7个样本,哪个样本多,就打成哪个标签,为knn时生效
    max_iter: Int = 1000,# 迭代次数
    tol: float = 0.001,# 算法收敛的阈值
    n_jobs: Int | None = None

三、Label Spreading(标签扩散)

1、介绍

基本原理:Label Spreading和Label Propagation非常相似,但在处理标签信息和正则化方面有所不同。它同样基于构建图来传播标签。

关键特点:
正则化机制:Label Spreading引入了正则化参数,可以控制标签传播的过程,使算法更加健壮。
稳定性:由于正则化的存在,Label Spreading在面对噪声数据时通常比Label Propagation更稳定。
适用场景:同样适用于有大量未标记数据的情况,尤其当数据包含噪声或者不完全标记时。

2、代码示例

from sklearn.semi_supervised import LabelSpreading

label_spreading = LabelSpreading(kernel="knn", alpha= 0.2)
label_spreading.fit(Xtrain, Ytrain)

Ytrain_spreading= label_spreading.transduction_

from sklearn.ensemble import RandomForestClassifier
RF_spreading= RandomForestClassifier(oob_score=True)
RF_spreading.fit(Xtrain, Ytrain_spreading)

print("AUC: ", roc_auc_score(Ytest, RF_spreading.predict_proba(Xtest)[:, 1]))

在这里插入图片描述

3、参数解释

	kernel: ((...) -> Any) | Literal['rbf', 'knn'] = "rbf",
    *,
    gamma: Float = 20,
    n_neighbors: Int = 7,
    alpha: Float = 0.2, # 正则化参数,用于控制算法对标签平滑的程度,值较小时,会更强调邻居节点信息,值较大时,更倾向于保持原始标签
    max_iter: Int = 30,
    tol: Float = 0.001, # 算法收敛的阈值
    n_jobs: Int | None = None

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/717011.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

物联网工程的未来发展趋势及影响

物联网工程是在互联网基础上的一种新兴技术,其核心思想是通过网络连接不同物体,实现智能化的交流与互动。在未来,物联网工程将继续向更多领域发展,如智能家居、智能城市、智能交通等。首先,物联网工程在智能家居领域的…

华为中小企业组网

一、组网图 说明:接入交换机ACC1(S2750),核心/汇聚交换机CORE( S5700 )和出口路由器Router(AR系列路由器)为例。 核心交换机配置VRRP保证网络可靠性,配置负载分担有效利…

Windows 10永久关闭“系统准备工具 3.14“禁止开机自启

文章目录 一、问题描述二、解决方法总结 一、问题描述 每次开机都会显示如下图所示的 系统准备工具 3.14 二、解决方法 按win R键打开运行窗口 → 输入cmd → 点击 确定 如图所示输入下面如图所示代码 → 按 回车 → 输入 Y → 按 回车 XCOPY C:\windows\System32\svchost.e…

劝你现在别秦L,不然得后悔死

文 | AUTO芯球 作者 | 雷慢 这真得听劝, 现在别急着买车,不然过不了两个月你得后悔死, 你现在看到秦L将B级车价格打下来了,就急着买车, 几个月后比亚迪还有更大的王炸,价格战还得更残酷! …

C#开发-集合使用和技巧(五)集合中的转换方法

在C#中&#xff0c;Select, ToList, 和 ToArray 都是用于集合转换的方法&#xff0c;它们各自有不同的用途和适用场景。 测试数据 /// <summary>/// 设备类/// </summary>class Device{/// <summary>/// Id/// </summary>public int Id { get; set; }…

学周刊杂志学周刊杂志社学周刊编辑部2024年第19期目录

热点关注 “一带一路”背景下高校创新创业教育的机遇、挑战与发展对策 温玲子; 1-4 高职院校创新创业教育模式的实践研究 杜卉; 5-8 谈高职医学院校计算机教学中学生创新创业能力培养 王磊; 9-12 教改新论《学周刊》投稿&#xff1a;cn7kantougao163.com 大数据…

实战 | 基于YOLOv10的车辆追踪与测速实战【附源码+步骤详解】

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

音频文件下载后,如何轻松转换格式?

在我们日常的数字生活中&#xff0c;下载各种音频文件是司空见惯的事情。然而&#xff0c;有时候我们可能需要将这些音频文件转换为不同的格式&#xff0c;以适应不同的设备或编辑需求。无论您是希望将下载的音频文件转换为通用的MP3格式&#xff0c;还是需要将其转换为高保真的…

eNSP学习——OSPF在帧中继网络中的配置

目录 主要命令 原理概述 实验目的 实验场景 实验拓扑 实验编址 实验步骤 1、基本配置 2、在帧中继上搭建OSPF网络 主要命令 //检查帧中继的虚电路状态 display fr pvc-info//检查帧中继的映射表 display fr map-info//手工指定OSPF邻居,采用单播方式发送报文 [R1]os…

Scala入门【安装与使用、变量与数据类型、运算符、函数、条件判断、循环、字符串、面向对象、数组】

视频地址:Scala大专/本科专用课程_哔哩哔哩_bilibili 目录 P01【01Scala安装与使用】16:15 P02【02变量与数据类型】17:14 P03【03运算符】12:41 P04【04函数】16:40 P05【05条件判断】10:56 P06【06循环】13:33 P07【07字符串】19:09 P08【08面向对象】17:27 P09【0…

栅格数据实现最优参数地理探测器(OPGD)详细教程!(上)

数据准备 要探寻一堆因素对因变量的影响,首先你要确定要用哪些自变量来影响哪个因变量 想好了之后 你需要到相应的网站去下载你的研究区的自变量和因变量数据的栅格数据(可以是离散的,也可以是连续的) 后续操作是到Arcgis里对你的数据处理一下 由于不是教程的重点,这里就…

电脑微信聊天记录监控要怎么做?找谁找?

电脑微信聊天记录的监控通常涉及到使用特定的监控软件&#xff0c;这些软件设计用于企业管理和网络监控&#xff0c;以确保工作场所的通信安全和提高工作效率。以下是进行电脑微信聊天记录监控的一般步骤和建议&#xff1a; 如何进行监控&#xff1a; 1.明确目的与合法性&…

滑动窗口(LeeCode209题,以JS为例)

什么是滑动窗口&#xff1f; 滑动窗口是算法中一种非常有用的技术&#xff0c;特别是在处理数据序列或数组时。它的核心思想是维护一个固定大小的窗口&#xff0c;这个窗口在数据序列上滑动&#xff0c;以便于在窗口内的元素上进行操作或计算。滑动窗口技术通常用于解决与数据…

2024年粤港澳青少年信息学创新大赛图形化编程小低组真题试卷

2024年粤港澳青少年信息学创新大赛图形化编程小低组真题试卷 题目总数&#xff1a;16 总分数&#xff1a;100 单选题 第 1 题 单选题 默认小猫角色&#xff0c;以下哪个Scratch程序可以在点击绿旗后让小猫说”你好!"一共10秒? A. B. C. D. 第 2 题 单选题 …

如何根据使用场景选购3D扫描仪?

三维扫描建模是指通过专业的三维扫描仪对产品进行三维数据的采集&#xff0c;快速获取物体精确的3D数据&#xff0c;实现1:1复刻原物体&#xff0c;扫描后所得的数字化3D模型以obj、fbx、glb、gltf等格式保存。 积木易搭自主研发多款三维扫描设备&#xff0c;拥有多项国家专利&…

[240617] RFC 9562-UUIDs,取代原来的 RFC 4122 | ChatGPT 导致线上自由职业者的需求大幅下降

目录 RFC 9562 - UUIDs - 2405发布&#xff0c;取代原来的 RFC 4122ChatGPT 导致线上自由职业者的需求大幅下降 RFC 9562 - UUIDs - 2405发布&#xff0c;取代原来的 RFC 4122 这份 RFC 中包含了 UUID 八个版本的 定义&#xff0c;但看点是在新引入 v6, v7, v8 详细标准文本可…

剧本杀小程序开发,线上剧本杀游戏新体验

近几年&#xff0c;剧本杀行业快速崛起&#xff0c;吸引了广大年轻人的眼光&#xff0c;成为年轻人社交娱乐的新选择。剧本杀在线上也崭露头角&#xff0c;获得大众的关注&#xff0c;性价比高的优势成为了大众玩剧本杀的首要方式。 随着互联网的快速发展&#xff0c;年轻人都…

windows11子系统Ubuntu 22.04.4子安装图形化界面

1、windows11家庭版本设置 打开虚拟机安装许可 2、Microsoft Store下载安装ubuntu 我使用的是22.04.4 LTS版本 3、 打开ubuntu 命令窗口 1、打开win11的命令行&#xff0c;在下拉三角下标&#xff0c;打开&#xff0c;可以看到有Ubuntu 的选项&#xff0c;点击即可进入linux命…

网络层只懂路由?这9个知识点被严重低估了

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 下午好&#xff0c;我的网工朋友。 网络层想必你已经耳熟能详&#xff0c;它的作用自然是不容小觑。 它负责将数据从源头准确地投递到目的地&am…

【大语言模型】本地快速部署Ollama运行大语言模型详细流程

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…