项目实战——工业离散器件符合率的预测

机器学习 同时被 2 个专栏收录
14 篇文章 0 订阅
13 篇文章 0 订阅

数据背景介绍

数据来源于DataFuntain中的离散制造过程中典形工件的质量符合率预测, 以某典型工件生产过程为例,我们将提供给参赛者一系列工艺参数,以及在相应工艺参数下所生产工件的质量数据。

数据下载地址:[数据下载地址](链接:https://pan.baidu.com/s/1D95UoZYvc97LN-IEg9MBUg
提取码:uogb)(如若失效了,请可以自行官网下载或者联系我!)

  • 训练数据:

    A:工艺参数(如设备加工参数)

    B:工件的质量数据

    C:工件所符合的质检指标

  • 测试数据:

    A:工艺参数(如设备加工参数)

特征工程

数据探索性分析(EDA)

数据读取和查看

在这里插入图片描述

直观可见,数据集大小是5行21列。

数据离散性和连续性分析
# 获取列名
col_name = train_data.drop(['Quality_label'],1).columns
Notdlts_count = []
for i in col_name:
    # 计算非重复值的个数
    Notdlts = len(train_data[i].drop_duplicates())/6000
    Notdlts_count.append(Notdlts)


plt.plot(col_name, Notdlts_count, c='r')
plt.title('非重复值的总数计算')                 # 标题
plt.xlabel('列名')                        # x轴 的轴名
plt.ylabel('非重复数据在全数据上的占比')  # y轴 的轴名
plt.xticks(rotation=45)                   # 旋转 x轴的刻度名
plt.show()

在这里插入图片描述

数据是离散型还是连续性特征对后续特征的选取以及模型的选择都起着很重要的作用
由图可知,Parameter 5 - 10 基本为离散特征,而 Attribute4 - 10,有可能是 离散特征, 其余均为连续特征。

除此之外,还需要查看数据集的离散程度——标准差

# 获取列名
col_name = unit.columns

# 计算 标准差(std)
col_std = unit.describe().T['std']
    
plt.plot(col_name, col_std, c='red')  # 作图
plt.title('列 - 标准差')     # 标题
plt.xlabel('列名')           # x轴 的轴名
plt.ylabel('标准差')         # y轴 的轴名
plt.xticks(rotation=90)      # 旋转 x轴的刻度名
plt.savefig('离散程度.jpg')
plt.show()

在这里插入图片描述

由图可知:列 Attribute10 标准差太高,这会导致无法明显分辨其他列的标准差,后面需要对此处理。

数据均衡性分析
# 遍历列名
for i in col_name:
    plt.hist(unit[i], bins=20)
    plt.title('%s 平均分割取值范围计数统计图'%i)
    plt.xlabel('%s范围'%i)
    plt.ylabel('值在该范围的个数')
    plt.savefig('%s 处理之前.jpg'%i)
    plt.show()

在这里插入图片描述

以上可以查看Attibute1特征(其他特征也类似,由于图标空间限制,目前只显示其中一个例子)的分布情况,可以看出很多特征列的数据都集中在某些[0,10000]之间波动,数据表现为不均衡,正常的数据集表现应该类似高斯分布的状态,这也是需要处理——去偏

特征处理

特征处理是机器学习或者深度学习训练过程的最重要的环节,数据处理得很好,模型的学习能力就一定不会太差。

标签处理

采用编码化的方式对离散型的标签进行处理。

lb = LabelEncoder()
train_data["Quality_label"] = lb.fit_transform(train_data["Quality_label"])
数据均衡性问题的解决——去偏

对于数值型连续的数据表现为不均衡时,采用去偏的方法是比较好的方案。常见的去偏手段有:

  • 开方:通过开N方(取2,3,4都可以,不建议过大,这里以4为例) 的方式,将0-1的值增大,并缩小大于1的值
  • 取对数
unit[col_name] = unit[col_name]**(1/4)
# 遍历列名
for i in col_name:
    plt.hist(unit[i], bins=20)
    plt.title('%s 平均分割取值范围计数统计图'%i)
    plt.xlabel('%s范围'%i)
    plt.ylabel('值在该范围的个数')
    plt.savefig('%s 去偏结果.jpg'%i)
    plt.show()

在这里插入图片描述

通过处理之前和处理之后的数据分布图比较,发现处理之后的数据呈现比较有规律的高斯分布,这种情形是比较好的。

去除数据的标准差——log变换

上面分析可见,数据的标准差的波动性特别大,此时也需要处理,采用的方法也可以是开方或者取对数。

# 此处选择 开4次方 (一般在2-10之间)
plt.plot(col_name, col_std**(1/6), c='g')  # 作图
plt.plot(col_name, 10*np.ones((1,20))[0], c='m', linestyle="--")
plt.title('列 - 标准差')     # 标题
plt.xlabel('列名')           # x轴 的轴名
plt.ylabel('标准差')         # y轴 的轴名
plt.xticks(rotation=90)      # 旋转 x轴的刻度名
plt.legend(['标准差','等高线:10'])
plt.show()

在这里插入图片描述

通过观察可以看出 绝大多数列 的 标准差已经突破 1e4 ( 10,000 ).
解决方法:因为全部的特征取值范围都要 大于 0, 所以可以通过log变换, 但为了不影响接近于0的小数 故因为 当 x --> 0时, 有ln(x+1) --> x 所以:

# np.log() 默认底数为 e
unit[col_name] = np.log(unit[col_name] + 1)
# 计算变换后的 标准差(std)
col_log_std = unit[col_name].describe().T['std']
    
