Java開発者向けの機械学習、パート1:機械学習のアルゴリズム

自動運転車、顔検出ソフトウェア、音声制御スピーカーはすべて、機械学習テクノロジーとフレームワークに基づいて構築されています。これらは最初の波にすぎません。次の10年間で、新世代の製品が私たちの世界を変革し、ソフトウェア開発と、私たちが作成および使用するアプリケーションと製品への新しいアプローチを開始します。

Java開発者として、特にテクノロジー企業が機械学習に真剣に投資し始めているため、この曲線を先取りしたいと考えています。今日学んだことは、今後5年間で積み重ねることができますが、どこかから始めなければなりません。

この記事はあなたが始めるのに役立ちます。機械学習がどのように機能するかについての第一印象から始め、次に機械学習アルゴリズムの実装とトレーニングの簡単なガイドを示します。学習アルゴリズムの内部と、最適な予測関数のトレーニング、スコアリング、選択に使用できる機能を学習した後、JVMフレームワークであるWekaを使用して機械学習ソリューションを構築する方法の概要を説明します。この記事では、インテリジェントアプリケーションを開発するための最も一般的なアプローチである教師あり機械学習に焦点を当てています。

Java開発者向けの機械学習、パート2

次のステップの準備はできていますか?このチュートリアルの後半では、機械学習データパイプラインを開発してデプロイする方法を示します。

機械学習と人工知能

機械学習は、人間の知能を模倣できる機械の製造を目指す人工知能の分野から進化しました。機械学習はコンピュータサイエンスの新しいトレンドですが、人工知能は新しい科学分野ではありません。 1950年代初頭にアランチューリングによって開発されたチューリングテストは、コンピューターが実際の知能を持つことができるかどうかを判断するために作成された最初のテストの1つでした。チューリングテストによると、コンピューターは人間をだましてそれも人間であると信じさせることで人間の知性を証明することができます。

多くの最先端の機械学習アプローチは、数十年前の概念に基づいています。過去10年間で変わったことは、コンピューター(および分散コンピューティングプラットフォーム)が機械学習アルゴリズムに必要な処理能力を備えていることです。ほとんどの機械学習アルゴリズムでは、処理するために膨大な数の行列乗算やその他の数学演算が必要です。これらの計算を管理するための計算技術は、20年前でも存在していませんでしたが、今日では存在しています。

機械学習により、プログラムは人間の関与なしに品質改善プロセスを実行し、その機能を拡張できます。機械学習で構築されたプログラムは、独自のコードを更新または拡張することができます。

教師あり学習と教師なし学習

教師あり学習と教師なし学習は、機械学習への最も一般的なアプローチです。どちらも、相互に関連付けて学習するために、マシンに大量のデータレコードを供給する必要があります。このような収集されたデータレコードは、一般に特徴ベクトルとして知られています。個々の家の場合、特徴ベクトルは、家全体のサイズ、部屋の数、家の年齢などの特徴で構成される場合があります。

では教師あり学習、機械学習アルゴリズムは、特徴ベクトルに関連する質問に正しく応答するように訓練されています。アルゴリズムをトレーニングするために、マシンには特徴ベクトルのセットと関連するラベルが供給されます。ラベルは通常、人間の注釈者によって提供され、特定の質問に対する正しい「回答」を表します。学習アルゴリズムは、特徴ベクトルとその正しいラベルを分析して、内部構造とそれらの間の関係を見つけます。したがって、マシンはクエリに正しく応答することを学習します。

例として、インテリジェントな不動産アプリケーションは、さまざまな家のサイズ、部屋の数、それぞれの年齢などの特徴ベクトルを使用してトレーニングされる場合があります。人間のラベラーは、これらの要因に基づいて正しい住宅価格で各家にラベルを付けます。そのデータを分析することにより、不動産アプリケーションは、「この家のためにいくらのお金を得ることができるか」という質問に答えるように訓練されます

トレーニングプロセスが終了した後、新しい入力データにはラベルが付けられません。マシンは、見えない、ラベルのない特徴ベクトルに対しても、クエリに正しく応答することができます。

