第四届工业大数据创新竞赛-注塑成型工艺的虚拟量测和调机优化-决赛排名22
发布日期:2021-06-29 19:49:22 浏览次数:2 分类:技术文章

本文共 11991 字,大约阅读时间需要 39 分钟。

比赛类型

回归问题行业解决方案撰写

比赛任务

任务A – 虚拟量测(初赛及决赛)

要求选手针对成型工艺品质异常中尺寸超规问题进行虚拟量测。根据训练集所提供所有模次产品的过程数据和相对应的实际量测值(标签)进行虚拟量测模型建模,然后对测试集中的产品进行尺寸预测,即虚拟量测。

任务B – 调机优化(仅进入决赛的选手参加)

此任务中会提供更多维度(品质异常记录,调机记录)和更长时间跨度的数据。要求选手适当结合任务A中所得到的知识对所有数据,包括预赛数据和决赛数据,进行数据挖掘,并按照模板所要求的格式从以下几个方面完成一份调机优化报告:

  1. 数据集提供了每个产品的生产过程数据,还提供了工艺参数的调机记录和部分原因。请结合这些数据分析现场调机操作的有效性与合理性形成调机优化策略。(有效性:工艺参数的调整是否解决了问题。合理性:是否存在更好的处理方式。)
  2. 任务A数据集中每个模次都提供了尺寸测量信息,而任务B数据集中的模次大多没有精确测量的尺寸信息,只有定期巡检的数据用来作为品质数据的标签数据,那么请问我们是否能评估数据集中标签缺失时段的生产状况。请基于数据分析的证据给出判断。如果能,请分析说明具体品质状况;如果不能,请说明理由。
  3. 工业大数据的质量一直是影响建模表现的重要因素,请结合任务A和任务B,至少从3个方面基于实证指出并说明,数据质量目前存在的问题以及如何进一步提升数据质量(如增加更多的传感器类型,改变采样方式,减少某些非关键数据采样等等)。
  4. 请利用数据挖掘所得到的结果对注塑成型未来智能化升级提出自己的看法。鼓励结合做题过程中的感悟对智能制造以及业工业4.0未来方向的思考。

任务B的补充说明可在决赛数据下载包中获得。

建议参赛选手将两项任务综合考虑。并鼓励参赛选手在尝试不同建模分析方法的同时,能够结合数据场景所对应的物理含义进行挖掘,将工业大数据建模与成型加工制造过程相结合,提高模型的准确性、可解释性和可信度,从而实现知识发现,赋能实际的加工制造过程。

数据描述

本次竞赛的数据集包含以下多种来源:

a) 传感器高频数据:该数据来自于模温机及模具传感器采集的数据,文件夹内每一个模次对应一个csv文件,单个模次时长为40~43s,采样频率根据阶段有20Hz和50Hz两种,含有24个传感器采集的数据;

b) 成型机状态数据(data_spc):该数据来自成型机机台,均为表征成型过程中的一些状态数据,每一行对应一个模次,数据维度为86维;
c) 机台工艺设定参数(data_set):文件夹中含有注塑成型的81种工艺设定参数;
d) 产品测量尺寸(size):文件夹内含有每个模次产品的3维尺寸;
e) 现场巡检数据(初赛不提供此类数据)。各数据字段含义可在数据下载包中获得。
数据概况:
在这里插入图片描述

官方链接

回归算法思路

  1. 将成型机状态数据和传感器高频数据合并,机台工艺参数都是不变的数据,暂不考虑
  2. 提取关键传感器的统计特征,包括但不限于均值、总和等
  3. 训练集和测试集共同进行归一化
  4. SelectKBest或其他方式进行特征选择
  5. 使用KMeans加一个聚类类别特征
  6. 使用遍历的方式找出size1、size2和size3分别应该保留的特征个数
  7. 对lgb进行手动调参,也可使用hyperopt对Lightgbm自动调参
  8. 对size1、size2和size3分别建模,建议考虑模型融合

调机报告撰写思路

  1. 抓住要点:形成调机优化策略提升数据质量注塑成型未来智能化升级
  2. 调机优化策略:将滞后指标(尺寸和重量)通过虚拟量测的方式变成领先指标,如果此时设置的参数经过虚拟量测出来的结果较差,就自动化寻找最优的参数进行调机优化,无需等到注塑品异常了再进行调机优化。
  3. 提升数据质量:一方面可以增加传感器的类型,可以比较不同传感器收集数据的质量,另外,目前很多传感器网络中的数据因为节点软,硬件故障等因素而存在众多数据问题,如数据缺失,异常和失效等这是普遍存在的问题,可以在传感器结合异常检测算法,通过检测算法识别过滤掉异常数据,提升数据的质量。
  4. 注塑成型未来智能化升级:注塑成型工艺的优化、注塑成型装备故障诊断和最优控制、注塑成型工厂生产要素的优化和效能的整体提升、行业发展动态规划与决策支撑等。

