津南数字制造挑战赛之原料企业工艺优化

1.背景

天津市津南区坚持以绿色经济驱动传统经济向数字化经济转型以实现津南高质量发展,正依托物联网、云计算、三网融合等新一代信息技术,加快全区智能工业全面发展,推动产业转型升级,培育新兴产业,实现“津南制造”向“津南智造”转变。天津津南希望广泛吸纳英才,助力天津当地企业数字化转型实践,提升当地企业在智能制造领域影响力。异烟酸用作医药中间体,主要用于制抗结核病药物异烟肼,也用于合成酰胺、酰肼、酯类等衍生物。烟酰胺生产过程包含水解脱色、结晶甩滤等过程。每个步骤会受到温度、时间、压强等各方面因素的影响,造成异烟酸收率的不稳定。为保证产品质量和提高生产效率,需要调整和优化生产过程中的参数。然而,根据传统经验的人工调整工艺参数费时费力。以异烟酸生产过程中的各参数,设计精确智能的优秀算法,提升异烟酸的收率,助力企业实现转型升级,提升行业竞争力。

2.数据初探

训练数据包含有2000批次来自实际异烟酸生产中的各参数的监测指标和最终收率的数据。监测指标由两大工序数十个步骤构成。总生产步骤达30余项。我们将工序和步骤分别用字母和数字代号表示,比如A2,B5分别表示A工序第二步骤和B工序第五步骤。

查看训练数据基本信息:

Index(['样本id', 'A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7', 'A8', 'A9', 'A10', 'A11', 'A12', 'A13', 'A14', 'A15', 'A16', 'A17', 'A18', 'A19', 'A20', 'A21', 'A22', 'A23', 'A24', 'A25', 'A26', 'A27', 'A28', 'B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7', 'B8', 'B9', 'B10', 'B11', 'B12', 'B13', 'B14', '收率'],dtype='object')

抛开应用背景和工艺过程的数据分析都是耍流氓,有人结合专利文献整理的字段意义:(数据方很不厚道,隐藏和缺失了很多数据)

fig1.原料生产过程

放下这个图,暂且不表,我们先看一下样本目标的分布情况。

fig2.收率分布图

从收率分布图中,可以看出收率大多集中在0.85-1之间,收率小于0.85的样本可以认为是噪声点,将这些样本去除。

现在我们查看去除噪声样本之后的,数据缺失,unique,和最大类情况。

fig3.特征按缺失比例排列


fig4.特征按最大类别比例排序

结合,fig3和fig4,我们发现A2、A7、A8、B10、B11缺失值较多,而A18、B3、A13、A23、B13最大类别占比大于99%。训练样本总样本数目1396。由于A2缺失较多,且单一,我们drop掉该特征。而由于A18、B3、A13、A23、B13样本大多集中在同一类型,且在测试数据中值单一,我们选择将这些属性drop。另外,最大类比例高的A1、B2、A3、A4,缺失值较多的A7、A8、B10、B11等特征,A7、A8、B10、B11结合原料工艺参数说明,A7、A8是中间测温,猜测可能是在等待反应条件,而且缺失值较多,我选择将这些特征drop;B9、B10、B11,似乎属于同一过程,且B10、B11缺失值过多,我选择将这3个过程合并;A2数值单一,drop。

3.特征工程

剩下的特征,我们需要将这些特征转变为我们做预测可以使用的特征值。

首先,我们发现特征中有很多时间字段,我们需要对时间进行处理。包含时间的特征,时间点A5、A7、A9、A11、A14、A16、A24、A26、B5、B7,时间间隔A20、A28、B4、B9、B10、B11。

使用正则匹配找出时间格式有误的地方:

if not re.match('\d{1,2}:\d{1,2}:\d{1,2}', value):

if not re.match('\d{1,2}:\d{1,2}-\d{1,2}:\d{1,2}', value):

