应保密要求,本文所有数据已处理
1. 问题描述
自变量:最优精馏结构的影响因素为进料组成A,B,C,相对挥发度之比ESI,以及分离要求GESI,其中A+B+C=1,故5个自变量自由度为4。
因变量:三组元(相对挥发度由轻到重A,B,C)精馏结构有7种,最优精馏结构代表7种结构中年度总费用最低的结构。
使用传统的化工模拟软件求取不同自变量A,B,C,ESI,GESI下的最优精馏结构,得到200条数据,本文利用决策树算法得到一种根据自变量求解三组元最优精馏结构的方法。
2.数据探索
导入数据后查看结果
df.head()
df.describe()
A,B,C是0-1之间的数字,GESI是0.74-1.74范围内的数,ESI较为集中,为1.02-1.19间的数。mark代表最优精馏结构,可以看出七种精馏结构中最优结构只出现了四种。
3.数据处理
由于原数据已经在excel中处理好,没有缺失值,只需要标准化即可。事实上决策树对数据标准化与否并不敏感,标准化是为了后续与其他分类算法如朴素贝叶斯,SVM,KNN做对比。朴素贝叶斯要求自变量不能小于0,故使用min-max标准化。
自变量选择,关于ABC三选二的问题,先把ABC都选进自变量中,决策树跑出结果后发现B对因变量的影响最小,所以使用AC作为自变量。
features=df[['a','c','gesi','esi']]
targets=df['mark']
train_x,test_x,train_y,test_y=train_test_split(features,targets,test_size=0.33,random_state=1)
mm=preprocessing.MinMaxScaler()
train_mm_x=mm.fit_transform(train_x)
test_mm_x=mm.transform(test_x)
4.决策树建模
直接使用python自带库sklearn中封装好的算法,方便快捷。
#决策树采用信息增益划分结果
clf = DecisionTreeClassifier(criterion='entropy')
clf=clf.fit(train_mm_x,train_y)
test_predict_en=clf.predict(test_mm_x)
score_en=accuracy_score(test_y,test_predict_en)
print('决策树采用信息增益率划分准确率为%.4f'%score_en)
模型中可调参数criterion,entropy代表采用信息增益率划分节点,gini代表基尼系数划分,实际操作结果为信息增益率划分的准确率更高。
模型还可进一步优化,对决策树最大深度优化,得到最大深度为4时,决策树对训练集数据划分准确率最高,准确率达到0.8696。此步骤相当于决策树剪枝。
clfo=GridSearchCV(estimator=clf,param_grid={'max_depth':range(1,20)})
clfo=clfo.fit(train_mm_x,train_y)
clfo.best_params_
最后,将生成的决策树可视化。
dot_data = tree.export_graphviz(clf,out_file=None,filled=True,feature_names=train_x.columns,
class_names=['SS','DWC','DB','IF'])
graphviz.Source(dot_data)
故此处通过决策树法得出了三组元最优精馏序列的一般规则(注,此处规则为经过处理的数据规则)
1.A的进料浓度对最优精馏结构的影响最大
2.ESI在C的进料浓度大于0.5时,比GESI对最优精馏结构的影响更大,仍旧需要结合GESI做分类决策
3.GESI在C进料浓度小于0.5时,比ESI对最优精馏结构的影响更大,不需要结合ESI做分类决策
5.与其他机器学习算法对比
采用朴素贝叶斯,SVM支持向量机,KNN三种算法训练原数据并对比准确率
可知
SVM也具有相当不错的模型准确率,朴素贝叶斯的准确率最差。
决策树具有较好的准确率,且易于解释,可生成直观的树形图方便判断,故使用决策树法做三组元最优精馏结构判定 。
附代码
ss=preprocessing.StandardScaler()
train_ss_x=ss.fit_transform(train_x)
test_ss_x=ss.transform(test_x)
#贝叶斯
from sklearn.naive_bayes import MultinomialNB
mnb=MultinomialNB()
mnb=mnb.fit(train_mm_x,train_y)
predict_yb=mnb.predict(test_mm_x)
nb_ac=accuracy_score(test_y,predict_yb)
print('贝叶斯准确率为%.4f'%nb_ac)
#SVM 含惩罚系数优化
from sklearn.svm import SVC
svm=SVC()
svmo = GridSearchCV(estimator=svm, param_grid={'C':range(1,10)})
svmo=svmo.fit(train_ss_x,train_y)
print('SVC最优参数%s'%svmo.best_params_)
svm_ac=svmo.score(test_ss_x,test_y)
print('SVM准确率为%.4f'%svm_ac)
#KNN 含k值优化
from sklearn.neighbors import KNeighborsClassifier
knn=KNeighborsClassifier()
knno=GridSearchCV(estimator=knn,param_grid={'n_neighbors':range(1,20)})
knno=knno.fit(train_ss_x,train_y)
knn_ac=knno.score(test_ss_x,test_y)
print('knn最优参数%s'%knno.best_params_)
print('knn准确率为%.4f'%knn_ac)
results={'method':['knn','clf','nb','svm'],'accuracy':[knn_ac,score_en,nb_ac,svm_ac]}
pd.DataFrame(results)
6.总结
产生一种三组元最优精馏结构选择的决策树算法,该算法简单且解释性强,发现进料浓度ABC以及ESI,GESI对该最优结构决策的影响。对比了其他机器学习算法建模的准确率,认为决策树法具有较好的建模准确率。