硬核干货!基于机器学习分类算法的钢材缺陷检测分类,一文掌握
lipiwang 2024-10-28 17:25 8 浏览 0 评论
今天给大家带来一篇机器学习在工业数据的实战文章:基于机器学习分类算法的钢材缺陷检测分类
本文的数据集是来自uci,专门为机器学习提供数据的一个网站。
该数据集包含了7种带钢缺陷类型(钢板故障的7种类型:装饰、Z_划痕、K_划痕、污渍、肮脏、颠簸、其他故障),带钢缺陷的27种特征数据
本文的主要知识点:
数据信息
具体查看官网:
数据预处理
导入数据
In [1]:
import pandas as pd
import numpy as np
import plotly_express as px
import plotly.graph_objects as go
# 子图
from plotly.subplots import make_subplots
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_theme(style="whitegrid")
%matplotlib inline
# 忽略警告
import warnings
warnings.filterwarnings('ignore')
In [2]:
df = pd.read_excel("faults.xlsx")
df.head()
Out[2]:
数据分割
将7种不同的类型和前面的特征字段分开:
df1 = df.loc[:,"Pastry":] # 7种不同的类型
df2 = df.loc[:,:"SigmoidOfAreas"] # 全部是特征字段
# 分类数据
df1.head()
下面是27个特征的数据:
分类标签生成
将7种不同的标签进行分类生成:
类型编码
In [7]:
dic = {}
for i, v in enumerate(columns):
dic[v]=i # 类别从0开始
dic
Out[7]:
{'Pastry': 0,
'Z_Scratch': 1,
'K_Scatch': 2,
'Stains': 3,
'Dirtiness': 4,
'Bumps': 5,
'Other_Faults': 6}
In [8]:
df1["Label"] = df1["Label"].map(dic)
df1.head()
Out[8]:
数据合并
In [9]:
df2["Label"] = df1["Label"]
df2.head()
EDA
数据的基本统计信息
In [10]:
# 缺失值
df2.isnull().sum()
结果显示是没有缺失值的:
单个特征分布
parameters = df2.columns[:-1].tolist()
sns.boxplot(data=df2, y="Steel_Plate_Thickness")
plt.show()
从箱型图中能够观察到单个特征的取值分布情况。下面绘制全部参数的取值分布箱型图:
# 两个基本参数:设置行、列
fig = make_subplots(rows=7, cols=4) # 1行2列
# fig = go.Figure()
# 添加两个数据轨迹,形成图形
for i, v in enumerate(parameters):
r = i // 4 + 1
c = (i+1) % 4
if c ==0:
fig.add_trace(go.Box(y=df2[v].tolist(),name=v),
row=r, col=4)
else:
fig.add_trace(go.Box(y=df2[v].tolist(),name=v),
row=r, col=c)
fig.update_layout(width=1000, height=900)
fig.show()
几点结论:
- 特征之间的取值范围不同:从负数到10M
- 部分特征的取值中存在异常值
- 有些特征的取值只存在0和1
样本不均衡
每种类别数量
In [15]:
# 每种类型的数量
df2["Label"].value_counts()
Out[15]:
6 673
5 402
2 391
1 190
0 158
3 72
4 55
Name: Label, dtype: int64
可以看到第6类的样本有673条,但是第4类的样本只有55条。明显地不均衡
SMOTE解决
In [16]:
X = df2.drop("Label",axis=1)
y = df2[["Label"]]
In [17]:
# 使用imlbearn库中上采样方法中的SMOTE接口
from imblearn.over_sampling import SMOTE
# 设置随机数种子
smo = SMOTE(random_state=42)
X_smo, y_smo = smo.fit_resample(X, y)
y_smo
统计一下每个类别的数量:
数据归一化
特征矩阵归一化
In [19]:
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import MinMaxScaler
ss = StandardScaler()
data_ss = ss.fit_transform(X_smo)
# 还原到原数据
# origin_data = ss.inverse_transform(data_ss)
归一化后的特征矩阵
In [21]:
df3 = pd.DataFrame(data_ss, columns=X_smo.columns)
df3.head()
Out[21]:
添加y_smo
In [22]:
df3["Label"] = y_smo
df3.head()
建模
随机打乱数据
In [23]:
from sklearn.utils import shuffle
df3 = shuffle(df3)
In [25]:
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X,
y,
test_size=0.2,
random_state=4)
建模与评价
用函数的形式来解决:
In [26]:
from sklearn.model_selection import cross_val_score # 交叉验证得分
from sklearn import metrics # 模型评价
def build_model(model, X_test, y_test):
model.fit(X_train, y_train)
# 预测概率
y_proba = model_LR.predict_proba(X_test)
# 找出概率值最大的所在索引,作为预测的分类结果
y_pred = np.argmax(y_proba,axis=1)
y_test = np.array(y_test).reshape(943)
print(f"{model}模型得分:")
print("召回率: ",metrics.recall_score(y_test, y_pred, average="macro"))
print("精准率: ",metrics.precision_score(y_test, y_pred, average="macro"))
# 逻辑回归(分类)
from sklearn.linear_model import LogisticRegression
# 建立模型
model_LR = LogisticRegression()
# 调用函数
build_model(model_LR, X_test, y_test)
LogisticRegression()模型得分:
召回率: 0.8247385525937151
精准率: 0.8126617210922679
下面是单独建立每个模型:
逻辑回归
建模
In [28]:
from sklearn.linear_model import LogisticRegression # 逻辑回归(分类)
from sklearn.model_selection import cross_val_score # 交叉验证得分
from sklearn import metrics # 模型评价
# 建立模型
model_LR = LogisticRegression()
model_LR.fit(X_train, y_train)
Out[28]:
LogisticRegression()
预测
In [29]:
# 预测概率
y_proba = model_LR.predict_proba(X_test)
y_proba[:3]
Out[29]:
array([[4.83469692e-01, 4.23685363e-07, 1.08028560e-10, 3.19294899e-07,
8.92035714e-02, 1.33695855e-02, 4.13956408e-01],
[3.49120137e-03, 6.25018002e-03, 9.36037717e-03, 3.64702993e-01,
1.96814910e-01, 1.35722642e-01, 2.83657697e-01],
[1.82751269e-05, 5.55981861e-01, 3.16768568e-05, 4.90023258e-03,
2.84504970e-03, 3.67190965e-01, 6.90319398e-02]])
In [30]:
# 找出概率值最大的所在索引,作为预测的分类结果
y_pred = np.argmax(y_proba,axis=1)
y_pred[:3]
Out[30]:
array([0, 3, 1])
评价
In [31]:
# 混淆矩阵
confusion_matrix = metrics.confusion_matrix(y_test, y_pred)
confusion_matrix
Out[31]:
array([[114, 6, 0, 0, 7, 11, 10],
[ 0, 114, 1, 0, 2, 4, 4],
[ 0, 1, 130, 0, 0, 0, 2],
[ 0, 0, 0, 140, 0, 1, 0],
[ 1, 0, 0, 0, 120, 3, 6],
[ 13, 3, 2, 0, 3, 84, 11],
[ 21, 13, 9, 2, 9, 25, 71]])
In [32]:
y_pred.shape
Out[32]:
(943,)
In [33]:
y_test = np.array(y_test).reshape(943)
In [34]:
print("召回率: ",metrics.recall_score(y_test, y_pred, average="macro"))
print("精准率: ",metrics.precision_score(y_test, y_pred, average="macro"))
召回率: 0.8247385525937151
精准率: 0.8126617210922679
随机森林回归
SVR
决策树回归
神经网络
GBDT
from sklearn.ensemble import GradientBoostingClassifier
gbdt = GradientBoostingClassifier(
# loss='deviance',
# learning_rate=1,
# n_estimators=5,
# subsample=1,
# min_samples_split=2,
# min_samples_leaf=1,
# max_depth=2,
# init=None,
# random_state=None,
# max_features=None,
# verbose=0,
# max_leaf_nodes=None,
# warm_start=False
)
gbdt.fit(X_train, y_train)
# 预测概率
y_proba = gbdt.predict_proba(X_test)
# 最大概率的索引
y_pred = np.argmax(y_proba,axis=1)
print("召回率: ",metrics.recall_score(y_test, y_pred, average="macro"))
print("精准率: ",metrics.precision_score(y_test, y_pred, average="macro"))
召回率: 0.9034547294196564
精准率: 0.9000750791353891
LightGBM
结果
上述结果很明显:
- 集成学习的方案LightGBM、GBDT、随机森林 的效果是高于其他的模型
- LightGBM 模型效果最佳!
作者:皮大大
链接:
https://juejin.cn/post/7086089779036717069
来源:稀土掘金
相关推荐
- 想减少Windows 11内存占用?请取消固定Teams
-
如果你想要提高Windows11系统的运行速度,那么可以禁用某些默认启用的功能和设置。如果你的Windows11是安装在已经停止支持的设备或者内存容量不高的旧设备,那么应该立即限制或禁用固...
- Windows查看端口占用、查看PID对应的进程、并终止进程
-
Windows下:查看端口占用netstat-ano|findstr"端口号"获取到pid查看PID对应的进程tasklist|findstr"进程ID"...
- 计算机组成原理(36): 分时之一——进程
-
建立一个虚拟机VM目标:给每个程序一个自己的虚拟机“VirtualMachine”,程序并不知道其他的虚拟机。1.1进程(Process)为了捕获正在运行的程序,我们创建一个称为“进程(Proce...
- window系统如何停止端口被占用的进程(高手版)
-
如上图1,作为开发人员是不是经常遇到这个问题?(Webserverfailedtostart.Port9527wasalreadyinuse.)当然,如果在你知道确实有某个进程正占...
- 电脑的文件无法删除咋回事?你需要这款神兵利器
-
很多朋友用电脑的时候,都遇到过文件无法删除的情况。这往往是由于文件被某个软件、进程所调用所引发的——在Windows中,某个文件如果被使用,这个文件可能就没法进行删除、重命名之类的操作了。想要进一步操...
- Windows日志分析(windows 日志文件)
-
1.Windows日志文件简介1.1Windows日志核心分类1.系统日志系统日志包含由Windows系统组件记录的事件,记录系统进程和设备驱动程序的活动。由它审核的系统事件包括启动失败的设备驱动程...
- 电脑软件崩溃、闪退不用慌!DJS Tech 教你几招轻松解决
-
当你正全神贯注用电脑处理重要文件、沉浸在精彩的游戏世界,或是观看喜欢的视频时,软件突然崩溃、闪退,那一刻的烦躁简直难以言喻。别着急,DJSTech作为深耕计算机领域多年的专业团队,为你带来一系列超...
- 微软Win11推进淘汰控制面板,时间服务器配置迁移至设置应用
-
IT之家5月29日消息,科技媒体Winaero昨日(5月28日)发布博文,报道称微软在Windows11系统中,继续推进“淘汰控制面板”进程,配置时间服务器地址选项迁移到设置应...
- 微软 PowerToys更新,可帮你找出 Win11上哪些进程正在占用该文件
-
IT之家11月3日消息,微软针对Windows11和Windows10的PowerToys已经更新到了最新的0.64.0版本,并上线了一个名为“文件锁匠FileLock...
- Windows基础操作 认识任务管理器(windows任务管理器的使用)
-
Windows基础操作:认识任务管理器任务管理器(TaskManager)是Windows系统中一个功能强大的实用工具,它为用户提供了实时监控系统资源、管理正在运行的程序和服务的能力。掌握任务管理器...
- windows——netstat过滤(终止进程)
-
windows——netstat过滤(终止进程)在Windows操作系统中,使用netstat命令可以查看网络连接的状态。要过滤特定协议或端口的连接,可以使用以下命令:查看所有连接:netstat-...
- 只要这么做 Windows Defender与第三方就能和平共存啦
-
无论大家是否喜欢WindowsDefender,伴随着Windows10的不断升级,它已经成为系统的底层必备组件之一。虽然我们有各种各样的方法去关闭它,换用顺手的第三方,但只要更新打补丁,噩梦就来...
- Win10如何彻底关闭wsappx进程(win10 wsappx怎么关闭)
-
win10如何彻底关闭wsappx进程?wsappx进程是什么?wsappx进程是Windows10系统的一部分,这个进程是WindowsStore和微软通用应用程序平台(UWP)的依赖进程。...
- Windows环境黑客入侵应急与排查(黑客入侵电脑原理)
-
1文件分析1.1临时目录排查黑客往往可能将病毒放在临时目录(tmp/temp),或者将病毒相关文件释放到临时目录,因此需要检查临时目录是否存在异常文件。假设系统盘在C盘,则通常情况下的临时目录如下...
- Windows 11 24H2 KB5044384出现大面积安装失败、任务管理器0进程等问题
-
Windows11KB5044384更新由于出现大量错误而无法在Windows1124H2上安装、其中包括一个奇怪的错误,即由于0x800f0922、0x800736b3和0x8...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- maven镜像 (69)
- undefined reference to (60)
- zip格式 (63)
- oracle over (62)
- date_format函数用法 (67)
- 在线代理服务器 (60)
- shell 字符串比较 (74)
- x509证书 (61)
- localhost (65)
- java.awt.headless (66)
- syn_sent (64)
- settings.xml (59)
- 弹出窗口 (56)
- applicationcontextaware (72)
- my.cnf (73)
- httpsession (62)
- pkcs7 (62)
- session cookie (63)
- java 生成uuid (58)
- could not initialize class (58)
- beanpropertyrowmapper (58)
- word空格下划线不显示 (73)
- jar文件 (60)
- jsp内置对象 (58)
- makefile编写规则 (58)