では教師なし学習、アルゴリズムは、人間のラベル付け、さらには質問せずに答えを予測するようにプログラムされています。教師なし学習では、ラベルや結果を事前に決定するのではなく、膨大なデータセットと処理能力を利用して、これまで知られていなかった相関関係を発見します。たとえば、消費財マーケティングでは、教師なし学習を使用して、隠れた関係や消費者グループを特定し、最終的には新しいまたは改善されたマーケティング戦略につながる可能性があります。

この記事では、今日の機械学習への最も一般的なアプローチである教師あり機械学習に焦点を当てています。

教師あり機械学習

すべての機械学習はデータに基づいています。教師あり機械学習プロジェクトの場合、求めている結果に対して意味のある方法でデータにラベルを付ける必要があります。表1では、住宅レコードの各行に「住宅価格」のラベルが含まれていることに注意してください。行データを住宅価格ラベルに関連付けることにより、アルゴリズムは最終的に、データセットにない住宅の市場価格を予測できるようになります(住宅のサイズは平方​​メートルに基づいており、住宅の価格はユーロに基づいていることに注意してください)。

表1.家の記録

特徴 特徴 特徴 ラベル
家の大きさ 室数 家の年齢 家の推定費用
90 m2 / 295フィート 2部屋 23年 249,000€
101 m2 / 331フィート 3部屋 該当なし 338,000€
1330 m2 / 4363フィート 11室 12年間 6,500,000€

初期の段階では、データレコードに手動でラベルを付ける可能性がありますが、最終的には、このプロセスを自動化するようにプログラムをトレーニングすることができます。これはおそらく電子メールアプリケーションで見たことがあるでしょう。電子メールをスパムフォルダに移動すると、「これはスパムですか?」というクエリが表示されます。あなたが応答するとき、あなたはあなたが見たくないメールを認識するようにプログラムを訓練しています。アプリケーションのスパムフィルターは、同じソースからの、または同様のコンテンツを含む将来のメールにラベルを付け、それを破棄することを学習します。

ラベル付きデータセットは、トレーニングとテストの目的でのみ必要です。このフェーズが終了すると、機械学習アルゴリズムはラベルのないデータインスタンスで機能します。たとえば、予測アルゴリズムに新しいラベルのない住宅レコードをフィードすると、トレーニングデータに基づいて予想住宅価格が自動的に予測されます。

機械が予測を学習する方法

教師あり機械学習の課題は、特定の質問に対する適切な予測関数を見つけることです。数学的には、入力変数xを受け取り、予測値yを返す入出力関数を見つけることが課題です。この仮説関数)は、トレーニングプロセスの出力です。多くの場合、仮説関数はターゲット関数または予測関数とも呼ばれます。

グレガー・ロス

In most cases, x represents a multiple-data point. In our example, this could be a two-dimensional data point of an individual house defined by the house-size value and the number-of-rooms value. The array of these values is referred to as the feature vector. Given a concrete target function, the function can be used to make a prediction for each feature vector x. To predict the price of an individual house, you could call the target function by using the feature vector { 101.0, 3.0 } containing the house size and the number of rooms:

 // target function h (which is the output of the learn process) Function h = ...; // set the feature vector with house size=101 and number-of-rooms=3 Double[] x = new Double[] { 101.0, 3.0 }; // and predicted the house price (label) double y = h.apply(x); 

リスト1では、配列変数x値は家の特徴ベクトルを表しています。Yの目標関数によって返される値は、予測された住宅の価格です。

機械学習の課題は、未知の見えないデータインスタンスに対して可能な限り正確に機能するターゲット関数を定義することです。機械学習では、ターゲット関数()はモデルと呼ばれることもあります。このモデルは、学習プロセスの結果です。

グレガー・ロス

ラベル付けされたトレーニング例に基づいて、学習アルゴリズムはトレーニングデータ内の構造またはパターンを探します。これらから、そのデータから十分に一般化するモデルを生成します。

Typically, the learning process is explorative. In most cases, the process will be performed multiple times by using different variations of learning algorithms and configurations.

