ポイント: Scalaとペンシルベニア大学のデータを使用して、自動車の特徴に基づいてガソリンの燃費を予測するために、Spark決定木分類器を利用する方法を学びます。このチュートリアルでは、決定木分類の包括的な概要と実用的なScalaの例が含まれています。
- Apache Spark MLを使用した決定木分類の適用を示します。
- 理解を深めるためのScalaコードとデータ処理手順を提供します。
ここでは、Apache Spark ML(機械学習)を使用した決定木分類器の使い方を説明します。ペンシルベニア大学のデータを使用します。こちらとこちらからデータを取得します。Scalaコードで解決策を書き、コードの各行を通して読者を導きます。
数学に関するペンシルベニア大学の講義ノートを読むことにあまり時間をかけないでください。数学が得意でない限り、その知識はここでは必要ありません。代わりに、以下のグラフィックが基本的なアイデアを理解するのに必要なすべてを提供します:
目標は、自動車を見てガソリンの燃費を予測することです。燃費は、シリンダー数、エンジン排気量、馬力、重量、60 mphまでの加速時間、モデル年、発祥大陸に基づいて、悪い(0)、良い(1)、またはOK(2)のいずれかです。グラフの下には、テキスト形式のスプレッドシートデータがあり、その下にはテキストが数値に変換されています。
下のグラフは、決定木がどのように機能するかを説明しています。まず、重量を見ます。重ければ燃費は悪いです。重くなくて、エンジン排気量が高ければ、モデル年を見なければなりません。この問題を分割し続け、論理的に進む意味がなくなるまで続けます。明らかに、車が非常に重い場合は、その燃費が悪いと言えます。
ここには、列見出し付きのデータがあります。
| mpg | シリンダー | 排気量 | 馬力 | 重量 | 加速度 | モデル年 | メーカー |
|---|---|---|---|---|---|---|---|
| 悪い | 8 | 350 | 150 | 4699 | 14.5 | 74 | アメリカ |
| 悪い | 8 | 400 | 170 | 4746 | 12 | 71 | アメリカ |
| 悪い | 8 | 400 | 175 | 4385 | 12 | 72 | アメリカ |
| 悪い | 6 | 250 | 72 | 3158 | 19.5 | 75 | アメリカ |
| OK | 4 | 121 | 98 | 2945 | 14.5 | 75 | アジア |
| OK | 6 | 232 | 90 | 3085 | 17.6 | 76 | アメリカ |
| OK | 4 | 120 | 97 | 2506 | 14.5 | 72 | ヨーロッパ |
そして、これがMLアルゴリズムで使用するための数値形式に変換されたものです。そのデータをこちらからダウンロードし、ドライブに保存するか、Hadoopに配置してください。
0 8 350 150 4699 14.5 74 0
0 8 400 170 4746 12 71 0
0 8 400 175 4385 12 72 0
0 6 250 72 3158 19.5 75 0
0 8 304 150 3892 12.5 72 0
0 8 350 145 4440 14 75 0
0 6 250 105 3897 18.5 75 0
0 6 163 133 3410 15.8 78 1
0 8 260 110 4060 19 77 0
1 4 97 75 2171 16 75 2
1 4 97 78 1940 14.5 77 1
1 4 98 83 2219 16.5 74 1
2 4 79 70 2074 19.5 71 1
2 4 91 68 1970 17.6 82 2
2 4 89 71 1925 14 79 1
2 4 83 61 2003 19 74 2
Scalaコード
spark-shellを実行するか、Zeppelinノートブックを作成し、以下のコードを貼り付けます。
結果:
import org.apache.spark.mllib.tree.DecisionTree
import org.apache.spark.mllib.tree.model.DecisionTreeModel
import org.apache.spark.mllib.util.MLUtils
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.feature.Normalizer
// read the data file and split it by spaces
val data = sc.textFile("/home/walker/mileage.txt").map( l => l.split("\\s+"))
// convert every string to doubles
var dbl = data.map (m => m.map(l => l.toDouble))
// Here we create a Dense Vector and LabeledPoint. A Dense Vector is a
// special kind of Vector than the scala regular Vector. So use Vectors, with an “s”
// at the end. The values must be doubles. A Dense Vector cannot handle
// blank values. If we had that those, we would use a Sparse Vector.
//
// The LabeledPoint is an object with the label and features. The label
// is 0, 1, 2 or gas mileage and the features are the weight, year, etc.
val parsedData = dbl.map { y =>
val c = Vectors.dense(y(1),y(2),y(3),y(4),y(5),y(6),y(7))
LabeledPoint(y(0), c)
}.cache()
// numClasses means number of classifications. In this case it is
// 0, 1, or 2
val numClasses = 3
// Here we say that the 6th feature is categorical with 3 possible values.
// It can be American, European, or Asian.
// The rest of the values are continuous, meaning just numbers and not discrete
// values.
val categoricalFeaturesInfo = Map(6 -> 3)
val impurity = "gini"
val maxDepth = 9
val maxBins = 7
// Now feed the data into the model.
val model = DecisionTree.trainClassifier(parsedData, numClasses, categoricalFeaturesInfo , impurity, maxDepth, maxBins)
// Print out the results
println("Learned classification tree model:\n" + model.toDebugString)
深さ5のDecisionTreeModel分類器で21ノードがあります。
ここでは、21ノード(下端点)があり、決定を下すための5レベルがあります。たとえば、特徴3(重量)が<= 2930の場合、特徴1(排気量など)を見て、0、1、2の予測を導き出さなければなりません。
If (feature 3 <= 2930.0)
If (feature 1 <= 91.0)
Predict: 2.0
Else (feature 1 > 91.0)
If (feature 5 <= 81.0)
If (feature 2 <= 105.0)
Predict: 1.0
Else (feature 2 > 105.0)
If (feature 0 <= 4.0)
Predict: 0.0
Else (feature 0 > 4.0)
Predict: 1.0
Else (feature 5 > 81.0)
If (feature 2 <= 85.0)
Predict: 0.0
Else (feature 2 > 85.0)
Predict: 2.0
Else (feature 3 > 2930.0)
If (feature 3 <= 3193.0)
If (feature 2 <= 85.0)
Predict: 0.0
Else (feature 2 > 85.0)
If (feature 2 <= 105.0)
If (feature 0 <= 4.0)
Predict: 1.0
Else (feature 0 > 4.0)
Predict: 0.0
Else (feature 2 > 105.0)
Predict: 0.0
Else (feature 3 > 3193.0)
Predict: 0.0
このモデルを保存し、predict()メソッドを使用して特定の車両を渡して、どのような燃費になるかを予測します。
この種のモデルがロジスティック回帰と似ていることに気付いたかもしれません。しかし、データが多い場合は、決定木(いくつかのタイプがあります)を使用します。計算コストが低いため、より速く実行し、メモリを消費しません。
また、ペンシルベニア大学の講義では、matlab数学と統計プログラミングツールが使用されました。しかし、そのようなツールはビッグデータで機能しません。Apache Sparkのように、数百万の決定にスケールしません。
Apache Sparkガイド
- Apache Sparkの機械学習パイプライン: 入門
- Apache SparkによるSGD線形回帰の例
- スパーク決定木分類器
- ロジスティック回帰、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の立場、戦略、または意見を表すものではありません。