JavaRush /Java Blog /Random-JA /Java 開発者のための機械学習、パート 1

Java 開発者のための機械学習、パート 1

Random-JA グループに公開済み
機械学習アルゴリズムをセットアップし、Java を使用して最初の予測関数を開発します。 自動運転車、顔認識システム、音声アシスタントはすべて、機械学習テクノロジーとフレームワークを使用して開発されています。そして、これはまだ第一波にすぎません。今後 10 年間で、新世代の製品が世界を変革し、プログラム、製品、アプリケーションの開発に対する新しいアプローチが生まれます。 Java 開発者のための機械学習、パート 1 - 1テクノロジー企業が機械学習に多額の投資を始めている今、Java プログラマーはこの波に乗りたいと考えています。今日学んだことは、今後 5 年間使用できます。しかし、どこから始めればよいでしょうか? この記事はこの質問に答えることを目的としています。機械学習アルゴリズムの実装と準備に関する短いガイドに従うことで、機械学習の原理の第一印象を得ることができます。学習アルゴリズムの構造と、学習アルゴリズムのトレーニング、評価、および最高の予測精度を提供する関数の選択に使用できる機能について学習すると、JVM フレームワーク (Weka) を使用して次のことを行う方法を理解できるようになります。機械学習ソリューションを構築します。この記事では、教師あり機械学習に焦点を当てます。教師あり機械学習は、スマート アプリケーションの開発で最も一般的に使用される原理だからです。

機械学習と人工知能

機械学習は、人間の知能を模倣できる機械を作成することを目的とした人工知能の分野から進化しました。「機械学習」という用語はコンピューター サイエンスから生まれましたが、人工知能は新しい科学分野ではありません。チューリング テスト は、20 世紀初頭に数学者のアラン チューリングによって開発され、コンピューティング マシンに真の知能があるかどうかを判断するために設計された最初のテストの 1 つです。チューリング テストによると、コンピューターは、人間が機械と話していることに気づかずに人間になりすますことで、人間の知能の存在を証明します。
Java 開発者のための機械学習、パート 1 ~ 2
現在人気のある機械学習アプローチの多くは、数十年前のアイデアに基づいています。しかし、コンピューティング (および分散コンピューティング プラットフォーム) の過去 10 年間で、機械学習アルゴリズムを適用するのに十分な力がもたらされました。それらのほとんどは、膨大な量の行列乗算やその他の数学的計算を必要とします。20 年前には、そのような計算を可能にするコンピューティング技術は存在しませんでしたが、今ではそれが現実のものになりました。機械学習アルゴリズムにより、プログラムは人間の介入なしに品質向上プロセスを実行し、機能を拡張できます。機械学習を使用して開発されたプログラムは、独自のコードを独自に更新または拡張できます。

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

教師あり学習と教師なし学習は、機械学習への 2 つの最も一般的なアプローチです。どちらのオプションでも、関係を構築し、そこから学習するために、マシンに大量のデータ レコードを供給する必要があります。このように収集されたデータは通常「特徴ベクトル」と呼ばれます。たとえば、ある住宅建物があります。この場合、特徴ベクトルには、家の総面積、部屋の数、家が建てられた年などの特徴が含まれる場合があります。 教師あり学習 では、特徴ベクトルに関連する質問に答えるために機械学習アルゴリズムがトレーニングされます。アルゴリズムをトレーニングするには、一連の特徴ベクトルと関連するラベルが与えられます。関連するラベルは人 (教師) によって提供され、質問に対する正しい「答え」が含まれています。学習アルゴリズムは、特徴ベクトルと正しいラベルを分析して、内部構造とそれらの間の関係を見つけます。このようにして、マシンは質問に正しく答えることを学習します。例として、不動産取引のための特定のインテリジェント アプリケーションを考えてみましょう。一連の住宅のサイズ、部屋数、建築年などの特徴ベクトルを使用してトレーニングできます。これらの要素に基づいて、各住宅に家の正しい価格を示すラベルを割り当てる必要があります。このデータを分析することで、スマート アプリケーションは、「この家にいくらのお金が得られるか?」という質問に答えるように自らを訓練する必要があります。
Java について興味がありますか? Java 開発者グループに参加してください。
準備プロセスが完了すると、新しい入力データはマークされなくなります。マシンは、未知のラベルのない特徴ベクトルに対しても、質問に正しく答えることができなければなりません。教師なし学習では、アルゴリズムは人間によるラベル付けなしで (または質問なしでも) 答えを予測するように設計されています。教師なし学習アルゴリズムは、ラベルや結果を決定するのではなく、大規模なデータセットと計算能力を使用して、これまで知られていなかった関係を発見します。たとえば、消費者製品のマーケティングでは、教師なし学習を使用して顧客の隠れた関係やグループを特定することができ、最終的にはマーケティング プログラムの改善や新しいプログラムの作成に役立ちます。この記事では、教師あり機械学習に焦点を当てます。これは現在最も一般的に使用されているアプローチです。

