Main Content

ワインの分類

この例では、パターン認識ニューラル ネットワークを使用して、ワイナリーで生産されたワインを化学特性に基づいて分類する方法を説明します。

問題: ワインの分類

この例では、次の 13 の属性によって、3 つのワイナリーで生産されたワインを分類できるニューラル ネットワークの構築を試みます。

  • アルコール

  • リンゴ酸

  • 灰分

  • 灰分のアルカリ度

  • マグネシウム

  • 全フェノール含量

  • フラボノイド

  • 非フラボノイド フェノール

  • プロアントシアニジン

  • 色の強度

  • 色相

  • 希釈ワインの OD280/OD315

  • プロリン

これは、入力がさまざまなクラスに関連付けられているパターン認識問題の例です。既知のワインを適切に分類するだけでなく、解の設計に使用されなかったワインも正確に分類するように汎化できるニューラル ネットワークを作成します。

ニューラル ネットワークを使用する理由

ニューラル ネットワークは、パターン認識問題に非常に適しています。十分な要素 (ニューロンと呼ばれる) が含まれるニューラル ネットワークは、任意のデータを任意の精度で分類できます。特に、多変数の複雑な判定境界問題には非常に適しています。そのため、ニューラル ネットワークはワインの分類問題を解くことのできる適切な候補であると言えます。

13 の近傍属性がニューラル ネットワークへの入力となり、それぞれのターゲットは、関連付けられるワイナリー #1、#2、または #3 に対応する位置が 1 である、3 要素のクラス ベクトルになります。

ネットワークは、正しいターゲット クラスの生成を学習するよう、近傍の属性を使用して設計されます。

データの準備

入力行列 X とターゲット行列 Y の 2 つの行列にデータを整理することによって、ニューラル ネットワークに分類問題用のデータを設定します。

入力行列の i 番目の列にはそれぞれ、ワイナリーが既知であるワインを表す 13 の要素が含まれます。

ターゲット行列の対応する各列には 3 つの要素が含まれ、これらの要素は 2 つの 0 と、関連付けられるワイナリーの場所に対応する 1 つの 1 で構成されます。

ここで、このようなデータセットが読み込まれます。

[x,t] = wine_dataset;

入力 X およびターゲット T のサイズを表示できます。

X と T の両方に 178 の列があることに注意してください。これらは 178 のワインのサンプル属性 (入力) および関連付けられるワイナリーのクラス ベクトル (ターゲット) を表します。

入力行列 X には、13 の属性に対する 13 の行があります。それぞれの例に候補として 3 つのワイナリーがあるため、ターゲット行列 T には 3 つの行があります。

size(x)
ans = 1×2

    13   178

size(t)
ans = 1×2

     3   178

ニューラル ネットワークによるパターン認識

次の手順では、ワインの分類を学習するニューラル ネットワークを作成します。

ニューラル ネットワークはランダムな初期重みで開始するため、この例で得られる結果は実行するたびに多少異なります。

2 層 (1 つの隠れ層) のフィードフォワード ニューラル ネットワークは、隠れ層に十分なニューロンがある場合、任意の入出力関係を学習できます。出力層ではない層は、隠れ層と呼ばれます。

この例では、10 個のニューロンがある 1 つの隠れ層を試します。一般的に、難しい問題ほど多くのニューロンが、そしておそらくは多くの層が必要になります。簡単な問題では、必要なニューロンが少なくなります。

ネットワークはまだ入力データとターゲット データに一致するように構成されていないため、入力と出力のサイズは 0 です。ネットワークの学習時にはこのようになります。

net = patternnet(10);
view(net)

これでネットワークの学習の準備が整いました。サンプルが学習セット、検証セット、およびテスト セットに自動的に分割されます。学習セットは、ネットワークに教えるために使用されます。検証セットに対してネットワークの改善が続いている限り、学習が続行されます。テスト セットを使用することで、ネットワークの精度を完全に独立して測定できます。

Neural Network Training Tool を使用すると、学習するネットワークと、学習に使用されているアルゴリズムが表示されます。さらに、学習中には学習の状態が表示され、学習を停止した条件が緑で強調表示されます。

下部にあるボタンを使用すると、便利なプロットを開くことができます。これらのプロットは、学習中および学習後に開くことができます。アルゴリズム名およびプロット ボタンの隣のリンクを使用すると、これらに関するドキュメンテーションを開くことができます。

[net,tr] = train(net,x,t);

学習中にネットワーク性能がどのように改善されているかを確認するには、学習ツールの [パフォーマンス] ボタンをクリックするか、PLOTPERFORM を呼び出します。

性能は、平均二乗誤差で測定され、対数スケールで表示されます。これは、ネットワークの学習が進むと急激に低下します。

性能は、学習セット、検証セット、およびテスト セットのそれぞれについて表示されます。

plotperform(tr)

ネットワークのテスト

学習済みニューラル ネットワークの平均二乗誤差をテスト サンプルについて測定できるようになりました。これにより、実際のデータに適用した場合にネットワークがどの程度一致しているかを把握できます。

ネットワーク出力は 0 ~ 1 の範囲になるため、関数 vec2ind を使用して、各出力ベクトルで最大の要素の位置としてクラス インデックスを取得できます。

testX = x(:,tr.testInd);
testT = t(:,tr.testInd);

testY = net(testX);
testIndices = vec2ind(testY)
testIndices = 1×27

     1     1     1     1     1     1     1     2     2     2     2     2     2     2     2     2     2     2     2     3     3     3     3     3     3     3     3

ニューラル ネットワークがどの程度データに当てはまるかを測定するもう 1 つの方法は、混同プロットです。ここで、すべてのサンプルに対して混同行列がプロットされます。

混同行列は、正しい分類と正しくない分類の比率を示します。正しい分類は、行列の対角部分の緑の正方形に表示されます。正しくない分類は、赤い正方形に表示されます。

ネットワークが適切な分類を学習した場合、赤い正方形の比率は非常に小さくなり、誤分類がほとんどないことを示します。

そうなっていない場合は、追加学習を行うか、隠れニューロンを増やしてネットワークの学習を行うことをお勧めします。

plotconfusion(testT,testY)

正しい分類と正しくない分類の全体的な比率を次に示します。

[c,cm] = confusion(testT,testY)
c = 0
cm = 3×3

     7     0     0
     0    12     0
     0     0     8

fprintf('Percentage Correct Classification   : %f%%\n', 100*(1-c));
Percentage Correct Classification   : 100.000000%
fprintf('Percentage Incorrect Classification : %f%%\n', 100*c);
Percentage Incorrect Classification : 0.000000%

ニューラル ネットワークがどの程度データに当てはまるかを測定する 3 つ目の方法は、受信者動作特性プロットです。これは、出力のしきい値が 0 ~ 1 の範囲で変化する場合に偽陽性率と真陽性率にどのような関連があるかを示します。

線が左上にあればあるほど、高い真陽性率を得るために受け入れる必要がある偽陽性の数が減少します。最適な分類器とは、線が左下隅から左上隅、右上隅、またはその近くに向かって伸びている分類器です。

plotroc(testT,testY)

この例では、それぞれのワインの特性からワインを 3 つのワイナリーに分類するニューラル ネットワークを設計する方法を説明しました。

ニューラル ネットワークとそのアプリケーションの詳細は、他の例およびドキュメンテーションを参照してください。