当前位置: 首页 > news >正文

半导体数据分析: 玩转WM-811K Wafermap 数据集(三) AI 机器学习

前面我们已经通过两篇文章,一起熟悉了WM-811K Wafermap 数据集,并对其中的一些数据进行了调用,生成了一些统计信息和图片。今天我们接着继续往前走。

半导体数据分析: 玩转WM-811K Wafermap 数据集(二) AI 机器学习_wm811k数据集-CSDN博客

半导体数据分析: 玩转WM-811K Wafermap 数据集(一) AI 机器学习_wafer dataset-CSDN博客

当我们在处理大规模的数据集的时候,很多人都会有一种束手无策的感觉,尤其是面对海量的数据和复杂的结构时,可能会感到无从下手。我的经验就是抽丝剥茧,一步步来。实际上,通过系统化的步骤和合理的策略,我们可以有效地应对这些挑战。

搞过数据分析的都知道,缺失值的检查是数据处理过程中不可忽视的一环。当我们浏览数据集时,可能会发现相当一部分数据由于缺失值而变得无用。这些缺失值可能源于数据采集过程中的误差、设备故障或其他原因。为了确保后续分析的准确性,我们需要识别并处理这些缺失值。

当然,明确分析目标也非常重要。例如,如果我们只对具有特定故障类型标签的晶圆感兴趣,那么可以删除那些没有故障类型标签的数据。这样做不仅能够减少数据集的规模,还能提高数据的质量,使分析结果更加聚焦和可靠。

下面我我们就将整个数据做一些初步的处理,我们先来处理失效形式和训练类型。

之前我们从数据集中取出过一些数据  显示如下:

其中有两项  trianTestLabel和failureType,分别代表了训练测试标签,和失效标签。

我们对这两项通过下面的代码来进行处理:

import pandas as pdmp_file = "/data_disk/public_lib/wm811k_wafer_map/in/LSWMD.pkl"
df = pd.read_pickle(mp_file)df['failureNum']=df.failureType
df['trainTestNum']=df.trianTestLabel
mapping_type={'Center':0,'Donut':1,'Edge-Loc':2,'Edge-Ring':3,'Loc':4,'Random':5,'Scratch':6,'Near-full':7,'none':8}
mapping_traintest={'Training':0,'Test':1}
df=df.replace({'failureNum':mapping_type, 'trainTestNum':mapping_traintest})
tol_wafers = df.shape[0]
tol_wafers

在上面的代码中,我们抽取了  trianTestLabel 和failureNum 两列,分别重新命名为两列failureNum和trainTestNum,并通过两个字典mapping_type 和mapping_traintest进行了映射。在df.shape[0]中 返回 df 数据框的行数,即数据集中的总晶圆数量。该值存储在变量 tol_wafers 中。

811457

总数的晶圆是811457张。

然后我们来统计一下,失效的形式:

df_withlabel = df[(df['failureNum']>=0) & (df['failureNum']<=8)]
df_withlabel =df_withlabel.reset_index()
df_withpattern = df[(df['failureNum']>=0) & (df['failureNum']<=7)]
df_withpattern = df_withpattern.reset_index()
df_nonpattern = df[(df['failureNum']==8)]
df_withlabel.shape[0], df_withpattern.shape[0], df_nonpattern.shape[0]

上面的代码列出了三种标签 全部标签(0-8),有标记的标签(0-7),和 无标记的标签(8)。

并且每次取出标签的时候,都进行了重新索引:reset_index()。 这里对这个重新索引稍微解释一下:

重置索引通常是数据处理中的一个重要步骤,特别是在筛选数据或进行某些操作后。下面是重置索引的几个常见原因:

1. 确保索引连续

当你对 DataFrame 进行筛选或过滤后,原始数据的索引可能会变得不连续。例如,假设你从一个 DataFrame 中删除了一些行,结果就是剩余的行的索引会留下“空隙”。重置索引可以让你重新生成连续的索引,通常是从 0 开始递增的整数。

2. 方便后续操作

使用连续的整数索引使得后续的操作更简单。例如,在进一步分析或可视化数据时,连续的索引能避免因为跳跃的索引导致的潜在错误。它还可以帮助在合并(merge)或连接(concat)时避免索引冲突。

3. 删除旧的索引列

在使用 reset_index() 时,如果你不指定参数,原来的索引会被添加为一个新列。例如,如果你过滤掉了 DataFrame 的一些行,原索引列可能仍然包含那些被删除行的索引。重置索引不仅让索引连续,而且会去掉原始的索引列(除非你选择保留它)。

4. 避免潜在的错误

