【机器学习】机器故障的二元分类模型-Kaggle竞赛

news2024/12/23 1:26:00

竞赛介绍

数据集描述

本次竞赛的数据集(训练和测试)是从根据机器故障预测训练的深度学习模型生成的。特征分布与原始分布接近,但不完全相同。随意使用原始数据集作为本次竞赛的一部分,既可以探索差异,也可以了解在训练中合并原始数据集是否可以提高模型性能。

文件

训练.csv - 训练数据集; 是(二进制)目标(为了与原始数据集的顺序保持一致,它不在最后一列位置)Machine failure
测试.csv - 测试数据集;您的目标是预测概率Machine failure
sample_submission.csv - 正确格式的示例提交文件

竞赛地址

https://www.kaggle.com/competitions/playground-series-s3e17

目录

  • 竞赛介绍
    • 数据集描述
    • 文件
    • 竞赛地址
  • 参赛项目
    • 介绍
    • 二分类相关知识点介绍
      • 二分类
      • 准确度
      • 交叉熵
      • 损失函数
      • 评价指标
    • 项目源码
      • 获取数据
      • 查看行
      • 查看训练数据
      • 查看测试数据
      • 将训练数据的目标值单独拿出
      • 查看训练数据的目标值
      • 将训练集分割为训练集和验证集
      • 查看训练集中非数值数据
      • 将训练集中非数值数据进行onehot编码,数值数据转换为标准差形式
      • 创建模型
      • 编译模型
      • 训练模型
      • 验证模型
      • 对测试数据进行预测

参赛项目

介绍

采用二分类方法进行数据预测,本篇文章主要以入门为主,详细介绍二元分类的使用方法,下一篇文章将详细介绍冠军的代码

二分类相关知识点介绍

二分类

分类为一个常见的机器学习问题之一。你可能想预测客户是否有可能进行购买,信用卡交易是否存在欺诈,宇宙信号是否显示有新行星的证据,或者医学检测有疾病的证据。这些都是二分类问题。

在原始数据中,类可能由“Yes”和“No”或“Dog”和“Cat”等字符串表示。在使用这些数据之前,我们将分配一个类标签:一个类将是0,另一个将是1。指定数字标签将数据置于神经网络可以使用的形式。

准确度

衡量分类问题成功与否的众多指标之一。准确度是正确预测与总预测的比率:准确度=正确数/总数。一个总是正确预测的模型的准确度得分为1.0。在所有其他条件相同的情况下,每当数据集中的类以大约相同的频率出现时,准确度是一个合理的指标。

交叉熵

准确性(以及大多数其他分类指标)的问题在于,它不能用作损失函数。随机梯度下降法(SGD)需要一个平稳变化的损失函数,但精度,作为计数的比率,在“跳跃”中变化。因此,我们必须选择一个替代品作为损失函数。这个替代品是交叉熵函数。

回想一下损失函数定义了训练期间网络的目标。通过回归,我们的目标是最小化预期结果和预测结果之间的距离。我们选择了MAE来测量这个距离。

对于分类,我们想要的是概率之间的距离,这就是交叉熵提供的。交叉熵是一种度量从一个概率分布到另一个概率分布的距离的方法。

损失函数

对于二分类问题,常用的损失函数有:

  • binary_crossentropy:对Sigmoid/Logistic激活得到的概率计算loss,更适用于二分类。
  • mean_squared_error:直接对不激活的预测结果计算MSE loss,不是很符合二分类的真实损失计算方式。

评价指标

评价指标也具有相似性,二分类常用:

  • binary_accuracy:根据阈值将概率转为0/1预测,计算准确率。
  • AUC:计算ROC曲线下的面积,作为模型区分正负样本能力的重要指标。
    优化器的选择也相对灵活,常用的有:
  • SGD:简单梯度下降,容易设置但收敛慢,需要较小的学习率。
  • Adam:运用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率,收敛快。
  • RMSprop:也是对每个参数的学习率进行调整,可以加速SGD收敛,在一定程度上解决了它的缺点。

项目源码

获取数据

import pandas as pd
from IPython.display import display

X_test = pd.read_csv('test.csv')
X_train = pd.read_csv('train.csv')

sid = X_test["id"]

查看行

print(X_train.columns)
Index(['id', 'Product ID', 'Type', 'Air temperature [K]',
       'Process temperature [K]', 'Rotational speed [rpm]', 'Torque [Nm]',
       'Tool wear [min]', 'Machine failure', 'TWF', 'HDF', 'PWF', 'OSF',
       'RNF'],
      dtype='object')