教師あり機械学習

すべての機械学習はデータに基づいています。教師あり機械学習プロジェクトの場合、質問に対して意味のある答えが得られるように、データをマーカーでマークする必要があります。以下の表-1 では、各住宅情報レコードには「住宅価格」というラベルが付けられています。記録データと住宅価格の関係を特定することで、アルゴリズムは最終的に、指定されたリストに含まれていない住宅の市場価格を予測できるようになります。(家の面積は平方メートルで表示され、家の価格はユーロで表示されることに注意してください)。
表 1. 住宅のリスト
サイン サイン サイン ラベル
住居面積 室数 家の築年数 予想住宅価格
90 平方メートル / 295 フィート 2部屋 23才 249,000ユーロ
101平方メートル/331フィート 3部屋 該当なし 338,000ユーロ
1330 平方メートル / 4363 フィート 11室 12年間 6,500,000ユーロ
初期段階では、データに手動でラベルを付けることになるでしょうが、最終的にはプログラムにそれを独自に行うように教えることになります。おそらく、このアプローチが電子メール クライアントで機能するのをすでに見たことがあるでしょう。電子メールをスパム フォルダーに移動するには、「この電子メールはスパムですか?」という質問に答える必要があります。返信すると、見たくないメールを認識するようにプログラムがトレーニングされます。アプリケーションのスパム フィルターは、同じソースからのメッセージ、または同じコンテンツを含むメッセージにマークを付け、適切なルールに従ってメッセージを管理するようにトレーニングされています。ラベル付きデータセットは、準備とテストの目的でのみ必要です。このステップが完了すると、機械学習アルゴリズムがラベルのないデータに対して機能します。たとえば、予測アルゴリズムに、住宅に関するラベルのない新しいデータ記録を入力すると、準備データから得られた「知識」に基づいて、住宅の予想価格が自動的に予測されます。

機械が予測を学習する仕組み

教師あり機械学習の課題は、特定の質問に対して適切な予測関数を見つけることです。х数学的に難しいのは、変数を入力として受け取り、予測値を返す関数を見つけることですу。仮説のこの機能は、(hθ)準備プロセスの結果です。多くの場合、仮説関数は目的関数または予測関数とも呼ばれます。
y = h θ (x)
ほとんどの場合、хこれはデータ配列です。この例では、これは家を定義する要素の 2 次元配列であり、部屋の数と家の面積で構成されます。このような値の配列が特徴ベクトルです。特定の目的関数を指定することにより、それを使用して各特徴ベクトルを予測できますх。家の価格を予測するには、{101.0, 3.0}家の面積と部屋の数で構成される特徴ベクトルを使用して目的関数を呼び出す必要があります。
// целевая функция h (результат процесса обучения)
Function<Double[], Double> h = ...;

// определяем целевой вектор с площадью дома=101 и количеством комнат=3
Double[] x = new Double[] { 101.0, 3.0 };

// и предсказываем цену дома (метка)
double y = h.apply(x);
例-1 のソース コードでは、配列内の値はх住宅フィーチャのベクトルを表します。目的関数によって返される値はу、住宅の予測価格です。機械学習の目標は、未知の入力パラメーターが与えられた場合に、できるだけ正確に機能する目的関数を決定することです。機械学習では、目的関数は(hθ)モデルと呼ばれることもあります。このモデルは学習プロセスの結果です。
Java 開発者のための機械学習、パート 1 ~ 3
ラベル付けされたトレーニング サンプルに基づいて、学習アルゴリズムはトレーニング データ内の構造またはパターンを検索します。そこで彼は、一般的にデータに適したモデルを構築しました。原則として、学習プロセスは本質的に探索的なものです。ほとんどの場合、このプロセスは、さまざまな学習アルゴリズムと構成を使用して何度も繰り返されます。その結果、すべてのモデルがパフォーマンス指標に基づいて評価され、その中から最良のモデルが選択されます。そして、このモデルは、将来のタグなしデータの推定値を計算するために使用されます。

