基于机器学习的钢材缺陷类型检测
本文的数据集是来自uci,专门为机器学习提供数据的一个网站:https://archive.ics.uci.edu/ml/datasets/Steel+Plates+Faults
该数据集包含了7种带钢缺陷类型(钢板故障的7种类型:装饰、Z_划痕、K_划痕、污渍、肮脏、颠簸、其他故障),带钢缺陷的27种特征数据。
本文的主要知识点:
数据预处理
导入数据
In [1]:
1 | import pandas as pd |
In [2]:
1 | df = pd.read_excel("faults.xlsx") |
Out[2]:
数据分割
将7种不同的类型和前面的特征字段分开:
1 | df1 = df.loc[:,"Pastry":] # 7种不同的类型 |
下面是27个特征的数据:
分类标签生成
将7种不同的标签进行分类生成:
类型编码
In [7]:
1 | dic = {} |
Out[7]:
1 | {'Pastry': 0, |
In [8]:
1 | df1["Label"] = df1["Label"].map(dic) |
Out[8]:
数据合并
In [9]:
1 | df2["Label"] = df1["Label"] |
EDA
数据的基本统计信息
In [10]:
1 |
|
结果显示是没有缺失值的:
单个特征分布
1 | parameters = df2.columns[:-1].tolist() |
从箱型图中能够观察到单个特征的取值分布情况。下面绘制全部参数的取值分布箱型图:
1 | # 两个基本参数:设置行、列 |
几点结论:
- 特征之间的取值范围不同:从负数到10M
- 部分特征的取值中存在异常值
- 有些特征的取值只存在0和1
样本不均衡
每种类别数量
In [15]:
1 | # 每种类型的数量 |
Out[15]:
1 | 6 673 |
可以看到第6类的样本有673条,但是第4类的样本只有55条。明显地不均衡
SMOTE解决
In [16]:
1 | X = df2.drop("Label",axis=1) |
In [17]:
1 | # 使用imlbearn库中上采样方法中的SMOTE接口 |
统计一下每个类别的数量:
数据归一化
特征矩阵归一化
In [19]:
1 | from sklearn.preprocessing import StandardScaler |
归一化后的特征矩阵
In [21]:
1 | df3 = pd.DataFrame(data_ss, columns=X_smo.columns) |
Out[21]:
添加y_smo
In [22]:
1 | df3["Label"] = y_smo |
建模
随机打乱数据
In [23]:
1 | from sklearn.utils import shuffle |
数据集划分
In [24]:
1 | X = df3.drop("Label",axis=1) |
In [25]:
1 | from sklearn.model_selection import train_test_split |
建模与评价
用函数的形式来解决:
In [26]:
1 | from sklearn.model_selection import cross_val_score # 交叉验证得分 |
1 | # 逻辑回归(分类) |
下面是单独建立每个模型:
逻辑回归
建模
In [28]:
1 | from sklearn.linear_model import LogisticRegression # 逻辑回归(分类) |
Out[28]:
1 | LogisticRegression() |
预测
In [29]:
1 | # 预测概率 |
Out[29]:
1 | array([[4.83469692e-01, 4.23685363e-07, 1.08028560e-10, 3.19294899e-07, |
In [30]:
1 | # 找出概率值最大的所在索引,作为预测的分类结果 |
Out[30]:
1 | array([0, 3, 1]) |
评价
In [31]:
1 | # 混淆矩阵 |
Out[31]:
1 | array([[114, 6, 0, 0, 7, 11, 10], |
In [32]:
1 | y_pred.shape |
Out[32]:
1 | (943,) |
In [33]:
1 | y_test = np.array(y_test).reshape(943) |
In [34]:
1 | print("召回率: ",metrics.recall_score(y_test, y_pred, average="macro")) |
随机森林回归
SVR
决策树回归
神经网络
GBDT
1 | from sklearn.ensemble import GradientBoostingClassifier |
LightGBM
结果
模型 | Recall | Precision |
---|---|---|
逻辑回归 | 0.82473 | 0.8126 |
随机森林回归 | 0.9176 | 0.9149 |
SVR | 0.8897 | 0.8856 |
决策树回归 | 0.8698 | 0.8646 |
神经网络 | 0.8908 | 0.8863 |
GBDT | 0.9034 | 0.9 |
LightGBM | 0.9363 | 0.9331 |
上述结果很明显:
- 集成学习的方案LightGBM、GBDT、随机森林 的效果是高于其他的模型
- LightGBM 模型效果最佳!