查看训练数据

X_train
idProduct IDTypeAir temperature [K]Process temperature [K]Rotational speed [rpm]Torque [Nm]Tool wear [min]Machine failureTWFHDFPWFOSFRNF
00L50096L300.6309.6159636.1140000000
11M20343M302.6312.1175929.1200000000
22L49454L299.3308.5180526.525000000
33L53355L301.0310.9152444.3197000000
44M24050M298.0309.0164135.434000000
.............................................
136424136424M22284M300.1311.4153037.5210000000
136425136425H38017H297.5308.5144749.12000000
136426136426L54690L300.5311.8152438.5214000000
136427136427L53876L301.7310.9144746.342000000
136428136428L47937L296.9308.1155739.3229000000

136429 rows × 14 columns

查看测试数据

X_test
idProduct IDTypeAir temperature [K]Process temperature [K]Rotational speed [rpm]Torque [Nm]Tool wear [min]TWFHDFPWFOSFRNF
0136429L50896L302.3311.5149938.06000000
1136430L53866L301.7311.0171328.81700000
2136431L50498L301.3310.4152537.79600000
3136432M21232M300.1309.6147947.6500000
4136433M19751M303.4312.3151541.311400000
..........................................
90949227378L51130L302.3311.4148440.41500000
90950227379L47783L297.9309.8154233.83100000
90951227380L48097L295.6306.2150141.418700000
90952227381L48969L298.1307.8153440.36900000
90953227382L52525L303.5312.8153436.19200000

90954 rows × 13 columns

将训练数据的目标值单独拿出

Y_train = X_train.pop('Machine failure')

查看训练数据的目标值

Y_train
0         0
1         0
2         0
3         0
4         0
         ..
136424    0
136425    0
136426    0
136427    0
136428    0
Name: Machine failure, Length: 136429, dtype: int64

将训练集分割为训练集和验证集

from sklearn.model_selection import train_test_split
X_train, X_valid, y_train, y_valid = \
    train_test_split(X_train,Y_train, stratify=Y_train, train_size=0.75)

查看训练集中非数值数据

X_train['Type'].unique()
array(['M', 'L', 'H'], dtype=object)
X_valid['Type'].unique()
array(['L', 'M', 'H'], dtype=object)
X_test['Type'].unique()
array(['L', 'M', 'H'], dtype=object)

将训练集中非数值数据进行onehot编码,数值数据转换为标准差形式


from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.impute import SimpleImputer
from sklearn.pipeline import make_pipeline
from sklearn.compose import make_column_transformer


# X_train['Type'] = \
#     X_train['Type'].map(
#         {'L':1, 'M': 2, 'H':3}
#     )
# X_valid['Type'] = \
#     X_valid['Type'].map(
#         {'L':1, 'M': 2, 'H':3}
#     )
# X_test['Type'] = \
#     X_test['Type'].map(
#         {'L':1, 'M': 2, 'H':3}
#     )


# 数值数据的特征
features_num = [
    "Air temperature [K]","Process temperature [K]"
    ,"Rotational speed [rpm]","Torque [Nm]","Tool wear [min]"
    ,"TWF","HDF","PWF","OSF","RNF",
]
# 非数值数据的特征
features_cat = [
    "Type",
]

# 创建标准化管道
transformer_num = make_pipeline(
    SimpleImputer(strategy="constant"), # there are a few missing values
    StandardScaler(),
)
# 创建onehot编码管道
transformer_cat = make_pipeline(
    SimpleImputer(strategy="constant"),
    OneHotEncoder(handle_unknown='ignore'),
)

preprocessor = make_column_transformer(
    (transformer_num, features_num),
    (transformer_cat, features_cat),
)


X_train = preprocessor.fit_transform(X_train)
X_valid = preprocessor.transform(X_valid)
X_test = preprocessor.transform(X_test)


input_shape = [X_train.shape[1]]

创建模型

from tensorflow import keras
from tensorflow.keras import layers

model = keras.Sequential([
    layers.BatchNormalization(input_shape=input_shape),
    layers.Dense(256, activation='relu'),
    layers.BatchNormalization(),
    layers.Dropout(0.5),
    layers.Dense(256, activation='relu'),
    layers.BatchNormalization(),
    layers.Dropout(0.5),
    layers.Dense(1, activation='sigmoid'),
])

编译模型

