Apache Sparkを使用して予防保全のための予測を行う方法

Apache Sparkを使用して予防保全のための予測を行う方法

  • 人工知能(AI)
6分で読めます 更新日 May 25, 2018

ポイント: Apache Sparkを使用した予測保全は、機械学習を活用してサービスが必要な機械を特定します。このガイドでは、予測のためにSparkジョブを送信する方法を説明し、基本的なコードスニペットと手順を示します。

  • メンテナンスの予測のためにSparkジョブを送信します。
  • 機械学習を利用してサービスが必要な機械を特定します。

第1部では、トレーニングモデルの作成方法を説明しました。この部分では、データセット内のどの機械をサービスから外して保守すべきかを予測する方法を示します。

まず、spark-submitでジョブをSparkに送信する方法は次のとおりです:

  • com.bmc.lr.makePredictionを含むjarファイル
  • どのファイルを読み込むか、すなわち、パートIで生成したファイル(前の関連記事へのリンクを挿入)
  • どのモデルを使用するか、すなわち、パートIで生成したモデル(前の関連記事へのリンクを挿入)

spark-submit

--class com.bmc.lr.makePrediction

--master local[*]

hdfs://localhost:9000/maintenance/lr-assembly-1.0.jar

hdfs://localhost:9000/maintenance/2018.04.20.15.48.54.csv

hdfs://localhost:9000/maintenance/maintenance_model

    spark-submit --class com.bmc.lr.makePrediction --master local[*] hdfs://localhost:9000/maintenance/lr-assembly-1.0.jar hdfs://localhost:9000/maintenance/2018.04.20.15.48.54.csv hdfs://localhost:9000/maintenance/maintenance_model

コード

通常のインポートとパッケージ名は次のとおりです。

    package com.bmc.lr

import org.apache.spark.sql.SQLContext
import org.apache.spark.ml.classification.{BinaryLogisticRegressionSummary, LogisticRegression}
import org.apache.spark.mllib.linalg.{Vector, Vectors}
import org.apache.spark.ml.evaluation.BinaryClassificationEvaluator
import org.apache.spark.ml.feature.{VectorAssembler, StringIndexer}
import org.apache.spark.ml.classification.LogisticRegressionModel
import org.apache.spark.SparkConf
import org.apache.spark.sql.SQLContext
import org.apache.spark.SparkContext

