机器学习:预测液压破损-分类任务和模型性能的解释

现代工业世界,大规模的制造和自动化在汽车工业,配送中心,包装工业已经几乎无处不在。与人类劳动相比,机器在精确度和重复性方面都很好,但机器也容易出现故障。对于酿酒公司来说,一旦一个液压蓄能器坏了,就会导致啤酒的味道大不相同,从而造成不可逾越的成本。

由于数据科学是一门专注于数据的科学,我们有信息可以研究设备的传感器,为什么我们不能利用它,并在预测泄漏何时发生方面取得一些小小的进展

数据

我们获得的数据是通过UCI机器学习库 – 一个液压试验台。(
https://archive.ics.uci.edu/ml/datasets/Condition+monitoring+of+hydraulic+systems)

该系统有17个传感器,可以跟踪每一个循环。在项目中,我们的工作是从数据中提取有价值的信息,建立机学习预测模型,帮助我们预测具体的目标变量——内部泵泄漏。本项目的目的是为了更好的预测泵内泄漏,这样我们就可以更好的判断何时更换泵。从长远来看,它还将帮助我们节省资金,因为我们只是更换泵在预测泄漏发生之前。

数据清理

每个传感器都有自己的数据文件(通过txt文件存储),传感器包括压力、温度、体积流量等。对于不同的传感器,用于记录的频率(Hz)是每秒钟1,10或100次,这意味着每个传感器将创建60,600或6000条记录。

#calculate mean of every sensors during each instances

eps1_new = eps1.mean(axis = 1)

fs1_new = fs1.mean(axis = 1)

fs2_new = fs2.mean(axis = 1)

ps1_new = ps1.mean(axis = 1)

ps2_new = ps2.mean(axis = 1)

ps3_new = ps3.mean(axis = 1)

ps4_new = ps4.mean(axis = 1)

ps5_new = ps5.mean(axis = 1)

ps6_new = ps6.mean(axis = 1)

se_new = se.mean(axis = 1)

ts1_new = ts1.mean(axis = 1)

ts2_new = ts2.mean(axis = 1)

ts3_new = ts3.mean(axis = 1)

ts4_new = ts4.mean(axis = 1)

vs1_new = vs1.mean(axis = 1)

ce_new = ce.mean(axis = 1)

cp_new = cp.mean(axis = 1)

所以最后数据看起来是18列,其中17列是特性,而1列是标签。

清理后的数据

在我们进入EDA之前,首先我想看看目标变量的平衡性。

虽然不是完全平衡的,但它仍然是相当平衡的,所以我们不需要在这一步采取任何行动。

检查缺失值

如果我们有太多的缺失值对我们的预测不利。但是如果只有某些部分,我们可以使用插补方法用某些方法替换所有缺失值,例如用中位数替换,或者我们可以使min-max。对于替换缺失值的函数,Python代码如下:

def miss_value_table(df):

mis_val=df.isnull().sum()

mis_val_perc = 100 * df.isnull().sum()/len(df)

#make a table:

mis_val_table = pd.concat([mis_val,mis_val_perc],axis = 1)

#rename colums:

mis_val_rename = mis_val_table.rename(

columns = {0: “Missing Value”,1: “Percentage”})

#sort the value by descending order:

mis_val_rename = mis_val_rename[

mis_val_rename.iloc[:,1] != 0].sort_values(

‘Percentage’, ascending=False).round(1)

return mis_val_rename

最后,我发现没有任何缺失值的功能完全有意义,因为我实际上是通过取每个传感器的平均值来创建数据集。

EDA(探索性数据分析)

对于分类任务,像boxplot、correlation heatmap这样的图可以帮助我们更好的理解目标与feature之间的关系以及feature内部的关系。具体来说,为了预测内部泵泄漏,如果我们能找到高度相关的特征,我们可以使用特征工程方法来设计新的变量,从而更精确地捕捉目标变量的变化。Python代码如下:

plt.figure(figsize=(15,8))

# calculate the correlation matrix

corr = data.corr()

mask = np.zeros_like(corr)

mask[np.triu_indices_from(mask)] = True

with sns.axes_style(“white”):

x = sns.heatmap(corr, mask=mask, vmax=.3, square=True,xticklabels=corr.columns,yticklabels=corr.columns)

上面的heatmap图显示了数据集中每一列之间的相关性,每个方框越黑,说明两列之间的相关性越强。例如,我们可以看到内部泵泄漏柱,它与SE和PS3的相关性比较大,与其他列的相关性比较小。

Train-Test拆分

在机器学习中,我们需要将我们的数据分割成训练和测试集:

  • 训练集:对我们的模型进行训练,可以了解特征和目标之间的关系。
  • 测试集:我们不使用它来训练我们的模型,只用于测试模型性能。因此,通过对比测试集的结果,我们可以知道哪个模型可以更好地应用于现实世界的例子。
  • 在sklearn中,训练测试分离可以很容易地应用,随机状态可以给出一致的结果。Python代码如下:

    label = data[‘Internal pump leakage’]

    data = data.drop(columns = ‘Internal pump leakage’)

    #split the data into train and test sets

    from sklearn.model_selection import train_test_split

    X_train, X_test, y_train, y_test = train_test_split(data,label, test_size=0.2, random_state= 42)特征

    特征缩放

    在构建模型之前要做的最后一步是特征缩放。这是必要的,因为特征在不同的单位中,我们想归一化特征,这样单位不会影响算法。线性回归和随机森林不需要特征缩放,但是其他方法,如支持向量机和k最近邻,确实需要它,因为它们考虑了观察之间的欧氏距离。因此,当我们比较多个算法时,特征缩放是一个最佳实践。

    在SK-learn的优秀包装中,我们可以导入pipeline ,为我们提供一步到位的简单易用模块,使整个过程自动化。Python代码如下:

    #build a pipeline to scale data

    from sklearn.pipeline import Pipeline

    from sklearn.preprocessing import MinMaxScaler

    p = Pipeline([(‘scaler’, MinMaxScaler(feature_range = (0, 1)))])

    #features transformation

    features = p.fit_transform(X_train)

    test_features = p.transform(X_test)

    模型

    基本模型

    我们将使用sklearn库比较三种不同的模型:

  • 逻辑回归
  • k -最近邻分类
  • 梯度提升机
  • 为了比较模型的性能,我们将使用sklearn默认设置。通常情况下,这些设置会很好地执行,但是为了获得更好的结果,需要进行超参数优化。这就是为什么我将首先使用默认设置来了解哪些algoris表现更好,稍后我将尝试通过优化来调整模型。

    逻辑回归

    逻辑回归是建立在回归理论的基础上的,每个特征都被赋予一个像线性回归模型一样的系数。Logistic回归模型很容易解释,因为系数可以反映出特征对目标的变化,但Logistic回归有时会给你比其他模型更低的准确性。Python实现代码如下:

    from sklearn.metrics import accuracy_score as acc

    #logistic regression

    from sklearn.linear_model import LogisticRegression

    logic = LogisticRegression()

    logic.fit(features,y_train)

    y_test_logic = logic.predict(test_features)

    print(‘The Accuracy of Logistic regression is: ‘,acc(y_test,y_test_logic))

    The Accuracy of Logistic regression is: 0.7210884353741497

    k -最近邻

    最近邻分类方法是机器学习中最常见的方法之一。本质上是分类,通过在训练数据中找到最相似的数据点,根据它们的分类进行有根据的猜测。Python实现如下:

    #KNN methods

    from sklearn.neighbors import KNeighborsClassifier

    knn = KNeighborsClassifier()

    knn.fit(features,y_train)

    y_pred_knn = knn.predict(test_features)

    print(‘The Accuracy of KNN method is: ‘,acc(y_test,y_pred_knn))

    The Accuracy of KNN method is: 0.9886621315192744

    梯度提升机

    梯度提升机是一种基于决策树模型的非线性模型。与随机森林(Randomforest)中尽可能多地构建树不同,gbm侧重于通过对残差进行拟合来调整现有树。Python代码如下:

    #gbm methods

    from sklearn.ensemble import GradientBoostingClassifier

    gbm = GradientBoostingClassifier(random_state= 42)

    gbm.fit(features,y_train)

    y_pred_gbm = gbm.predict(test_features)

    print(‘The Accuracy of GBM method is: ‘,acc(y_test,y_pred_gbm))

    The Accuracy of GBM method is: 0.9863945578231292

    模型比较

    Python代码如下:

    #model result comparison

    acc_train = [acc(y_train,logic.predict(features)),

    acc(y_train,knn.predict(features)),

    acc(y_train,gbm.predict(features))]

    acc_test = [acc(y_test,logic.predict(test_features)),

    acc(y_test,knn.predict(test_features)),

    acc(y_test,gbm.predict(test_features))]

    figsize(6,8)

    plt.style.use(‘fivethirtyeight’)

    #dataframe to hold the results

    model_comparison = pd.DataFrame({0:[‘Logistic Regression’, ‘K-Nearest Neighbors’,

    ‘Gradient Boosted Machine’],

    1:acc_train,

    2:acc_test})

    model_comparison = model_comparison.rename({0:”Method”,

    1: “Train Accuracy”,

    2: “Test Accuracy”},axis =1)

    model_comparison.sort_values(by = “Test Accuracy”,ascending = False).plot(

    x = ‘Method’, y = ‘Test Accuracy’,kind = ‘barh’,color = “red”,edgecolor = ‘black’);

    plt.ylabel(”);plt.xlabel(‘Accuracy’);

    plt.xticks(size = 4);

    plt.title(“Model Comparison on Test Accuracy”,size =30)

    根据结果,KNN方法在三种模型中都是最好的。Logistic回归的效果最差,而gbm模型在这种情况下过度拟合。一般来说,gbm工作得更好,但在这里,因为一个更简单的模型- KNN工作得更好,所以在下面我将调整参数(s)的KNN模型,以便我们可以获得更好的结果。

    模型优化

    在机器学习中,优化模型意味着为特定问题找到最佳的超参数集。与模型参数相反,超参数被认为是机器学习算法的最佳设置,在训练前由数据科学家进行调整。例如随机森林中的树数,或者K最近邻中的K。

    在寻找最佳参数的方法中, 格搜索、随机搜索和贝叶斯优化是常用的方法。在我们的具体应用案例中,我们将尝试找到最佳的k来调优我们的模型。在这一部分中,我们将首先使用随机搜索,然后应用 格搜索找到最好的k。

    我们将通过随机搜索和交叉验证找到最好的超参数。

  • 随机serach:这将给你一组选项,每次随机选择超参数的组合。
  • 格serach:与随机搜索相比,这将挑选每一个超参数组合来尝试它,当然这将给最好的训练模型,但有时它的时间消耗和将导致过度拟合。
  • 结论

    我们在机器学习任务中的几个步骤:

  • 清理数据:这部分很常见,即使没有机器学习模型,数据分析师也不断需要在进行任何分析之前清理他们的数据。
  • EDA:探索性数据分析将为我们提供有价值的信息,并直观地呈现这些信息以供进一步使用。
  • 机器学习模型应用:Sk-learn库使得几乎每种机器学习方法都能轻松,简单地应用,在这个项目中我们尝试了Logistic,KNN,Gradient Boosting Machine。
  • 模型优化:此步骤是关于微调参数以获得更好的结果,对于大型数据集,这对于提供更好的预测能力非常重要。
  • 选择的三种机器学习模型比较:

  • Logistic回归:结果显示逻辑回归在我们的案例中表现最差。关于逻辑回归的假设,一个是回归要求自变量之间很少或没有多重共线性。这意味着自变量之间的相关性不应过高。然而,根据热图,我们清楚地看到一些变量,如压力传感器彼此高度相关。
  • KNN:它没有严格的数据假设,但是由于维度问题,KNN倾向于使用较小维度的小数据集。对于更高维度,KNN方法属于一个常见的机器学习问题,称为“维数的诅咒”。
  • GBM:它以阶段方式构建模型,并不断提高弱树的性能。GBM方法在大型数据集上运行良好。缺点是需要对整组超参数进行微调,有时候训练时间需要花费一些时间。
  • 结果表明,机器学习适用于我们的问题,最终模型能够预测内部泵泄漏的精度为0.993197。

    可以通过
    https://github.com/spotify2junkie/hydraulic_breakages_classfication找到完整的代码

    声明:本站部分文章内容及图片转载于互联 、内容不代表本站观点,如有内容涉及版权,请您尽早时间联系jinwei@zod.com.cn

    相关推荐