model.compile(
    #选择Adam作为优化器
    optimizer='adam', 
    #因为是二分类问题,所以使用binary_crossentropy作为损失函数
    loss='binary_crossentropy',
    #计算二分类精度,所以使用binary_accuracy作为评价指标
    metrics=['binary_accuracy'],

)

训练模型

early_stopping = keras.callbacks.EarlyStopping(
    patience=5,
    min_delta=0.001,
    restore_best_weights=True,
)
history = model.fit(
    X_train, y_train,
    validation_data=(X_valid, y_valid),
    batch_size=512,
    epochs=10,
    callbacks=[early_stopping],
#     verbose=0, # hide the output because we have so many epochs
)

history_df = pd.DataFrame(history.history)
history_df.loc[:, ['loss', 'val_loss']].plot(title="Cross-entropy")# 交叉熵 
history_df.loc[:, ['binary_accuracy', 'val_binary_accuracy']].plot(title="Accuracy")# 准确性 

Epoch 1/10
200/200 [==============================] - 6s 18ms/step - loss: 0.2060 - binary_accuracy: 0.9362 - val_loss: 0.0387 - val_binary_accuracy: 0.9965
Epoch 2/10
200/200 [==============================] - 3s 16ms/step - loss: 0.0427 - binary_accuracy: 0.9959 - val_loss: 0.0303 - val_binary_accuracy: 0.9965
Epoch 3/10
200/200 [==============================] - 3s 17ms/step - loss: 0.0395 - binary_accuracy: 0.9956 - val_loss: 0.0289 - val_binary_accuracy: 0.9964
Epoch 4/10
200/200 [==============================] - 3s 17ms/step - loss: 0.0310 - binary_accuracy: 0.9959 - val_loss: 0.0258 - val_binary_accuracy: 0.9964
Epoch 5/10
200/200 [==============================] - 3s 17ms/step - loss: 0.0319 - binary_accuracy: 0.9959 - val_loss: 0.0250 - val_binary_accuracy: 0.9964
Epoch 6/10
200/200 [==============================] - 3s 17ms/step - loss: 0.0289 - binary_accuracy: 0.9959 - val_loss: 0.0240 - val_binary_accuracy: 0.9965
Epoch 7/10
200/200 [==============================] - 3s 17ms/step - loss: 0.0291 - binary_accuracy: 0.9959 - val_loss: 0.0234 - val_binary_accuracy: 0.9964
Epoch 8/10
200/200 [==============================] - 3s 17ms/step - loss: 0.0292 - binary_accuracy: 0.9959 - val_loss: 0.0234 - val_binary_accuracy: 0.9964
Epoch 9/10
200/200 [==============================] - 3s 17ms/step - loss: 0.0276 - binary_accuracy: 0.9959 - val_loss: 0.0234 - val_binary_accuracy: 0.9965
Epoch 10/10
200/200 [==============================] - 3s 17ms/step - loss: 0.0321 - binary_accuracy: 0.9948 - val_loss: 0.0226 - val_binary_accuracy: 0.9964





<AxesSubplot:title={'center':'Accuracy'}>

在这里插入图片描述

在这里插入图片描述

验证模型

# 获取验证集的预测结果
Y_valid_predict = model.predict(X_valid) 
# 将预测结果由概率转变为0或1
threshold = 0.5
Y_valid_predict = (Y_valid_predict > threshold).astype('int')

1066/1066 [==============================] - 3s 3ms/step
# 计算预测的准确性
from sklearn.metrics import accuracy_score
acc_score = accuracy_score(Y_valid_predict, y_valid)
print("Accuracy on valid set: {}%".format(acc_score*100)) 
Accuracy on valid set: 99.6393807904304%

对测试数据进行预测

X_test
array([[ 1.30927485,  1.12648811, -0.15104398, ...,  0.        ,
         1.        ,  0.        ],
       [ 0.98707189,  0.76543703,  1.38960729, ...,  0.        ,
         1.        ,  0.        ],
       [ 0.77226992,  0.33217574,  0.03613795, ...,  0.        ,
         1.        ,  0.        ],
       ...,
       [-2.2886582 , -2.7006533 , -0.13664537, ...,  0.        ,
         1.        ,  0.        ],
       [-0.94614587, -1.54528986,  0.10093169, ...,  0.        ,
         1.        ,  0.        ],
       [ 1.95368077,  2.06522091,  0.10093169, ...,  0.        ,
         1.        ,  0.        ]])