コマンドライン引数を読み込み、SparkとSQLコンテキストをセットアップします。クラスcom.bmc.lr.makePredictionをspark-submitからインスタンス化できるように、オブジェクトmakePredictionを作成します。

    object makePrediction {

def main(args: Array[String]): Unit = {
 val conf = new SparkConf().setAppName("lr")
 val sc = new SparkContext(conf)
var modelFile = args(1);
var file = args(0);

val sqlContext = new SQLContext(sc)

databricksを使用して入力ファイルを読み込み、org.apache.spark.sql.DataFrameを作成します。後でdatabricksは、出力をHadoopに保存するのに便利です、なぜならそれには1行のコードだけが必要だからです。

val df = sqlContext.read.format("com.databricks.spark.csv").option("header", "true").option("inferSchema", "true").option("delimiter",";").load(file)

    val df = sqlContext.read.format("com.databricks.spark.csv").option("header", "true").option("inferSchema", "true").option("delimiter",";").load(file)

この時点でdfは次のようになります:

    lifetime|broken| pressureInd|       moistureInd|    temperatureInd|team|  provider|
+------------------+------+------------------+------------------+--------------
|17.792044609594086| 0|104.25543343273085| 88.67373165099184|122.75111030066334|  47|Ford F-750|
| 69.39805687060903| 0| 93.34561942201603| 86.62996015487022|  84.9796059428202|  34|Ford F-750|
| 84.53664924532875| 0|110.64579687466193|125.89351825805036| 58.34915688191312|   8|Ford F-750|

org.apache.spark.ml.featureVectorAssemblerは、featureColsの特徴をベクトル列に変換します。この形式にする必要があります。これはLogisticRegressionModel.transform()に接続するためです。これは(lifetime, pressureInd, moistureInd, temperatureInd)とラベル(明瞭さのためにbrokenをlabelに名前変更します)を取り込み、どの機械が故障するかを予測するためのステップです。

その後、broken(1または0)のラベルをorg.apache.spark.ml.feature.StringIndexerに入れて、単一の値であるラベルを含めます。org.apache.spark.ml.feature.StringIndexer.fit()は、データをモデルにフィットさせ、予測を行います。

    You can see what the features vectors look like after we create df3 (see below).

val featureCols =  Array("lifetime", "pressureInd", "moistureInd", "temperatureInd")

val assembler = new VectorAssembler().setInputCols(featureCols).setOutputCol("features")

val labelIndexer = new StringIndexer().setInputCol("broken").setOutputCol("label")

val df2 = assembler.transform(df)

val df3 = labelIndexer.fit(df2).transform(df2)

ここで、特徴列を示します(表示上は切り取られています)。これが、トレーニングモデルに接続するために使用している密なベクトルと似ています。

    df3.select("features").show()
+--------------------+
|            features|
+--------------------+
|[17.7920446095940...|
|[69.3980568706090...|
|[84.5366492453287...|
|[71.6002965259175...|
|[46.8176995523900...|

Hadoopファイルシステムから保存されたorg.apache.spark.ml.classification.LogisticRegressionModelモデルをロードします。このモデルは、最初のプログラムでトレーニングしました。

val model = LogisticRegressionModel.load(modelFile)

    val model = LogisticRegressionModel.load(modelFile)

ここで、必要な列だけを選択します(特徴を取り除きます。なぜなら、それは印刷して表示するのが難しく、冗長だからです)。その後、メンテナンスが必要な機械だけを表示します。すなわち、brokenの予測値が1(真)のものです。

    val predictions = model.transform(df3)

var df4 = predictions.select ("team", "provider", "pressureInd", "moistureInd", "temperatureInd", "label", "prediction")

val df5 = df4.filter("prediction=1")

df5.show()

df5.show()を使用して、4台の機械がメンテナンスを必要としていることがわかります:

    +----+----------+------------------+------------------+-----------------+-----+----------+
|team|  provider|       pressureInd|       moistureInd|   temperatureInd|label|prediction|
+----+----------+------------------+------------------+-----------------+-----+----------+
|  34|Ford F-750| 93.34561942201603| 86.62996015487022| 84.9796059428202|  0.0|       1.0|
|   8|Ford F-750|110.64579687466193|125.89351825805036|58.34915688191312|  0.0|       1.0|
|  83|Ford F-750| 55.77009802003853|   66.832777175712|125.2982705340028|  0.0|       1.0|
|   2|Ford F-750|  84.1763960666348|  82.1342684415311|57.73202884026434|  0.0|       1.0|
+----+----------+------------------+------------------+-----------------+-----+----------+

今、databricksの別の例を見て、予測を.csvファイルにHadoopに書き込む方法がどれほど便利かを示します。出力を日付のファイル名で保存します。また、異なる日付形式を作成する最も簡単な方法であるjava.util.Dateをインポートすることにも注意してください。

    import java.util.Date
import java.text.SimpleDateFormat
val date = new Date()
var dformat:SimpleDateFormat = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss");
val csvFile = "hdfs://localhost:9000/maintenance/" + dformat.format(date) + ".csv"
df5.write.format("com.databricks.spark.csv").option("header", "true").save(csvFile)

}
}

今、データを示します:

hadoop fs -cat hdfs://localhost:9000/maintenance/2018.05.16.09.07.33.csv/part-00000-7a9a4de6-ab90-4cd4-b9f5-d0d30c881b2c-c000.csv

team,provider,pressureInd,moistureInd,temperatureInd,label,prediction

34,Ford F-750,93.34561942201603,86.62996015487022,84.9796059428202,0.0,1.0

8,Ford F-750,110.64579687466193,125.89351825805036,58.34915688191312,0.0,1.0

83,Ford F-750,55.77009802003853,66.832777175712,125.2982705340028,0.0,1.0

2,Ford F-750,84.1763960666348,82.1342684415311,57.73202884026434,0.0,1.0

    hadoop fs -cat hdfs://localhost:9000/maintenance/2018.05.16.09.07.33.csv/part-00000-7a9a4de6-ab90-4cd4-b9f5-d0d30c881b2c-c000.csv team,provider,pressureInd,moistureInd,temperatureInd,label,prediction 34,Ford F-750,93.34561942201603,86.62996015487022,84.9796059428202,0.0,1.0 8,Ford F-750,110.64579687466193,125.89351825805036,58.34915688191312,0.0,1.0 83,Ford F-750,55.77009802003853,66.832777175712,125.2982705340028,0.0,1.0 2,Ford F-750,84.1763960666348,82.1342684415311,57.73202884026434,0.0,1.0

これらの投稿は私自身の意見であり、必ずしもBMCの立場、戦略、または意見を代表するものではありません。

人工知能(AI)の関連記事

The Briefを購読する

このオファーに登録することで、あなたはBMCのプライバシーポリシーを読み、同意したことを確認します。

ありがとう

あなたはThe Briefに登録されました
The Briefはメインフレームとエンタープライズオーケストレーション—BMC AMIとControl-M—および、両者に関するアナリストの研究、顧客の展開、イベントをカバーしています。