Eventually, all the models will be evaluated based on performance metrics, and the best one will be selected. That model will then be used to compute predictions for future unlabeled data instances.

Linear regression

考える機械を訓練するための最初のステップは、使用する学習アルゴリズムを選択することです。線形回帰は、最も単純で最も人気のある教師あり学習アルゴリズムの1つです。このアルゴリズムは、入力特徴と出力ラベルの間の関係が線形であることを前提としています。以下の一般的な線形回帰関数は、特徴ベクトルの各要素にシータパラメーター(θ)を掛けて要約することにより、予測値を返します。シータパラメータは、トレーニングデータに基づいて回帰関数を適応または「調整」するために、トレーニングプロセス内で使用されます。

グレガー・ロス

In the linear regression function, theta parameters and feature parameters are enumerated by a subscription number. The subscription number indicates the position of theta parameters (θ) and feature parameters (x) within the vector. Note that feature x0 is a constant offset term set with the value 1 for computational purposes. As a result, the index of a domain-specific feature such as house-size will start with x1. As an example, if x1 is set for the first value of the House feature vector, house size, then x2 will be set for the next value, number-of-rooms, and so forth.

Listing 2 shows a Java implementation of this linear regression function, shown mathematically as hθ(x). For simplicity, the calculation is done using the data type double. Within the apply() method, it is expected that the first element of the array has been set with a value of 1.0 outside of this function.

Listing 2. Linear regression in Java

 public class LinearRegressionFunction implements Function { private final double[] thetaVector; LinearRegressionFunction(double[] thetaVector) { this.thetaVector = Arrays.copyOf(thetaVector, thetaVector.length); } public Double apply(Double[] featureVector) { // for computational reasons the first element has to be 1.0 assert featureVector[0] == 1.0; // simple, sequential implementation double prediction = 0; for (int j = 0; j < thetaVector.length; j++) { prediction += thetaVector[j] * featureVector[j]; } return prediction; } public double[] getThetas() { return Arrays.copyOf(thetaVector, thetaVector.length); } } 

In order to create a new instance of the LinearRegressionFunction, you must set the theta parameter. The theta parameter, or vector, is used to adapt the generic regression function to the underlying training data. The program's theta parameters will be tuned during the learning process, based on training examples. The quality of the trained target function can only be as good as the quality of the given training data.

以下の例では、LinearRegressionFunctionがインスタンス化され、家のサイズに基づいて住宅価格が予測されます。x 0は1.0の定数値でなければならないことを考慮して、ターゲット関数は2つのシータパラメーターを使用してインスタンス化されます。シータパラメータは、学習プロセスの出力です。新しいインスタンスを作成した後、1330平方メートルのサイズの家の価格は次のように予測されます。

 // the theta vector used here was output of a train process double[] thetaVector = new double[] { 1.004579, 5.286822 }; LinearRegressionFunction targetFunction = new LinearRegressionFunction(thetaVector); // create the feature vector function with x0=1 (for computational reasons) and x1=house-size Double[] featureVector = new Double[] { 1.0, 1330.0 }; // make the prediction double predictedPrice = targetFunction.apply(featureVector); 

下のグラフでは、ターゲット関数の予測線が青い線で示されています。この線は、すべての家のサイズの値に対してターゲット関数を実行することによって計算されています。チャートには、トレーニングに使用される価格とサイズのペアも含まれています。

グレガー・ロス

これまでのところ、予測グラフは十分に適合しているようです。グラフの座標(切片と傾き)は、シータベクトルによって定義され{ 1.004579, 5.286822 }ます。しかし、このシータベクトルがアプリケーションに最適であることをどのように知っていますか?1番目または2番目のシータパラメーターを変更した場合、関数はより適切に適合しますか?最適なシータパラメータベクトルを特定するには、ターゲット関数のパフォーマンスを評価するユーティリティ関数が必要です。

ターゲット関数のスコアリング

機械学習では、コスト関数(J(θ))を使用して、特定のターゲット関数の平均誤差または「コスト」を計算します。

グレガー・ロス