# 获取验证集的预测结果
Y_test = model.predict(X_test) 
2843/2843 [==============================] - 7s 3ms/step
# 将预测结果由概率转变为0或1
threshold = 0.5
Y_test = (Y_test > threshold).astype('int')
import numpy as np
sid = np.array(sid)
Y_test
array([[0],
       [0],
       [0],
       ...,
       [0],
       [0],
       [0]])
output = pd.DataFrame({"id": sid, "Machine failure": Y_test[:, 0]})
output.to_csv('submission.csv', index=False)
print("Your submission was successfully saved!")
Your submission was successfully saved!



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/674842.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[RockertMQ] Broker启动加载消息文件以及恢复数据源码 (三)

Broker的启动过程中, 在DefaultMessageStore实例化后, 会调用load方法将磁盘中的commitLog、ConsumeQueue、IndexFile文件的数据加载到内存中, 还有数据恢复的操作。 调用isTempFileExist方法判断上次broker是否是正常退出, 如果是正常退出不会保留abort文件, 异常退出则会。 …

【MySQL】关于自增id、雪花id还是uuid作为MySQL主键

在MySQL中设计表的时候&#xff0c;MySQL官方推荐不要使用uuid或者不连续不重复的雪花id(long型且唯一)&#xff0c;而是推荐连续自增的主键id&#xff0c;官方的推荐是auto_increment。那么为什么不使用雪花id或者uuid呢&#xff1f;让我们来探讨分析一下这个问题的原因。 关于…

【人工智能技术专题】「入门到精通系列教程」打好AI基础带你进军人工智能领域的全流程技术体系(机器学习知识导论)

零基础带你进军人工智能领域的全流程技术体系和实战指南&#xff08;机器学习基础知识&#xff09; 前言专栏介绍专栏说明学习大纲前提条件面向读者学习目标核心内容机器学习的概念定义回顾人工智能机器学习概念国外知名学者对机器学习的定义中文翻译 机器学习发展历程机器学习…

Oracle JSON_ARRAYAGG()函数的排序失效问题

引入&#xff1a; 在实际操作中&#xff0c;俺写了这样一个Funtcion&#xff1a; FUNCTION fun_get_xxx(v_param_one VARCHAR2) RETURN CLOB ASv_OUTPUT CLOB;BEGINWITH temp_table AS (SELECT * FROM (( SELECT one.action_id,two.log_timeFROM table_one oneLEFT JOIN table…

【深度学习】6-4 卷积神经网络 - CNN的实现

CNN的实现 网络的构成是“Convolution - ReLU - Pooling -Affine - ReLU - Affine - Softmax”&#xff0c;我们将它实现为名为 SimpleConvNet的类。 首先来看一下 SimpleConvNet的初始化&#xff08;init&#xff09;&#xff0c;取下面这些参数。 input_dim——输入数据的维…

七彩虹CN600+Meetiger N10C测评

七彩虹CN600这款M.2固态硬盘的参数就不多说了 本期采用为512版本 迷虎品牌&#xff0c;英文名Meetiger&#xff0c;Meetiger/迷虎品牌成立于2012年&#xff0c;品牌迷虎产品主要有硬盘底座,保护盒,硬盘座,移动硬盘盒子,硬盘盒子,... 以下就是本期的硬盘盒 当这两样东西在一起…

C++(10):泛型算法

泛型算法&#xff1a;可用于不同类型的容器和不同类型的元素的通用算法。 概述 大多数算法都定义在头文件algorithm 中。标准库在头文件 numeric 中定义了一组数值泛型算法。 一般情况下&#xff0c;泛型算法不直接操作容器&#xff0c;而是遍历由两个迭代器指定的一个元素范…

【Spring Boot学习】日志文件,Spring Boot也会写日记了,这些事你知道嘛 ? ? ?

前言: 大家好,我是良辰丫,在上一篇文章中我们已经学习了Spring Boot的配置,接下来我们要学习一些日志相关的东西,什么是日志呢?我们慢慢往下看.&#x1f48c;&#x1f48c;&#x1f48c; &#x1f9d1;个人主页&#xff1a;良辰针不戳 &#x1f4d6;所属专栏&#xff1a;javaE…

7.4_2B树的插入删除

我们先设置根节点 我们再往里面插入关键字 比如说&#xff1a;80 中间位置为49&#xff1a;&#xff08;5/2&#xff09;向上取整为3 新元素一定要插入到最底层”终端结点“&#xff0c;用”查找”来确定插入位置。 失败节点&#xff08;叶子节点不属于同一层&#xff09; 讲…

