降低工业卡车的维修成本:机械工程师的机器学习

机械工程师的机器学习:一种经常被忽视的技能,或者被严格认为是“其他工程师的”。机械工程师将通过机器学习,看到对编程的需求和对新成本削减技术的理解的巨大增长。

在本文中,我们将探索来自加州大学欧文分校机器学习库的数据集(https://archive.ics.uci.edu/ml/datasets/APS+Failure+at+Scania+Trucks)。数据集中在传感器读数的组合上,这些读数表明卡车需要进行检查,以避免发生故障。

我们将构建一个分类器来筛选这些数据,帮助我们对卡车是否需要维修做出未来的预测。

降低工业卡车的维修成本:机械工程师的机器学习

背景和问题陈述

该数据集由每天使用的重型斯堪尼亚卡车收集的数据组成。该系统的重点是空气压力系统(APS),它产生压力空气,用于卡车的各种功能,如制动和换档。数据集的正面类由APS系统特定组件的组件故障组成。负类是由卡车的故障组成的,而不是与APS相关的部件。这些数据由专家挑选的所有可用数据的子集组成。

根据数据集repo的描述,我们的目标是最小化与以下方面相关的成本:

机械师做的不必要的检查。(10美元)

错过了一辆有故障的卡车,可能导致未来发生故障。($ 500)

由于专有原因,每个传感器数据的单元都是私有的。然而,我们项目的主要目标将是预测和最小化与这些读数组合相关的失败成本。

您不必在本文中熟悉机器学习,但了解一些Python和Pandas会很有帮助。

降低工业卡车的维修成本:机械工程师的机器学习

我们今天的重点是:让斯堪尼亚卡车远离维修线

加载/清理数据

使用Pandas加载数据很简单,Python代码如下:

# importing our libraries

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

pd.options.display.max_columns = None

import warnings

warnings.filterwarnings('ignore')

# setting dataframe variables as train and test data

train_data = pd.read_csv('data/aps_failure_training_set_processed_8bit.csv')

test_data = pd.read_csv('data/aps_failure_test_set_processed_8bit.csv')

train_data.head()

输出应如下所示:

降低工业卡车的维修成本:机械工程师的机器学习

现在我们知道我们的数据读取正确,我们开始清理数据,Python代码如下:

# how many unique data points are in the training set

train_data['class'].value_counts()

train_data['class'] = train_data['class'].apply(lambda x: 0 if x<=0 else 1)

test_data['class'] = test_data['class'].apply(lambda x: 0 if x<=0 else 1)

X = train_data.drop('class', axis=1)

y = train_data['class']

X_test_final = test_data.drop('class', axis=1)

y_test_final = test_data['class']

这有点hand-wavy',但是我们从X数据中删除了'class'列,并将它赋给我们的y变量,现在只保留那些'class'值。

删除低方差的特征

执行此步骤将删除几乎不变且不会改进模型的特征,Python实现如下

# where the values have an extremely low standard deviation

X.columns[np.where(desc.loc['std'] < 0.005)].values

# computes a pairwise correlation of comlumns, excluding NA/null

corr = X.corr()

# fill those correlated values with zeros

np.fill_diagonal(corr.values, 0)

建立模型:随机森林

现在我们已经对数据进行了预处理和清理,我们可以开始建立模型的部分了。

随机森林是一种基于决策树的分类方法。它看起来像这样:

降低工业卡车的维修成本:机械工程师的机器学习

随机森林可视化

降低工业卡车的维修成本:机械工程师的机器学习

在将卡车送到商店之前,决策树将填充正常操作员要问的问题。它看起来像上面的图表。当然,还有很多问题可以提出来!随机森林将非常善于发现哪个特征与下一个特征相关。Python实现的代码如下:

from sklearn.model_selection import train_test_split

from sklearn.ensemble import RandomForestClassifier

from sklearn.metrics import classification_report, confusion_matrix, roc_curve, make_scorer

import scikitplot as skplt

SEED = 1

# separating our data into training and test sets

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, stratify=y, random_state=SEED)

# definition of the model from scikit-learn

model_full_rf = RandomForestClassifier(n_estimators=200, class_weight='balanced', random_state=SEED, n_jobs=-1)

# compiling the model

model_full_rf.fit(X_train, y_train)

model_full_rf.score(X_test, y_test) #the score of the model

我们完全定义和编译了我们的模型。现在剩下要做的是通过使用混淆矩阵找到与我们的预测相关的成本。混淆矩阵给出了真阴性和真阳性,假阴性和假阳性的计数。

请记住,我们模型的成本是:

  • 假阳性
  • 假阴性

Python代码如下:

y_pred = model_full_rf.predict(X_test)

y_pred_proba = model_full_rf.predict_proba(X_test)

# the confusion matrix

tn, fp, fn, tp = confusion_matrix(y_test, y_pred).ravel()

# visualizing the matrix

skplt.metrics.plot_confusion_matrix(y_test, y_pred, normalize=False)

plt.show()

降低工业卡车的维修成本:机械工程师的机器学习

输出混淆矩阵

使用我们从预测得到的结果:

10*fp + 500*fn # cost associated with our model

output是$52,620.

随机森林是一种有监督的算法,这意味着我们很可能不得不调整机器学习模型,以看到任何改进。我们使用scikit的roc_curve函数来查找所有可能的阈值。

scores = model_full_rf.predict_proba(X_test)[:,1]

fpr, tpr, thresholds = roc_curve(y_test, scores)

然后,我们在这些值上创建一个循环,以找到最小成本的最佳阈值,Python代码如下:

min_cost = np.inf

best_threshold = 0.5

costs = []

for threshold in thresholds:

y_pred_threshold = scores > threshold

tn, fp, fn, tp = confusion_matrix(y_test, y_pred_threshold).ravel()

cost = 10*fp + 500*fn

costs.append(cost)

if cost < min_cost:

min_cost = cost

best_threshold = threshold

print("Best threshold: {:.4f}".format(best_threshold))

print("Min cost: {:.2f}".format(min_cost))

y_pred_test_final = model_full_rf.predict_proba(X_test_final)[:,1] > best_threshold

tn, fp, fn, tp = confusion_matrix(y_test_final, y_pred_test_final).ravel()

10*fp + 500*fn

The output is now $9850. 一个巨大的进步。

现在我们有一个工作分类器,能够根据APS的传感器读数告诉车队操作员是否需要维修卡车。

相关推荐