现代工业世界,大规模的制造和自动化在汽车工业,配送中心,包装工业已经几乎无处不在。与人类劳动相比,机器在精确度和重复性方面都很好,但机器也容易出现故障。对于酿酒公司来说,一旦一个液压蓄能器坏了,就会导致啤酒的味道大不相同,从而造成不可逾越的成本。
由于数据科学是一门专注于数据的科学,我们有信息可以研究设备的传感器,为什么我们不能利用它,并在预测泄漏何时发生方面取得一些小小的进展
数据
我们获得的数据是通过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库比较三种不同的模型:
为了比较模型的性能,我们将使用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。
我们将通过随机搜索和交叉验证找到最好的超参数。
结论
我们在机器学习任务中的几个步骤:
选择的三种机器学习模型比较:
结果表明,机器学习适用于我们的问题,最终模型能够预测内部泵泄漏的精度为0.993197。
可以通过
https://github.com/spotify2junkie/hydraulic_breakages_classfication找到完整的代码
声明:本站部分文章内容及图片转载于互联 、内容不代表本站观点,如有内容涉及版权,请您尽早时间联系jinwei@zod.com.cn