Vue-全局事件总线(GlobalEventBus)

全局事件总线(GlobalEventBus) 全局事件总线是vue中特别厉害的一种组件中通信的方式&#xff0c;它可以实现任意组件中通信&#xff0c;随便拿出来两个组件就能互通数据&#xff0c;就像对讲机一样&#xff0c;它在开发中用的也是特别的多 1 编写案例 首先准备两个组件&…

Python列表 (超详细举例加讲解)

得之我幸&#xff0c;失之我命 文章目录 1.列表的值 2.列表的定义 3.下标 4.列表长度 5.列表的加法和乘法 6.列表切片 7.操作方法&#xff08;一些基础的函数&#xff09; &#xff08;1&#xff09;append——向列表末尾添加元素 &#xff08;2&#xff09;insert——…

VUE3实现页面缓存,tab切换时不刷新

如上图所示&#xff0c;为了实现页面缓存&#xff0c;防止每次页面切换时重新刷新数据&#xff0c;前前后后尝试了多种写法&#xff0c;如上图被注释的那段写法&#xff0c;与没注释掉的写法&#xff0c;在router-view上主要是第一种写法有设置key属性&#xff0c;第二种没有&a…

常见面试题之框架篇

1.Spring框架中的单例bean是线程安全的吗&#xff1f; 不是线程安全的&#xff0c;是这样的。 当多用户同时请求一个服务时&#xff0c;容器会给每一个请求分配一个线程&#xff0c;这是多个线程会并发执行该请求对应的业务逻辑&#xff08;成员方法&#xff09;&#xff0c;…

模拟电路系列分享-负反馈电路稳定性分析

目录 概要 整体架构流程 技术名词解释 1.负反馈放大电路产生自激震荡的条件 2.从实际运放的幅频&#xff0c;相频特性看自激振荡的可能性 小结 概要 在卡拉0K歌厅中,我们会见到这样一种现象:当麦克风位置不合适或者音量过大时, 喇叭中会出现一种非常难听的啸叫,捂住麦克风、赶紧…

【无需显卡】AI绘画入门教程

前言 Hello&#xff0c;各位端午节快乐呀&#xff01;不好意思拖更两个月&#xff0c;最近实在是太忙了&#xff0c;也想不到有什么好玩的&#xff0c;之前介绍过了几个好玩的ai网站&#xff0c;非常适合新手尝鲜&#xff0c;但很多都有额度限制&#xff0c;而且还开始收费了&…

【C语言】内存你知多少?详解C语言动态内存管理

目录 一&#xff0c; 计算机中的内存 二&#xff0c;动态内存申请函数 2.1 头文件 2.2 malloc函数 2.3 free函数 2.3 calloc函数 2.4 realloc函数——调整空间函数 情况1&#xff1a;原有空间之后有足够大的空间 情况2&#xff1a;原有空间之后没有足够大的空间 2…

Android大图加载优化方案,避免程序OOM

我们在编写Android程序的时候经常要用到许多图片&#xff0c;不同图片总是会有不同的形状、不同的大小&#xff0c;但在大多数情况下&#xff0c;这些图片都会大于我们程序所需要的大小。比如微博长图&#xff0c;海报等等。所以我们就要对图片进行局部显示。 大图加载基本需求…

信号与系统复习笔记——信号与系统的时域和频域特性

信号与系统复习笔记——信号与系统的时域和频域特性 傅里叶变换的模和相位表示 一般来说&#xff0c;傅里叶变换的结果是复数&#xff0c;所以能够使用模和相位来表示&#xff0c;具体的有&#xff1a; X ( j ω ) ∣ X ( j ω ) ∣ e j ∡ X ( j ω ) X(j\omega) |X(j\ome…

浅尝Transformer和LLM

文章目录 TransformerTransformer的衍生BERTPre-trainingBERT与其他方法的关系怎么用BERT做生成式任务&#xff1f; GPTPre-trainingFine-Tuning Transformer工具开源库特点 LLM系列推理服务 大语言模型势不可挡啊。 哲学上来说&#xff0c;语言就是我们的一切&#xff0c;语言…

MySQL 高级(进阶) SQL 语句

创建两个表格 use awsl; create table location (Region char(20),Store_Name char(20)); insert into location values(East,Boston); insert into location values(East,New York); insert into location values(West,Los Angeles); insert into location values(West,Houst…