如果后续的操作需要基于索引进行一些处理(比如索引与行数的关联),不连续的索引可能会导致逻辑错误或不一致。重置索引确保了数据的索引一致性,减少了潜在的错误发生。

5. 保持代码整洁

有时,重置索引是为了保证代码简洁和易于阅读。尤其是当数据已经过多次筛选、过滤、分组等操作后,重新整洁的索引可以让分析过程更加清晰,避免在后续处理中迷失。

6. 去除层次索引(如果有)

如果在处理过程中曾经使用过多级索引(MultiIndex),可以通过 reset_index() 来降级到简单的单级索引,使得数据的访问和管理更为直观。

pandas 中,重新索引(reset index) 的主要目的是为数据框的索引(下标)重新分配连续的整数值,同时可以选择是否保留旧索引作为新列。

上面代码的最终运行结果是:

(172950, 25519, 147431)

这意味着172950片晶圆有标签,其中25519片晶圆被标记了失效形式,147431片晶圆没有标记失效形式。这个统计数据对我们后面用ai进行数据分析有参考作用。

然后我们来做一个统计图:

#创建图形和子图:
fig = plt.figure(figsize=(20, 4.5)) 
gs = gridspec.GridSpec(1, 2, width_ratios=[1, 2.5]) 
ax1 = plt.subplot(gs[0])
ax2 = plt.subplot(gs[1])#饼图:展示晶圆的标签分类
no_wafers = [tol_wafers - df_withlabel.shape[0], df_withpattern.shape[0], df_nonpattern.shape[0]]colors = ['silver', 'orange', 'gold']
explode = (0.1, 0, 0) 
labels = ['no-label', 'label&pattern', 'label&non-pattern']
ax1.pie(no_wafers, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%', shadow=True, startangle=140)#条形图:显示不同故障类型的分布
uni_pattern = np.unique(df_withpattern.failureNum, return_counts=True)
labels2 = ['', 'Center', 'Donut', 'Edge-Loc', 'Edge-Ring', 'Loc', 'Random', 'Scratch', 'Near-full']ax2.bar(uni_pattern[0], uni_pattern[1] / df_withpattern.shape[0], color='gold', align='center', alpha=0.9)
ax2.set_title("Failure Type Frequency")
ax2.set_ylabel("% of Pattern Wafers")plt.show()

 运行结果如下:

根据failureType变量过滤,172950片晶圆有标签,而78.7%的晶圆没有标签。在贴有标签的晶圆片中,只有3.1%(25,519片)的晶圆片存在真正的失效模式,而147,431片晶圆片仍贴有“无”标签。因此,我们只关注这25,519个实例,这大大减少了我们工作的计算量。从上面的第二张图中,数据集显示出,失效形式呈现出了高度的不平衡分布。

图片展示数据是一种最佳数据展示的方式之一,因此观察原始数据的最好方法是进行数据可视化。接下来我们用数据集中标记的模式显示前100个样本。 

fig, ax = plt.subplots(nrows = 10, ncols = 10, figsize=(20, 20))
ax = ax.ravel(order='C')
for i in range(100):img = df_withpattern.waferMap[i]ax[i].imshow(img)ax[i].set_title(df_withpattern.failureType[i][0][0], fontsize=10)ax[i].set_xlabel(df_withpattern.index[i], fontsize=8)ax[i].set_xticks([])ax[i].set_yticks([])
plt.tight_layout()
plt.show() 

 

我们同样也可以通过失效形式分别来绘制晶圆图:

x = [0,1,2,3,4,5,6,7]
labels2 = ['Center','Donut','Edge-Loc','Edge-Ring','Loc','Random','Scratch','Near-full']for k in x:fig, ax = plt.subplots(nrows = 1, ncols = 10, figsize=(18, 12))ax = ax.ravel(order='C')for j in [k]:img = df_withpattern.waferMap[df_withpattern.failureType==labels2[j]]for i in range(10):ax[i].imshow(img[img.index[i]])ax[i].set_title(df_withpattern.failureType[img.index[i]][0][0], fontsize=10)ax[i].set_xlabel(df_withpattern.index[img.index[i]], fontsize=10)ax[i].set_xticks([])ax[i].set_yticks([])plt.tight_layout()plt.show() 

然后我们从上面选取几种来进行放大可视:

根据上面的编号选取: [12,340, 8, 14, 13, 66, 15, 189] 
x = [12, 340, 8, 14, 13, 66, 15, 189]
labels2 = ['Center','Donut','Edge-Loc','Edge-Ring','Loc','Random','Scratch','Near-full']#ind_def = {'Center': 9, 'Donut': 340, 'Edge-Loc': 3, 'Edge-Ring': 16, 'Loc': 0, 'Random': 25,  'Scratch': 84, 'Near-full': 37}
fig, ax = plt.subplots(nrows = 2, ncols = 4, figsize=(20, 10))
ax = ax.ravel(order='C')
for i in range(8):img = df_withpattern.waferMap[x[i]]ax[i].imshow(img)ax[i].set_title(df_withpattern.failureType[x[i]][0][0],fontsize=24)ax[i].set_xticks([])ax[i].set_yticks([])
plt.tight_layout()
plt.show() 

 经过上面的可视化,我们进一步加深了对这个数据集的了解,后面我们将对数据进行转换:通过使用缩放、属性分解和属性聚合的工程特征,转换为机器学习准备的预处理数据。

相关文章:

半导体数据分析: 玩转WM-811K Wafermap 数据集(三) AI 机器学习

前面我们已经通过两篇文章&#xff0c;一起熟悉了WM-811K Wafermap 数据集&#xff0c;并对其中的一些数据进行了调用&#xff0c;生成了一些统计信息和图片。今天我们接着继续往前走。 半导体数据分析&#xff1a; 玩转WM-811K Wafermap 数据集&#xff08;二&#xff09; AI…...

【.net core】【sqlsugar】时间查询示例

1、时间包含查询示例 //model.TimeInterval为时间区间参数&#xff0c;参数格式为2024-01-01~2025-01-01 //query为当前查询的语句内容 //为当前查询语句增加创建时间模糊搜索查询条件 query query.Where(a > ((DateTime)a.F_CreatorTime).ToString("yyyy-MM-dd HH:m…...

Kotlin 协程基础十 —— 协作、互斥锁与共享变量

Kotlin 协程基础系列&#xff1a; Kotlin 协程基础一 —— 总体知识概述 Kotlin 协程基础二 —— 结构化并发&#xff08;一&#xff09; Kotlin 协程基础三 —— 结构化并发&#xff08;二&#xff09; Kotlin 协程基础四 —— CoroutineScope 与 CoroutineContext Kotlin 协程…...

Java中网络编程的学习

目录 网络编程概述 网络模型 网络通信三要素: IP 端口号 通信协议 IP地址&#xff08;Internet Protocol Address&#xff09; 端口号 网络通信协议 TCP 三次握手 四次挥手 UDP TCP编程 客户端Socket的工作过程包含以下四个基本的步骤&#xff1a; 服务器程序…...

[计算机网络]一. 计算机网络概论第一部分

作者申明&#xff1a;作者所有文章借助了各个渠道的图片视频以及资料&#xff0c;在此致谢。作者所有文章不用于盈利&#xff0c;只是用于个人学习。 1.0推荐动画 【网络】半小时看懂<计算机网络>_哔哩哔哩_bilibili 1.1计算机网络在信息时代的作用 在当今信息时代&…...

【0393】Postgres内核 checkpointer process ③ 构建 WAL records 工作缓存区

1. 初始化 ThisTimeLineID、RedoRecPtr 函数 InitXLOGAccess() 内部会初始化 ThisTimeLineID、wal_segment_size、doPageWrites 和 RedoRecPtr 等全局变量。 下面是这四个变量初始化前的值: (gdb) p ThisTimeLineID $125 = 0 (gdb) p wal_segment_size $126 = 16777216 (gdb…...

正则表达式基础知识及grep、sed、awk常用命令

文章目录 前言一、正则表达式元字符和特性1. 字符匹配2. 量词3. 字符类4. 边界匹配5. 分词和捕获6. 特殊字符7. 位置锚定 二、grep常用参数1. -n额外输出行号2. -v 排除匹配的行3. -E 支持扩展正则匹配4. -e进行多规则匹配搜索5. -R 递归匹配目录中的文件内容6. -r递归地搜索目…...

redhat安装docker 24.0.7

1、下载docker镜像包 wget https://download.docker.com/linux/static/stable/x86_64/docker-24.0.7.tgz 2、解压 tar -xvf docker-24.0.7.tgz 3、解压的docker文件夹全部移动至/usr/bin目录 cd docker cp -p docker/* /usr/bin 4、注册服务 vi /usr/lib/systemd/syste…...

【excel】VBA简介(Visual Basic for Applications)

文章目录 一、基本概念二、语法2.1 数据类型2.11 基本数据类型2.12 常量2.13 数组 2.2 控制语句2.21 条件语句2.22 循环语句2.23 错误处理&#xff1a;On Error2.24 逻辑运算 2.3 其它语句2.31 注释2.32 with语句 2.4 表达式2.41 常见表达式类型2.42 表达式的优先级 2.5 VBA 的…...

【大厂面试AI算法题中的知识点】方向涉及:ML/DL/CV/NLP/大数据...本篇介绍为什么self-attention可以堆叠多层,这有什么作用?

【大厂面试AI算法题中的知识点】方向涉及&#xff1a;ML/DL/CV/NLP/大数据…本篇介绍为什么self-attention可以堆叠多层&#xff0c;这有什么作用&#xff1f; 【大厂面试AI算法题中的知识点】方向涉及&#xff1a;ML/DL/CV/NLP/大数据…本篇介绍为什么self-attention可以堆叠…...

NanoKVM简单开箱测评和拆解,让普通电脑实现BMC/IPMI远程管理功能

Sipeed推出了NanoKVM&#xff0c;简直是没有BMC的台式机和工作站的福音。有了这个就可以轻松实现以往服务器才有的远程管理功能。 NanoKVM 简介 Lichee NanoKVM 是基于 LicheeRV Nano 的 IP-KVM 产品&#xff0c;继承了 LicheeRV Nano 的极致体积 和 强大功能。 NanoKVM 包含…...

【Idea】编译Spring源码 read timeout 问题

Idea现在是大家工作中用的比较多的开发工具&#xff0c;尤其是做java开发的&#xff0c;那么做java开发&#xff0c;了解spring框架源码是提高自己技能水平的一个方式&#xff0c;所以会从spring 官网下载源码&#xff0c;导入到 Idea 工具并编译&#xff0c;但是发现build的时…...

VSCode的配置与使用(C/C++)

从0开始教你在vscode调试一个C文件 一.首先是配置你的编译环境&#xff0c;添加到环境变量&#xff08;默认你是全新的电脑&#xff0c;没有安装vs2019之类的&#xff09; 原因&#xff1a;因为相比于vs2019&#xff0c;vscode只是个代码编辑器&#xff0c;相当于一个彩色的、…...

SpringMVC (1)

目录 1. 什么是Spring Web MVC 1.1 MVC的定义 1.2 什么是Spring MVC 1.3 Spring Boot 1.3.1 创建一个Spring Boot项目 1.3.2 Spring Boot和Spring MVC之间的关系 2. 学习Spring MVC 2.1 SpringBoot 启动类 2.2 建立连接 1. 什么是Spring Web MVC 1.1 MVC的定义 MVC 是…...

本地部署大模型—MiniCPM-V 2.0: 具备领先OCR和理解能力的高效端侧多模态大模型

MiniCPM-V 2.0: 具备领先OCR和理解能力的高效端侧多模态大模型 简介 MiniCPM 系列的最新多模态版本 MiniCPM-V 2.0。该模型基于 [MiniCPM 2.4B和 SigLip-400M 构建,共拥有 2.8B 参数。MiniCPM-V 2.0 具有领先的光学字符识别(OCR)和多模态理解能力。该模型在综合性 OCR 能力…...

国产linux系统(银河麒麟,统信uos)使用 PageOffice 实现后台批量生成PDF文档

PageOffice 国产版 &#xff1a;支持信创系统&#xff0c;支持银河麒麟V10和统信UOS&#xff0c;支持X86&#xff08;intel、兆芯、海光等&#xff09;、ARM&#xff08;飞腾、鲲鹏、麒麟等&#xff09;、龙芯&#xff08;LoogArch&#xff09;芯片架构。 PageOffice 版本&…...

Python 扫描枪读取发票数据导入Excel

财务需要一个扫描枪扫描发票文件&#xff0c;并将主要信息录入Excel 的功能。 文件中sheet表的列名称&#xff0c;依次为&#xff1a;发票编号、发票编码、日期、金额、工号、扫描日期。 扫描的时候&#xff0c;Excel 文件需要关闭&#xff0c;否则会报错。 import openpyxl …...

电源自动测试系统中的ate定制化包含哪些内容?

1. 测试项目和指标 基础测试项目&#xff1a;虽然大多数电源模块的基础测试项目&#xff08;如输入输出电压、电流、效率等&#xff09;已经包含在测试系统中&#xff0c;但针对特殊或小众的测试项目&#xff0c;如VPX电源测试时的通讯验证&#xff0c;可以根据客户需求进行定…...

人工智能-机器学习之多分类分析(项目实战二-鸢尾花的多分类分析)

Softmax回归听名字&#xff0c;依然好像是做回归任务的算法&#xff0c;但其实它是去做多分类任务的算法。 篮球比赛胜负是二分类&#xff0c;足球比赛胜平负就是多分类 识别手写数字0和1是二分类&#xff0c;识别手写数字0-9就是多分类 Softmax回归算法是一种用于多分类问题…...

多包单仓库(monorepo)实现形式

目录 背景 需求和方案 从0开始搭建一个Monorepo项目 创建 配置全局公共样式 配置全局公共组件 方式1:不需要独立发布的组件包,只在当前项目的子项目中使用 方式2:需要独立发布和版本维护的包 子项目的独立构建和部署 总结 Monorepo优势 便于代码维护、管理 支持…...

Java冒泡排序算法之:变种版

什么是冒泡排序算法&#xff1f; 冒泡排序是一种简单的排序算法&#xff0c;通过多次遍历待排序的数组&#xff0c;逐步将最大的&#xff08;或最小的&#xff09;元素“冒泡”到数组的一端。它以其操作过程类似气泡从水底冒至水面而得名。 冒泡排序的工作原理 比较相邻元素&…...

AAPM:基于大型语言模型代理的资产定价模型,夏普比率提高9.6%

“AAPM: Large Language Model Agent-based Asset Pricing Models” 论文地址&#xff1a;https://arxiv.org/pdf/2409.17266v1 Github地址&#xff1a;https://github.com/chengjunyan1/AAPM 摘要 这篇文章介绍了一种利用LLM代理的资产定价模型&#xff08;AAPM&#xff09;…...

Spring常见知识

1、什么是spring的ioc&#xff1f; 其实就是控制反转&#xff0c;提前定义了一个bean&#xff0c;到时候使用的时候直接autowire就可以了。目的是减低计算机代码之间的耦合度。 创建三个文件&#xff0c;分别是Bean的定义、Bean的使用、Bean的配置。 IOC通过将对象创建和管理…...

计算机网络的五层协议

计算机网络的五层协议 ‌计算机网络的五层协议模型包括物理层、数据链路层、网络层、传输层和应用层&#xff0c;每一层都有其特定的功能和相关的协议。‌‌1 ‌物理层‌&#xff1a;负责传输原始的比特流&#xff0c;通过线路&#xff08;有线或无线&#xff09;将数据转换为…...

Bluetooth LE Audio - 蓝牙无线音频新应用 (上)

SIG联盟&#xff08;Bluetooth Special Interest Group&#xff09;自2020年开始推广新的LE Audio&#xff0c;在穿戴式装置掀起一股热潮&#xff0c;各个品牌商、制造商、第三方软件商都积极的寻找新的LE Audio规格究竟能提供什么样的新应用。究竟LE Audio如何改变你我的生活、…...

如何快速准备数学建模?

前言 大家好,我是fanstuck。数学建模不仅是解决复杂现实问题的一种有效工具,也是许多学科和行业中的关键技能。从工程、经济到生物、环境等多个领域,数学建模为我们提供了将实际问题转化为数学形式,并利用数学理论和方法进行求解的强大能力。然而,对于许多初学者而言,如…...

如何在linux系统上完成定时开机和更新github端口的任务

任务背景 1.即使打开代理&#xff0c;有的时候github去clone比较大的文件时也会出问题。这时需要每小时更新一次github的host端口&#xff1b; 2.马上要放假&#xff0c;想远程登录在学校的台式电脑&#xff0c;但学校内网又不太好穿透。退而求其次&#xff0c;选择定时启动电…...

Jupyter notebook中运行dos指令运行方法

Jupyter notebook中运行dos指令运行方法 目录 Jupyter notebook中运行dos指令运行方法一、DOS(磁盘操作系统&#xff09;指令介绍1.1 DOS介绍1.2 DOS指令1.2.1 DIR - 显示当前目录下的文件和子目录列表。1.2.2 CD 或 CHDIR - 改变当前目录1.2.3 使用 CD .. 可以返回上一级目录1…...

探索 Linux:(一)介绍Linux历史与Linux环境配置

探索 Linux:&#xff08;一&#xff09;介绍Linux历史与Linux环境配置 一. 计算机与操作系统的历史1.1计算机的历史1.2操作系统的历史 二、Unix 操作系统的历史三、Linux 与安卓的关系3.1Linux 与安卓的关系3.2安卓的历史 四、Linux 简单介绍五、Linux 环境安装5.1 虚拟机5.2 直…...

前端【2】html添加样式、CSS选择器

一、为html添加样式的三种方法 1、内部样式 2、外部样式 3、行内样式 二、css的使用--css选择器 1、css基本选择器 元素选择器 属性选择器 id选择器 class/类选择器 通配符选择器 2、群组选择器-多方面筛选 3、关系选择器 后代选择器【包含选择器】 子元素选择器…...