0. 概述
哈希刮削器的一个客户案例是使用AI模型来减少工厂中出现的不良率。为了更深入和易于理解地解释机器学习模型的预测,我撰写了这篇文章。
1. 问题定义
1.1. 目标设定
首先简要描述客户案例,根据128个变量的数据,针对每个机器制造产品时不同机器的不良率不同的情况,通过机器学习模型进行不良品预测,然后分析导致不良的变量,并调整这些变量以降低不良率。
1.2. 假设设立
通过机器学习模型从工艺过程中提取关键变量并进行调整,将降低工艺率的假设设立为目标。
2. 数据收集
2.1. 数据源确定
客户直接提供了工厂每台机器的数据源。
这些数据是公司内部数据,因此直接公开可能有困难,我只能截取文件夹来展示。
2.2. 数据收集
我们请求了至少1万条数据,并要求尽可能多地提供数据。
因此获得的原始数据为:
- 1号机:3,931个
- 2号机:16,473个
- 3号机:2,072个
- 4号机:16,129个
- 5号机:57,970个
- 6号机:78,781个
总共使用约17.5万条数据来训练模型。
3. 数据预处理
3.1. 数据清洗
数据清洗在模型训练中非常重要。我认为数据学习通过机器学习的部分至少占到了80%。
如果训练的数据清洗不好,最终会导致机器学习模型学习不良。 (简单来说,如果您输入垃圾,您将得到垃圾。)
3.2. 操作顺序
3.2.1. 文件编码处理
首先,读取文件时,由于csv的编码格式各不相同,我对其进行了编码处理,有些使用了'cp949',有些使用了'utf-8'。
for file_path in file_paths:
try:
df = pd.read_csv(file_path, encoding='cp949', header=None)
except UnicodeDecodeError:
df = pd.read_csv(file_path, encoding='utf-8', header=None)
3.2.2. 标记工作
为了进行标记,我将日期和时间列合并,并将其与y轴数据连接:
for i in range(len(result_df_new) - 1):
start_time, end_time = result_df_new['Datetime'].iloc[i], result_df_new['Datetime'].iloc[i + 1]
selected_rows = df_yaxis[(df_yaxis['Datetime'] >= start_time) & (df_yaxis['Datetime'] < end_time)]
results.append(1 if all(selected_rows['결과'].str.contains('OK')) else 0)
results.append(0)
3.2.3. 数据合并
将每个机器的预处理数据合并:
data = pd.concat([df1,df2,df3,df4,df6])
data.reset_index(drop=True,inplace=True)
3.2.4. 去重
重复数据可能导致数据集偏见,模型学习数据多样性的问题。此外,可能会导致过拟合问题,因此删除重复数据:
data = data.drop_duplicates().reset_index(drop=True)
3.2.5. 处理缺失值
使用missingno库可视化缺失值,并直接删除缺失值较多的列。删除缺失值较多的列的原因与上述类似。
3.3. 特征工程
为了提高模型性能,特征工程涉及创建新特征或转换现有特征。由于我们无法准确了解每个特征的价值,且认为每个特征都很重要,因此我们没有进行特征工程。
3.4. EDA(探索性数据分析)
检查数据分布
使用直方图、箱线图等图表来检查数据分布。
相关性分析
分析特征之间的相关性,以确定重要特征或解决多重共线性问题。
4. 采样类型
4.1. 处理数据不平衡
由于数据不平衡,我们尝试了多种欠采样技术,结合多个模型进行尝试。我们尝试了多种欠采样技术:
- 随机欠采样(RUS):从多数类中随机删除数据
- NearMiss:保留少数类数据和最接近的k个多数类数据
- Tomek Links:找到最接近的数据对并删除多数类数据
- Edited Nearest Neighbors (ENN):使用k-NN算法删除多数类数据
- Neighbourhood Cleaning Rule (NCL):ENN的扩展版本
最终我们认为ENN欠采样最适合我们的模型,并应用了它。
# NearMiss 인스턴스 생성
nm = NearMiss()
# 언더샘플링 수행
X_resampled, y_resampled = nm.fit_resample(data.drop('결과', axis=1), data['결과'])
# 언더샘플링 결과를 DataFrame으로 변환
data_sample = pd.concat([X_resampled, y_resampled], axis=1)
5. 建模
5.1. 模型选择
根据问题类型(分类、回归、聚类等),选择适当的机器学习模型。在模型选择方面,我们尝试了多个模型,但最终根据PyCaret库选出的最佳模型进行选择。
PyCaret是Python的开源数据分析和机器学习自动化库。PyCaret可以帮助用户快速构建和实验整个数据分析和机器学习流水线,而只需少量代码。
5.2. 模型训练
使用训练数据训练模型。最终我们选择了CatBoost模型,其AUC值和F1分数值最高。
评估指标说明:
AUC(曲线下面积):
- AUC代表ROC(接收器操作特征)曲线下的面积。
- AUC值介于0和1之间,值越接近1,说明分类器性能越好。
- AUC在不平衡类分布中特别有用。
F1分数:
- F1分数是精确度(Precision)和召回率(Recall)的调和平均值。
- 精确度是正确预测为正类别的样本占所有预测为正类别的样本的比例,召回率是实际为正类别的样本中被正确预测为正类别的比例。
- F1分数的值介于0和1之间,值越高,模型性能越好。
6. 结论:变量推导和增强直观性的功能增强
最终,我们通过实时获取工厂机器生成的原始数据,并通过该模型进行预测,使用SHAP库推导出导致不良品的变量。
此外,为了方便工厂工作人员,在PyInstaller的帮助下,我们生成了一个exe文件,使得最终的Excel文件可以轻松查看,一键点击即可查看原始数据的变量和不良品判断。
SHAP是什么?
SHAP代表SHapley Additive exPlanations,是用于解释机器学习模型中每个特征对预测的影响程度的工具。这提高了模型的“透明度”,从而提高了对预测过程的信任度。
结论
在哈希刮削器的这种案例中,我们基于上述方法的AI模型进行项目开发。从数据预处理到建模,再到为最终用户提供直观界面的完整解决方案,有效地降低了实际工艺中的不良率。




