ポイント: 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
Apache Sparkガイド
- Apache Sparkの機械学習パイプライン: 入門
- Apache SparkによるSGD線形回帰の例
- Apache Sparkによる決定木分類器
- ScalaとSparkを使用したロジスティック回帰
- Apache SparkとJupyterノートブックの使い方
- PythonとSpark機械学習を使用した分類
- PythonでのSpark UDF(ユーザー定義関数)の書き方
- Python Spark ML K-Meansの例
- サイバーセキュリティに機械学習を適用する方法
- Apache Spark:ストリームの操作
- Apache SparkによるK-meansクラスタリング
- HiveとのSparkの使用
- Apache Sparkを使用して予防保全のための予測を行う方法
これらの投稿は私自身の意見であり、必ずしもBMCの立場、戦略、または意見を代表するものではありません。