比赛经历

任务A最终成果:初赛排名32,总分423813;决赛排名24,取最后一次提交的总分1939583

任务B花了我几天时间,虽然工作压力很大,但还是依然挤出时间,最近几天也是加班加点优化调机报告。我们董事长有十几年的注塑行业经验,亲自指导调机报告的撰写,还请了公司的各个部门的主管来评论与指导,他们也给出了不错的建议。调机报告来回修改了很多个版本,是我们公司团队和董事长积累的多年的经验的精华,报告的算法部分和PROIMM系统部分写得不够详细,希望富士康工业物联网能理解我们的留白,主动找我们公司谈业务。

最终排名22,很感谢我们董事长的指导,调机报告并列第7,排除前六名,应该有个四等奖——智能调机特别奖

在这里插入图片描述

提交记录如下图:

在这里插入图片描述

10月15号初赛阶段大佬们提交的分数,当然部分提交结果可能是同一个人提交的在这里插入图片描述
特征工程代码:

import osimport zipfileimport numpy as npimport pandas as pd# 需要更换此文件夹os.chdir(r'E:\项目文件\注塑成型工艺的虚拟量测和调机优化\赛题二-决赛')# 需要更换此路径src = r'E:\项目文件\注塑成型工艺的虚拟量测和调机优化\\赛题二-初赛\\'# 成型机状态数据df_train_spc = pd.read_csv(src+'Train/data_spc.csv')df_test_spc = pd.read_csv('任务A/data_spc.csv')df_train_spc.drop(columns='remark', inplace=True)df_test_spc.drop(columns='remark', inplace=True)variables1 = ['Sensor1', 'Sensor2', 'Sensor3', 'IJ', 'Sensor5',              'Sensor6', 'MouldTemp1', 'MouldTemp2', 'MouldTemp3', 'MouldTemp4',              'MouldTemp5', 'MouldTemp9', 'MouldTemp10', 'MouldTemp11', 'MouldTemp12',              'MouldTemp13', 'MouldTemp14', 'Sensor8', 'MouldFlow1', 'MouldFlow2',              'MouldFlow3', 'SP']# 训练集传感器高频数据特征提取TRAIN_ZIP = zipfile.ZipFile(src+'Train/传感器高频数据.zip')file_list = TRAIN_ZIP.namelist()feature_n = len(variables1)features_ = np.empty([len(file_list), feature_n])times_ = []mold_id_ = []def feature_columns(variables):    f_cols = []    for v in variables:        f_cols.append(v + '_mean')    return f_colsdef stage_features(df, variables):    avg = []    tmp_df = df.loc[:, variables]    for v in variables:        # 将平均值换成总和        # tmp_avg = tmp_df[v].mean()        tmp_sum = tmp_df[v].sum()        avg.append(tmp_sum)    return np.array(avg)# 传感器高频数据for i, f in enumerate(file_list):    df = pd.read_csv(TRAIN_ZIP.open(f))    tmp = f.split('_')    ti = tmp[2]    mold_id = tmp[3].replace('.csv', '')    times_.append(str(ti))    mold_id_.append(int(mold_id))    if len(df) == 0:        features_[i] = [None for j in range(feature_n)]    else:        features_[i] = stage_features(df, variables1)f_cols = feature_columns(variables1)TRAIN_HIG = pd.DataFrame(features_, columns=f_cols)TRAIN_HIG['Time'] = times_TRAIN_HIG['Id'] = mold_id_TRAIN_HIG = TRAIN_HIG[['Id', 'Time'] + f_cols]TRAIN_ZIP.close()# 测试集高频数据特征提取TEST_ZIP = zipfile.ZipFile('任务A/传感器高频数据.zip')file_list = TEST_ZIP.namelist()feature_n = len(variables1)features_ = np.empty([len(file_list), feature_n])times_ = []mold_id_ = []for i, f in enumerate(file_list):    df = pd.read_csv(TEST_ZIP.open(f))    tmp = f.split('_')    ti = tmp[2]    mold_id = tmp[3].replace('.csv', '')    times_.append(str(ti))    mold_id_.append(int(mold_id))    if len(df) == 0:        features_[i] = [None for j in range(feature_n)]    else:        features_[i] = stage_features(df, variables1)f_cols = feature_columns(variables1)TEST_HIG = pd.DataFrame(features_, columns=f_cols)TEST_HIG['Time'] = times_TEST_HIG['Id'] = mold_id_TEST_HIG = TEST_HIG[['Id', 'Time'] + f_cols]TEST_ZIP.close()TRAIN_HIG.rename(columns={
'Time': 'spcTime'}, inplace=True)TEST_HIG.rename(columns={
'Time': 'spcTime'}, inplace=True)# 成型机状态数据df_train_spc['spcTime'] = df_train_spc['spcTime'].apply(int)df_train_spc['spcTime'] = df_train_spc['spcTime'].apply(str)df_test_spc['spcTime'] = df_test_spc['spcTime'].apply(int)df_test_spc['spcTime'] = df_test_spc['spcTime'].apply(str)# 成型机状态数据和传感器高频数据合并df_TRAIN = TRAIN_HIG.merge(df_train_spc, how='outer', on=['Id', 'spcTime'])df_TEST = TEST_HIG.merge(df_test_spc, how='outer', on=['Id', 'spcTime'])df_TRAIN.to_csv('df_TRAIN.csv', index=False)df_TEST.to_csv('test_js.csv', index=False)