線形回帰

機械に「考える」ことを教えるには、まず使用する学習アルゴリズムを選択する必要があります。たとえば、線形回帰です。これは、最も単純で最も人気のある教師あり機械学習アルゴリズムの 1 つです。このアルゴリズムは、入力フィーチャと結果マーカー間の関係が線形であることを前提としています。以下の一般的な線形回帰関数は、特徴ベクトルのすべての要素を合計し、パラメーターθ (θ)を乗算することによって予測値を返します。このパラメーターは、トレーニング データに基づいて回帰関数を適応または「調整」するためにトレーニング プロセス中に使用されます。
h θ (x) = θ 0 * 1 + θ 1 * x 1 + ... θ n * x n
線形回帰関数では、シータ パラメータと特徴パラメータに下付き文字が付けられます。添字は、ベクトル内のパラメーター(θ)と特徴パラメーターの位置を決定します。(х)x 0特徴は定数シフト項であり、1計算目的で重要であることに注意してください。その結果、家の面積などの重要なパラメータのインデックスは x 1から始まります。したがって、x 1に特徴ベクトルの最初の値 (家の面積) が割り当てられている場合、x 2は次の値 (部屋の数) を受け取ります。例 2 は、数学的に h θ (x)と表される線形回帰関数の Java 実装を示しています。簡単にするために、計算は を使用して実行されますdouble。メソッドではapply()、配列の最初の要素が 1.0 に等しく、この関数の外部で設定されることが指定されています。 例 2: Java での線形回帰
public class LinearRegressionFunction implements Function<Double[], Double> {
 private final double[] thetaVector;

 LinearRegressionFunction(double[] thetaVector) {
 this.thetaVector = Arrays.copyOf(thetaVector, thetaVector.length);
 }

 public Double apply(Double[] featureVector) {
 // с целью упрощения вычислений первый элемент должен быть equals 1.0
 assert featureVector[0] == 1.0;

 // простое последовательное сложение
 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);
 }
}
新しいインスタンスを作成するにはLinearRegressionFunction、パラメータを指定する必要がありますθ。このパラメーターまたはベクトルは、一般的な線形回帰関数を基礎となるトレーニング データに適合させるために使用されます。θプログラムで使用されるパラメーターは、トレーニング例に基づいてトレーニング プロセス中に調整されます。トレーニングされたターゲット関数の品質は、トレーニング用に準備されたデータの品質に依存します。以下の例では、LinearRegressionFunction家のサイズに基づいた価格予測を使用して説明します。x 0が値 1.0 の定数でなければならないことを考慮すると、目的関数はθ学習プロセスの結果である 2 つのパラメーターを使用して初期化されます。新しい例を作成すると、面積 1330 平方メートルの住宅の価格は以下のように予測されます。
// тета вектор, используемый в этом примере, является результатом процесса обучения
double[] thetaVector = new double[] { 1.004579, 5.286822 };
LinearRegressionFunction targetFunction = new LinearRegressionFunction(thetaVector);

// создание вектора признаков со значениями x0=1 (для удобства вычислений) и //x1=площадь дома
Double[] featureVector = new Double[] { 1.0, 1330.0 };

// выполняем расчеты
double predictedPrice = targetFunction.apply(featureVector);
下の図では、予測目的関数のグラフ (青い線) を確認できます。これは、家の面積のすべての値の目的関数を計算することによって得られます。チャートには、トレーニングに使用される価格エリアのペアも含まれています。
Java 開発者のための機械学習、パート 1 ~ 4
今のところ、予測チャートはかなり良いようです。グラフの座標 (位置と傾き) はベクトルによって決まりますθ { 1.004579, 5.286822 }θしかし、どのベクトルがアプリケーションに最適であるかをどのように判断できるのでしょうか? 最初のパラメータ、あるいは 2 番目のパラメータを変更すると、関数の適合性が向上しますか? 最適なシータ ベクトルを決定するには、目的関数がどの程度適切に機能するかを評価するユーティリティ関数が必要です。 TO BE CONTINUED英語からの 翻訳。著者: Gregor Roth、JavaWorld ソフトウェア アーキテクト。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION