スパーク決定木分類器

スパーク決定木分類器

  • 人工知能(AI)
6分で読めます 更新日 Jun 22, 2017

ポイント: 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のように、数百万の決定にスケールしません。

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

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

The Briefを購読する

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

ありがとう

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