半导体数据分析: 玩转WM-811K Wafermap 数据集(二) AI 机器学习
一、数据集回顾
前面我们已经基本了解了WM-811K Wafermap 数据集,并通过几段代码,熟悉了这个数据集的数据结构,这里为了方便各位连续理解,让我们再回顾一下:
WM-811K Wafermap 数据集是一个在半导体制造领域广泛使用的公开数据集,主要用于晶圆缺陷模式识别和分析。该数据集包含了大量晶圆图(wafer maps),这些图展示了半导体制造过程中晶圆上的缺陷分布情况。以下是该数据集的一些关键信息:
数据集概述
-
数据量:WM-811K 数据集包含约 811,457 张晶圆图。
-
缺陷类型:数据集中标注了多种常见的缺陷模式,如中心缺陷、边缘缺陷、局部缺陷、环形缺陷等。
-
应用场景:该数据集常用于机器学习、深度学习和模式识别任务,特别是在半导体制造中的缺陷检测和分类。
数据集结构
-
晶圆图:每张晶圆图是一个二维矩阵,表示晶圆上的缺陷分布。
-
标签:每张图都有对应的标签,标明缺陷的类型或模式。
-
元数据:可能包含制造过程中的其他相关信息,如工艺参数、设备状态等。
应用
-
缺陷分类:通过训练模型,自动识别和分类晶圆上的缺陷模式。
-
质量控制:帮助制造商优化工艺,减少缺陷率,提高良品率。
-
研究:用于学术研究和工业应用中的算法开发和验证。
以下是上次我们演示过的,数据集的最后5条记录:
如果你没有看过我之前的文章,建议先看一下:
半导体数据分析: 玩转WM-811K Wafermap 数据集(一) AI 机器学习_wafer dataset-CSDN博客 我们接着上一篇文章来继续深入了解这个数据的结构和内容
二、基本统计
如果按照前面我们介绍的数据来计算,这个数据集收集自实际工厂的47,543个批次。但是,47,543个批次× 25个晶圆/批次=1,157,325张晶圆图比811,457张晶圆图要多出许多。为什么这个数据集实际只有811,457片wafer呢?
频次统计
从上面的图片看,每个批次(LOT)最多有25片Wafer(waferIndex <=25),so, 我们清楚地看到,最后两个批次分别是1片和2片。所以并不是每个Lot都有完整的25片wafer的!
我们通过下面的代码,来统计每个Lot中waferIndex的出现频率:
import pandas as pd # 导入 Pandas 库,用于数据处理和分析
import numpy as np # 导入 NumPy 库,用于科学计算和数组操作
import matplotlib.pyplot as plt # 导入 Matplotlib 的 pyplot 模块,用于绘图
%matplotlib inline # Jupyter Notebook 的魔法命令,使图形直接显示在 Notebook 中
# 定义数据文件的路径 -- 这是我自己的路径,每个人都不会相同,请注意
mp_file = "/data_disk/public_lib/wm811k_wafer_map/in/LSWMD.pkl"
# 使用 Pandas 读取 pickle 格式的数据文件,并将其加载到 DataFrame 中
df = pd.read_pickle(mp_file)
# 使用 NumPy 的 unique 函数统计 df.waferIndex 列中的唯一值及其出现次数
# uni_Index 是一个包含两个数组的元组:唯一值数组和对应的计数数组
uni_Index = np.unique(df.waferIndex, return_counts=True)
# 使用 Matplotlib 绘制柱状图
# uni_Index[0] 是 x 轴数据(唯一值),uni_Index[1] 是 y 轴数据(出现次数)
# color='gold' 设置柱状图颜色为金色,align='center' 使柱状图居中,alpha=0.5 设置透明度
plt.bar(uni_Index[0], uni_Index[1], color='gold', align='center', alpha=0.5)
# 设置图表的标题
plt.title("wafer Index distribution")
# 设置 x 轴的标签
plt.xlabel("index #")
# 设置 y 轴的标签
plt.ylabel("frequency")
# 设置 x 轴的范围为 0 到 26
plt.xlim(0, 26)
# 设置 y 轴的范围为 30000 到 34000
plt.ylim(30000, 34000)
# 显示绘制的图表
plt.show()
运行代码,显示如下:
从图中可以看出,并非所有批次都有完美的25片晶圆,这可能是由于传感器故障或其他未知问题造成的。换句话说,waferIndex
列的值可能不完整或不一致,这可能会影响后续的数据分析或建模。
所幸我们在分类中不需要索引特性,因此我们可以删除这个字段。
df = df.drop(['waferIndex'], axis = 1)
所以你看到,我们这样就删除了这个字段:
新增字段
从上面的数据中,虽然从 wafer map
列中无法直接提取出很多有用的信息,但我们可以观察到每个晶圆图(wafer map)的尺寸(die size)是不同的。因此,让我们创建一个新的量 waferMapDim
来记录每个晶圆图的尺寸信息,以便后续分析或处理。
运行以下的代码:
import pandas as pd # 导入 Pandas 库,用于数据处理和分析
import numpy as np # 导入 NumPy 库,用于科学计算和数组操作
# 定义数据文件的路径
mp_file = "/data_disk/public_lib/wm811k_wafer_map/in/LSWMD.pkl"
# 使用 Pandas 读取 pickle 格式的数据文件,并将其加载到 DataFrame 中
df = pd.read_pickle(mp_file)
# 移除 DataFrame 中的 'waferIndex' 列,因为该列在当前任务中不需要
#这行代码删除了 df 中的 waferIndex 列。axis=1 表示删除的是列(axis=0 是删除行)。
df = df.drop(['waferIndex'], axis=1)
# 定义一个函数 find_dim,用于计算二维数组的尺寸
def find_dim(x):
"""
计算二维数组的尺寸(行数和列数)。
参数:
x (np.array): 输入的二维数组。
返回:
tuple: 包含行数和列数的元组。
"""
dim0 = np.size(x, axis=0) # 计算数组的行数
dim1 = np.size(x, axis=1) # 计算数组的列数
return dim0, dim1 # 返回行数和列数
# 对 DataFrame 中的 'waferMap' 列应用 find_dim 函数,计算每个晶圆图的尺寸,并将结果存储在新列 'waferMapDim' 中
df['waferMapDim'] = df.waferMap.apply(find_dim)
# 随机抽取 DataFrame 中的 5 行数据,用于查看结果
df.sample(5)
代码释义:
这段代码的功能是读取数据集文件,处理其中的数据,并计算出每个“waferMap”列的维度信息。
1. 导入必要的库
import pandas as pd
import numpy as np
pandas
是一个强大的数据处理库,常用于数据清洗和分析。通过pd
引用。numpy
是一个用于科学计算的库,尤其擅长数组操作和数学计算。通过np
引用。
2. 读取 .pkl
文件
mp_file = "/data_disk/public_lib/wm811k_wafer_map/in/LSWMD.pkl"
df = pd.read_pickle(mp_file)
mp_file
定义了文件的路径,LSWMD.pkl
是一个 pickle 文件,这个文件保存了数据。pd.read_pickle(mp_file)
用于从.pkl
文件中读取数据,并将其加载为一个DataFrame
。df
是这个数据框。
3. 删除指定列
df = df.drop(['waferIndex'], axis=1)
- 这行代码删除了
df
中的waferIndex
列。axis=1
表示删除的是列(axis=0
是删除行)。
4. 定义函数 find_dim
def find_dim(x):
dim0 = np.size(x, axis=0)
dim1 = np.size(x, axis=1)
return dim0, dim1
find_dim
是一个函数,用来计算输入对象x
的维度。这个函数接受一个二维对象(如矩阵或数组)并返回其两个维度:np.size(x, axis=0)
获取x
的第一个维度(行数)。np.size(x, axis=1)
获取x
的第二个维度(列数)。
5. 应用 find_dim
函数到 waferMap
列
df['waferMapDim'] = df.waferMap.apply(find_dim)
df.waferMap
是DataFrame
中的waferMap
列,假设它包含二维数组或类似的数据结构。.apply(find_dim)
将find_dim
函数应用到waferMap
列的每个元素上,计算每个元素的维度,并将结果存储在新的列waferMapDim
中。
find_dim
函数被应用于 df.waferMap
列的每个元素。这里的关键是理解 .apply()
函数的工作原理。
详细解释:
df.waferMap
是DataFrame
中的一个列,假设它包含的是一系列二维数组或者列表(在你的数据中表现为嵌套的列表,如[[0, 0, 0, 0, 0, 0, ...]]
)。每个元素对应一个waferMap
,即一个二维的矩阵或者数组。df.waferMap.apply(find_dim)
会对df.waferMap
列中的每个元素应用find_dim
函数。
find_dim
函数的输入:
find_dim
函数的输入是 df.waferMap
列中的每个元素,也就是每个 waferMap
。根据这些数据,这些 waferMap
看起来是二维的列表或数组。
举个例子:
- 假设某个
waferMap
的值是:[[0, 0, 0], [1, 1, 1], [2, 2, 2]]
- 这是一个 3 行 3 列的二维列表。
find_dim
函数会接收到这个二维列表,并计算它的维度:np.size(x, axis=0)
会返回3
(行数)。np.size(x, axis=1)
会返回3
(列数)。- 所以,
find_dim
的返回值是(3, 3)
。
6. 查看 df
的随机样本
df.sample(5)
df.sample(5)
随机选择df
中的 5 行,并显示它们。这通常用于快速查看数据的样本。
这段代码的核心功能是处理二维数组(waferMap
)并计算它们的维度信息。
解释了这么多,上面的代码运行的结果如下图:
请注意最后的括号内的数值,也就是说代表了行和列的矩阵,表明了这片wafer的规模。
max(df.waferMapDim), min(df.waferMapDim)
最大和最小就出来了:
加上下面这段代码:
uni_waferDim=np.unique(df.waferMapDim, return_counts=True)
uni_waferDim[0].shape[0]
这行代码涉及到对 df.waferMapDim
列进行去重和计数操作,并访问其结果的一部分。
1. np.unique(df.waferMapDim, return_counts=True)
uni_waferDim = np.unique(df.waferMapDim, return_counts=True)
df.waferMapDim
是DataFrame
中的列,存储了每个waferMap
的维度信息,例如(88, 81)
、(35, 36)
等。np.unique
是 NumPy 的一个函数,返回输入数组中唯一的元素,并可以计算每个唯一元素的出现次数。df.waferMapDim
是要处理的输入数据。return_counts=True
表示除了返回唯一元素本身,还会返回每个唯一元素的出现次数。
因此,uni_waferDim
会是一个元组,包含两个数组:
- 第一个数组是所有 唯一的维度元组(如
(88, 81)
、(35, 36)
等)。 - 第二个数组是每个唯一维度元组在
df.waferMapDim
中出现的次数。
例如,假设 df.waferMapDim
中有以下维度数据:
[(88, 81), (35, 36), (88, 81), (35, 36), (25, 27)]
则 np.unique
会返回:
uni_waferDim[0] = [(88, 81), (35, 36), (25, 27)] # 唯一的维度元组
uni_waferDim[1] = [2, 2, 1] # 每个维度元组出现的次数
2. uni_waferDim[0].shape[0]
uni_waferDim[0].shape[0]
uni_waferDim[0]
是返回的唯一维度元组的数组(例如[(88, 81), (35, 36), (25, 27)]
)。uni_waferDim[0].shape
返回的是这个数组的形状。在这个例子中,uni_waferDim[0]
是一个长度为 3 的数组,因此uni_waferDim[0].shape
会返回(3,)
。.shape[0]
访问的是数组的第一个维度的大小,也就是数组的长度。在这个例子中,uni_waferDim[0].shape[0]
会返回3
,表示有 3 个唯一的维度元组。
uni_waferDim[0].shape[0]
的含义是 返回 waferMapDim
中唯一维度元组的数量。也就是说,统计 df.waferMapDim
列中有多少种不同的维度元组。例如,如果有 3 种不同的维度元组,结果就是 3
。
本例中结果是 632
就是说 唯一维度的元组的数量是 632种。
圆图的尺寸(或者说图像大小)并不总是相同的。我们注意到,数据集中有 632 种不同的尺寸。因此,为了统一输入的尺寸,必须进行数据转换(特征提取),这种方法将在后续章节中介绍。