回归算法代码:

import osimport lightgbm as lgbimport numpy as npimport pandas as pdfrom sklearn.model_selection import KFoldfrom sklearn import preprocessingfrom sklearn.cluster import KMeansfrom sklearn.feature_selection import SelectKBest, f_regressionfrom sklearn.metrics import explained_variance_score, mean_squared_errorfrom sklearn.preprocessing import MinMaxScaleros.chdir(r'E:\项目文件\注塑成型工艺的虚拟量测和调机优化\赛题二-决赛')K = 5seed = 1234skf = KFold(n_splits=K, shuffle=True, random_state=seed)lgb_params = {
'boosting_type': 'gbdt', 'objective': 'regression', 'num_leaves': 9, 'subsample': 0.99, 'learning_rate': 0.05, 'seed': 2017, 'nthread': -1}# 归一化、特征筛选、加一个聚类类别特征def min_max_select(X_train, X_test, y_train, head_feature_num): # 训练集和测试集共同进行归一化 df_x_train = X_train.dropna(axis=1, how='any') df_x_test = X_test.dropna(axis=1, how='any') all_data = pd.concat([df_x_train, df_x_test]) scaler = MinMaxScaler(feature_range=(0, 1)) all_data = pd.DataFrame(scaler.fit_transform(all_data), columns=all_data.columns) scaled = pd.DataFrame(preprocessing.scale(all_data), columns=all_data.columns) X_train = scaled.loc[0:len(X_train) - 1] X_test = scaled.loc[len(X_train):] # 特征选择 X_scored = SelectKBest(score_func=f_regression, k='all').fit(X_train, y_train) feature_scoring = pd.DataFrame({
'feature': X_train.columns, 'score': X_scored.scores_ }) feat_scored_headnum = feature_scoring.sort_values('score', ascending=False).head(head_feature_num)['feature'] X_train = X_train[X_train.columns[X_train.columns.isin(feat_scored_headnum)]] X_test = X_test[X_test.columns[X_test.columns.isin(feat_scored_headnum)]] # 加一个聚类类别特征 kms = KMeans(n_clusters=5) y = kms.fit_predict(X_train) data = y.tolist() X_train['category'] = data y = kms.fit_predict(X_test) data = y.tolist() X_test['category'] = data return X_train, X_testdef my_loss(st, sp, size): num_example = sp.shape[0] w = np.ones((sp.shape[0],)) b = np.zeros((sp.shape[0],)) e = np.exp(abs(st - sp) / 0.012) - 1 if size == 'size1': LL = 299.85 UL = 300.15 else: LL = 199.925 UL = 200.075 for i in range(num_example): if st[i] >= LL and st[i] <= UL: if sp[i] < LL or sp[i] > UL: w[i] = 10 if st[i] < LL: b[i] = abs(st[i] - LL) if sp[i] >= LL: w[i] = 10 else: b[i] = abs(st[i] - UL) if sp[i] <= UL: w[i] = 10 a = 100 * b + 1 score = np.sum(w * e * a) / float(num_example) return scoredef model_fit(i): predictions = np.zeros(len(X_test)) for n, (train_index, val_index) in enumerate(skf.split(X_train, y_train)): print("fold {}".format(i)) X_tr, X_val = X_train.iloc[train_index], X_train.iloc[val_index] y_tr, y_val = y_train.iloc[train_index], y_train.iloc[val_index] lgb_train = lgb.Dataset(X_tr, y_tr) lgb_val = lgb.Dataset(X_val, y_val) clf = lgb.train(lgb_params, lgb_train, num_boost_round=1111, valid_sets=[lgb_train, lgb_val], verbose_eval=False) val_pred = clf.predict(X_val, num_iteration=clf.best_iteration) accuracy = my_loss(y_val.values, val_pred, i) evs = explained_variance_score(y_val, val_pred) mse = mean_squared_error(y_val, val_pred) one = [i, n, evs, mse, accuracy] print(one) predictions += clf.predict(X_test, num_iteration=clf.best_iteration) / skf.n_splits return predictionsdf_TRAIN = pd.read_csv('df_TRAIN.csv')df_TEST = pd.read_csv('test_js.csv')size_train = pd.read_csv('Size.csv')X_col = [i for i in df_TRAIN.columns if not i in ['Id', 'spcTime']]sub = pd.read_csv('sub_file.csv')for i in ['size1', 'size2']: print(i) if i == 'size1': head_feature_num = 75 else: head_feature_num = 94 X_train = df_TRAIN[X_col] y_train = size_train[i] X_test = df_TEST[X_col] X_train, X_test = min_max_select(X_train, X_test, y_train, head_feature_num) sub[i] = model_fit(i)# 对size3进行单独建模自动化调参K = 5seed = 1234skf = KFold(n_splits=K, shuffle=True, random_state=seed)from hyperopt import fmin, tpe, hp, partial# 自定义hyperopt的参数空间space = {
"max_depth": hp.randint("max_depth", 5), "num_trees": hp.randint("num_trees", 300), 'learning_rate': hp.uniform('learning_rate', 1e-3, 5e-1), "bagging_fraction": hp.randint("bagging_fraction", 5), "num_leaves": hp.randint("num_leaves", 9), }# 设定参数范围def argsDict_tranform(argsDict, isPrint=False): argsDict["max_depth"] = argsDict["max_depth"] + 5 argsDict['num_trees'] = argsDict['num_trees'] + 150 argsDict["learning_rate"] = argsDict["learning_rate"] * 0.02 + 0.05 argsDict["bagging_fraction"] = argsDict["bagging_fraction"] * 0.1 + 0.5 argsDict["num_leaves"] = argsDict["num_leaves"] * 3 + 10 if isPrint: print(argsDict) else: pass return argsDict# 自动化调参并训练def lightgbm_factory(argsDict): argsDict = argsDict_tranform(argsDict) params = {
'nthread': -1, 'max_depth': argsDict['max_depth'], 'num_trees': argsDict['num_trees'], 'learning_rate': argsDict['learning_rate'], 'bagging_fraction': argsDict['bagging_fraction'], 'num_leaves': argsDict['num_leaves'], 'objective': 'regression', 'feature_fraction': 0.7, 'lambda_l1': 0, 'lambda_l2': 0, 'bagging_seed': 100, 'metric': ['rmse']} predictions = np.zeros(len(X_test)) for n, (train_index, val_index) in enumerate(skf.split(X_train, y_train)): print("fold {}".format(i)) X_tr, X_val = X_train.iloc[train_index], X_train.iloc[val_index] y_tr, y_val = y_train.iloc[train_index], y_train.iloc[val_index] lgb_train = lgb.Dataset(X_tr, y_tr) lgb_val = lgb.Dataset(X_val, y_val) clf = lgb.train(params, lgb_train, num_boost_round=588, valid_sets=[lgb_train, lgb_val], early_stopping_rounds=58) predictions += clf.predict(X_test, num_iteration=clf.best_iteration) / skf.n_splits np.savetxt('result_size3.csv', predictions)i = 'size3'head_feature_num = 104X_train = df_TRAIN[X_col]y_train = size_train[i]X_test = df_TEST[X_col]train, test = min_max_select(X_train, X_test, y_train, head_feature_num)algo = partial(tpe.suggest)try: fmin(lightgbm_factory, space, algo=algo, max_evals=2000, pass_expr_memo_ctrl=None)except Exception as e: print('此异常影响不大,预测结果已写入文件!') print(e)size3 = pd.read_csv('result_size3.csv')sub['size3'] = size3# 因为每回训练参数会总动调整,所以size3会有些许变化,但总体变化不大sub.to_csv('lgb_1111_75_94_104.csv', index=False)

初赛、决赛数据代码、说明文件和调机报告已上传到我的下载:

附赠初赛排名第五,决赛排名第六的模型:

附赠Datawhale阿水、鱼佬的学习目录:

参考学习链接:

转载地址:https://data-mining.blog.csdn.net/article/details/109727974 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:大数据时代的Serverless工作负载预测-排名80_0.313
下一篇:资金流入流出预测-挑战Baseline-排名445 /122.17

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年04月16日 03时55分57秒