plt.plot(col_name, col_log_std, c='red')  # 作图
plt.title('列 - 标准差')     # 标题
plt.xlabel('列名')           # x轴 的轴名
plt.ylabel('标准差')         # y轴 的轴名
plt.xticks(rotation=90)      # 旋转 x轴的刻度名
plt.show()

在这里插入图片描述

从图中可以明显看出 数据的标准差已经稳定在 [0, 1]这个范围内.

特征归一化处理

特征归一化常见的方式有很多,比如最小最大化标准化Z-Score标准化L2正则化等等,这里就采用最小最大化处理的方式。
在这里插入图片描述

特征选择

在机器学习模型或者深度学习模型环节中也起着至关重要的作用,如果特征选的太少,就会导致数据集过拟合,如果全部选择,那么可能会导致数据中存在噪音数据,对模型的学习能力也并不是特别好。
这里通过卡方检验的标准选择了最后14个特征——

# 设置卡方检验,选择k=2个最佳特征
test = SelectKBest(score_func=chi2, k=14) ##选择成最后的十四个特征
# 进行检验
fit = test.fit(unit, train_data['Quality_label'])  
# 打印卡方检验值
print(fit.scores_)  

模型选择和优化

对于当前数据分析可知,该背景属于分类任务,那么我们需要考虑选择一些分类模型。

SVM算法

SVM模型是常见的分类模型,对于数据量不是特别大的情形下,该模型训练不容易数据过拟合,另外泛化能力也挺好的,可以先作为选择试试看——

from sklearn.svm import SVC#导入算法
from sklearn.model_selection import GridSearchCV#算法调参工具
model = SVC()#实例化算法
model.fit(X_train,y_train)
model.score(X_test,y_test)##模型的评分

模型训练完成后,准确率只有64.4%,这对于当前的结果并不是特别满意。

神经网络模型

为了提供对比,神经网络也是进行分类——

from sklearn.neural_network import MLPClassifier
from sklearn.metrics import accuracy_score
model5 = MLPClassifier(alpha=1e-3,hidden_layer_sizes=(500,200), random_state=1) 
model5.fit(X_train,y_train)

y_predict=model5.predict(X_test)
accuracy_score(y_test, y_predict)

最后准确率达到了89.4%,相比较于SVM而言,准确率确实提高了不少。

集成模型

集成模型有很多,比如随机森林RF、GBDT、Boosting、LightGBM模型,在这里选择GBDT模型进行训练看看结果——

GBDT模型

DT-Decision Tree决策树,GB是Gradient Boosting,是一种学习策略,GBDT的含义就是用Gradient Boosting的策略训练出来的DT模型。它在被提出之初就和SVM一起被认为是泛化能力(generalization)较强的算法,近些年更因为被用于搜索排序的机器学习模型而引起大家关注。

1. GBDT优点

  • 可以灵活处理各种类型的数据,包括连续值和离散值。
  • 在相对较少的调参时间情况下,预测的准确率也比较高,相对SVM而言。
  • 在使用一些健壮的损失函数,对异常值得鲁棒性非常强。比如Huber损失函数和Quantile损失函数

2. GBDT缺点

  • 由于弱学习器之间存在较强依赖关系,难以并行训练。可以通过自采样的SGBT来达到部分并行。
from sklearn.ensemble import GradientBoostingClassifier#导入梯度提升分类器(提升回归树)
model1 = GradientBoostingClassifier()#实例化算法
model2 = GridSearchCV(model1,param_grid={"learning_rate":[0.1,0.01,0.001],"n_estimators":[10,100,1000]},verbose=2)
model2.fit(X_train,y_train)

model2.best_params_ ##找到最好的参数
# {'learning_rate': 0.1, 'n_estimators': 1000}

model2.score(X_test,y_test)#输出准确率

最后的准确率达到了99.5%的成绩,这相对于SVM模型和神经网络模型来看,该模型的准确率提高了很多。
另外为了提供对比,还选择了其他的集成模型——

LightGBM模型
from lightgbm import LGBMClassifier
model3 = LGBMClassifier(verbose=2)
model3.fit(X_train,y_train,eval_set=[(X_test,y_test)])##算法训练(加上交叉验证集)
model3.score(X_test,y_test)#模型评分

准确率输出是98.9%,相对比而言,准确率也不是很低。

CatBoost模型

详细介绍

from catboost import CatBoostClassifier
model4 = CatBoostClassifier()#算法实例化
model4.fit(X_train,y_train,eval_set=[(X_test,y_test)])##模型的训练

最后输出,准确率只有40%左右,相对于而言,该模型不太适合该背景的数据集。

项目小结

  1. 通过模型的选择过程,必须要结合实际的数据集特点进行选择,因此,在此过程中特征工程是必须要做到细致;
  2. 模型的优化,实际上除了fine-tunning外,还需要对各种模型以及集成模型的特点以及使用场景特别了解,这样在选择的时候才有根据地进行选择;
  3. 连续性地数值型的数据集不均衡问题,常见的手段是去偏,另外有的时候可能还需要进行去噪去峰操作,这具体的如何去峰、去噪就需要根据实际的场景做实际的处理。
  4. 另外存在多个模型的对比时,为了选择更好的模型,模型的评估不仅仅是准确率,在这里还需要使用ROC曲线、F2、召回率和精确率等指标对比进行选举,甚至还需要对多个模型做统计显著性检验分析,具体操作可参考如何科学地对深度学习模型进行评估
  • 4
    点赞
  • 15
    评论
  • 3
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值