fig5.时间格式有误的标签以及对应行数

时间格式出错:

fig6.时间格式错误
fig7.时间间隔错误部分数据

我们需要对这部分错误数据进行处理。

处理完这部分错误信息,我们需要对时间进行特殊编码。对于时间点数据,我们将其转换为与上一时间点的时间差,对于时间间隔,我们将计算其开始时间与上一时间点时间差,以及该时间间隔,单位秒。

进行one-hot编码:

data = pd.concat([train, test],axis=0,ignore_index=True,sort=False)

df = search_wrong_time(data, ['A5','A9','A11','A14','A16','A24','A26','B5','B7'],1)

df = search_wrong_time(df, ['A20','A28','B4','B9','B10','B11'],2)

data = pre_processing(df)

save_data('train_post_pre.data', data)

data.to_csv('train_post_pre.csv',index=False,sep=',')

categorical_columns = [ffor fin data.columnsif fnot in ['样本id','收率']]

err_index = data[data['A25'] =='1900/3/10 0:00'].index

data = data.drop(axis=1,index=err_index)

for fin categorical_columns:

data[f] = data[f].map(dict(zip(data[f].unique(),range(0, data[f].nunique()))))

test_len = data.shape[0] - test.shape[0]

train = data[:test_len]

test = data[test_len:]

X_train = train[categorical_columns].values

X_test = test[categorical_columns].values

enc = OneHotEncoder()

for fin categorical_columns:

enc.fit(data[f].values.reshape(-1,1))

X_train = sparse.hstack((X_train, enc.transform(train[f].values.reshape(-1,1))),'csr')

X_test = sparse.hstack((X_test, enc.transform(test[f].values.reshape(-1,1))),'csr')

target = train['收率']

del train['收率']

y_train = target.values

processed_data = {'X_train': X_train,'X_test': X_test,'y_train': y_train}

save_data('processed.data', processed_data)

至此,数据处理完成。processed.data可用于训练模型。

4.预测

我们采用xgboost进行,参数模型调试和预测:

在这里我们采用10折检验法:

xgb_params = {'eta':0.005,'max_depth':10,'subsample':0.8,'colsample_bytree':0.8,

'objective':'reg:linear','eval_metric':'rmse','silent':True,'nthread':4}

folds = KFold(n_splits=10,shuffle=True,random_state=2018)

oof_xgb = np.zeros(X_train.shape[0])

predictions_xgb = np.zeros(X_test.shape[0])

for fold_, (trn_idx, val_idx)in enumerate(folds.split(X_train, y_train)):

print("fold n°{}".format(fold_ +1))

trn_data = xgb.DMatrix(X_train[trn_idx], y_train[trn_idx])

val_data = xgb.DMatrix(X_train[val_idx], y_train[val_idx])

watchlist = [(trn_data,'train'), (val_data,'valid_data')]

clf = xgb.train(dtrain=trn_data,num_boost_round=20000,evals=watchlist,early_stopping_rounds=200,

verbose_eval=100,params=xgb_params)

oof_xgb[val_idx] = clf.predict(xgb.DMatrix(X_train[val_idx]),ntree_limit=clf.best_ntree_limit)

predictions_xgb += clf.predict(xgb.DMatrix(X_test),ntree_limit=clf.best_ntree_limit) / folds.n_splits

print("CV score: {:<8.8f}".format(mean_squared_error(oof_xgb, y_train)))

最后计算msr大约为:0.00020651。

5.总结:

特征工程的处理直接影响最后的预测结果,如何对数据进行处理也见仁见智,上面对时间的处理仅是个人意见,想要得到好的结果必须对数据有足够多的了解,这样才能在数据处理时,保存最多的信息。另外,这一数据存在较多错误,需要足够多的耐心进行处理。

未完,优化之路漫漫,请期待续集。。。。。。。

你可能感兴趣的:(津南数字制造挑战赛之原料企业工艺优化)