自然言語処理の実践: 機械学習によく使われるツールとテクニック

自然言語処理の実践: 機械学習によく使われるツールとテクニック

多くの自然言語処理には機械学習が関係しているため、機械学習の基本的なツールとテクニックを理解しておくと役立ちます。これらのツールの一部は前の章で説明されており、一部はまだ説明されていませんが、ここではすべてについて説明します。

D.1 データの選択とバイアスの回避

データの選択と特徴エンジニアリングには、(人間の観点から見た)バイアスのリスクが伴います。特定の機能セットを選択して独自のバイアスをアルゴリズムに組み込むと、モデルはそれらのバイアスに適応し、偏った結果を生成します。幸運にも生産に入る前にこのバイアスを発見できたとしても、それを排除するには多大な労力がかかります。たとえば、トークナイザーの新しい語彙を最大限に活用するには、パイプライン全体を再構築して再トレーニングする必要があります。最初からやり直さなければなりません。

一例としては、有名な Word2vec モデルのデータと特徴の選択が挙げられます。 Word2vec は大規模なニュース記事のコーパスでトレーニングされており、このモデルの語彙 (特徴) としてこのコーパスから約 100 万のnグラムが選択されました。このモデルはデータ サイエンティストや言語学者を興奮させ、「王 − 男 + 女 = 女王」などの単語ベクトルに対して数学的演算を実行できるようになりました。しかし、研究が進むにつれて、モデルにはさらに問題のある関係が浮かび上がってきました。

たとえば、「医者 − 父 + 母 = 看護師」という表現の場合、「看護師」という答えは、期待されるような偏りのない論理的な結果ではありません。性別による偏見がモデルに意図せず組み込まれてしまいます。同様の人種的、宗教的、さらには地理的な偏見が、元の Word2vec モデルにも広く見られます。 Google の研究者は、これらのバイアスを作り出すつもりはなかった。バイアスはデータ、つまり Word2vec のトレーニングに使用した Google ニュース コーパスの単語使用統計に存在していたのだ。

多くのニュース記事は、読者を楽しませるためにジャーナリストが書いているというだけの理由で、文化的に偏っています。これらのジャーナリストは、制度的な偏見と、現実の人々が出来事に取り組む際に用いる偏見によって特徴づけられる世界を描写しています。 Google ニュースの単語使用統計は、単に母親が医師よりも看護師である割合が高く、父親が看護師よりも医師である割合が高いことを反映しているだけです。 Word2vec モデルは、私たちが作り出した世界への窓を提供するだけです。

幸いなことに、Word2vec のようなモデルではラベル付けされたトレーニング データは必要ありません。したがって、モデルをトレーニングするために任意のテキストを自由に選択できます。モデルに期待する信念や推論をより適切に表す、よりバランスの取れたデータセットを選択できます。他の人たちがアルゴリズムの陰に隠れて、ただモデルに従っているだけだと言う一方で、私たちは、すべての人に平等な機会を提供することを目指す社会をより公平に表す独自のデータセットを彼らと共有することができます。

モデルをトレーニングおよびテストする際、私たちは生来の公平感覚に頼って、モデルがユーザーの生活に影響を与える予測を行うタイミングを判断することができます。結果として得られるモデルがすべてのユーザーを私たちが望む通りに扱うなら、私たちは安心して眠ることができます。また、他のユーザーとは異なるユーザー、特に社会的に恵まれないユーザーのニーズに細心の注意を払うことにも役立ちます。自分の行動をより正式に正当化する必要がある場合は、統計、哲学、倫理、心理学、行動経済学、人類学についてさらに学び、この本で学ぶコンピューター サイエンスのスキルを強化することもできます。

自然言語処理の専門家および機械学習エンジニアとして、機械が人間よりも優れたパフォーマンスを発揮できるようにトレーニングする機会があります。上司や同僚がトレーニング セットにどのテキストを追加または削除するかを指示することはありません。あなたには、コミュニティや社会全体を形作る機械の動作に影響を与える力があります。

偏りが少なく、より公平なデータセットを組み立てる方法について、いくつかのアイデアを提供しました。ここでは、結果として得られたモデルを偏りのないデータに適合させて、現実世界で正確かつ有用なものにする方法を説明します。

D.2 モデルの適合

すべての機械学習モデルにとっての大きな課題は、モデルの優れたパフォーマンスを克服することです。 「過剰優秀」とは何でしょうか?すべてのモデルでサンプル データを使用する場合、特定のアルゴリズムは特定のデータセット内のパターンを見つける際に優れたパフォーマンスを発揮します。しかし、トレーニング セット内の特定の例のラベルはすでにわかっているため (ラベルがわからない場合はトレーニング セットに含まれません)、上記のトレーニング例に対するアルゴリズムの予測は特に役に立ちません。私たちの本当の目標は、これらのトレーニング サンプルを使用して、新しいサンプルに正しくラベルを付けることのできる一般化機能を備えたモデルを構築することです。このサンプルはトレーニング セット内のサンプルに似ていますが、トレーニング セット外のサンプルです。トレーニング セット外の新しいサンプルの予測パフォーマンスを最適化したいと考えています。

トレーニング例を完全に記述 (および予測) するモデルを「オーバーフィット」と呼びます (図 D-1 を参照)。このようなモデルでは、新しいデータを記述する能力がほとんどないか、まったくありません。これは汎用モデルではなく、トレーニング セットに含まれていないサンプルが与えられた場合にうまく機能するかどうかを信頼するのは困難です。

図D-1 トレーニングサンプルにおける過剰適合現象

逆に、モデルがトレーニング例に対して多くの誤った予測を行い、新しい例に対してもパフォーマンスが低い場合は、「適合不足」であると言われます (図 D-2 を参照)。現実の世界では、どちらのモデルも予測にはあまり役立ちません。それでは、上で述べた 2 種類のフィッティングの問題を検出できるいくつかの手法を見てみましょう。さらに重要なことに、それらを回避する方法もいくつか紹介します。

図D-2 トレーニングサンプルのアンダーフィッティング現象

D.3 データセットの分割

機械学習の実践では、データが金だとすると、ラベル付けされたデータはラリチタン(特定のゲームにおける貴重なリソース)です。私たちの最初の本能は、ラベル付けされたデータを取得して、それをすべてモデルに渡すことかもしれません。トレーニングデータが増えると、より回復力のあるモデルが生まれますよね?しかし、これでは、現実世界で良い結果が得られることを期待する以外に、モデルをテストする方法が残っていません。これは明らかに非現実的です。解決策は、ラベル付けされたデータを 2 つ、または場合によっては 3 つのデータセット (トレーニング セット、検証セット、場合によってはテスト セット) に分割することです。

トレーニング セットは明らかです。トレーニング ラウンド中、検証セットはモデルから隠されたラベル付きデータの小さなセットです。検証セットで良好なパフォーマンスを得ることは、トレーニング セット外の新しいデータでトレーニング済みモデルが適切に機能することを確認するための最初のステップです。多くの場合、特定の注釈付きデータセットは、トレーニング/検証比率が 80%/20% または 70%/30% に分割されます。テスト セットは検証セットに似ており、モデルのテストとパフォーマンスの測定に使用されるラベル付きトレーニング データのサブセットでもあります。しかし、このテスト セットは検証セットとどう違うのでしょうか?構成の点では、実際には違いはありません。違いは使用方法にあります。

トレーニング セットでモデルをトレーニングする場合、複数の反復処理が行われ、反復処理中に異なるハイパーパラメータが発生します。最終的に選択するモデルは、検証セットで最高のパフォーマンスを発揮するモデルになります。しかし、ここで疑問が生じます。検証セットにのみ高度に適合したモデルを最適化していないことをどうやって確認するのでしょうか?モデルが他のデータでも適切に機能するかどうかを確認する方法はありません。これが私たちの上司や論文の読者が最も興味を持っていることです。つまり、モデルが彼らのデータに対してどの程度うまく機能するかということです。

したがって、十分なデータがある場合は、ラベル付きデータセットの 3 番目の部分をテスト セットとして使用する必要があります。これにより、読者 (または上司) は、トレーニングおよびチューニングのプロセス中に、モデルがこれまで見たことのないデータに対しても適切に機能するという自信を深めることができます。検証セットのパフォーマンスに基づいてトレーニング済みモデルが選択され、そのモデルに対してそれ以上のトレーニングやチューニングが行われていない場合は、テスト セット内の各サンプルに対して予測 (推論) を行うことができます。モデルがデータの 3 番目の部分で適切に機能する場合、そのモデルは優れた一般化特性を備えています。このような信頼性の高いモデル検証を実現するために、データセットを 60%/20%/20% のトレーニング/検証/テスト比率で分割することがよくあります。

ヒント: データセットをトレーニング セット、検証セット、テスト セットに分割する前に、データセットの順序を変更することが非常に重要です。データの各サブセットが「現実世界」を代表するものとなるようにしたいので、各ラベルの比率は予想されるものとほぼ同じである必要があります。トレーニング セットに 25% の正のサンプルと 75% の負のサンプルが含まれている場合、テスト セットと検証セットにも 25% の正のサンプルと 75% の負のサンプルが含まれていることが期待されます。元のデータセットの前に負の例があり、データが 50%/50% のトレーニング/テスト セットに分割される前にシャッフルされていない場合、トレーニング セットには 100% の負の例が含まれ、テスト セットには 50% の負の例が含まれます。この場合、モデルはデータセット内の正の例から学習することはできません。

D.4 クロスフィットトレーニング

トレーニング セット/テスト セットを分割する別の方法は、クロス検証またはk分割クロス検証です (図 D-3 を参照)。クロス検証の背後にある概念は、先ほど説明したデータ分割と非常に似ていますが、ラベル付けされたデータセット全体をトレーニングに使用できるようになります。このプロセスでは、トレーニング セットをk 個の等しい部分、つまりk 個のフォールドに分割します。次に、 k − 1 個のデータをトレーニング セットとして取り、 k番目のデータで検証することによってモデルをトレーニングします。そして、最初の試行でトレーニングに使用されたk −1個のデータのうちの1つが検証セットとして使用され、残りのk −1個のデータが再トレーニング用の新しいトレーニングセットになります。

図D-3 k分割交差検証

この手法は、モデルの構造を分析し、個々の検証データで適切に機能するハイパーパラメータを見つけるのに役立ちます。ハイパーパラメータを選択したら、最高のパフォーマンスを発揮するトレーニング済みモデルを選択する必要がありますが、これは前のセクションで説明したバイアスの影響を受けやすいため、このプロセス中はテスト セットを保持しておくことをお勧めします。

このアプローチは、モデルの信頼性に関するいくつかの新しい情報も提供します。入力特徴とモデルによって発見された出力予測との関係が統計的に有意であり、ランダム選択の結果ではない可能性を示すP値を計算できます。トレーニング セットが実際に現実世界の代表的なサンプルである場合、これは非常に重要な新しい情報になります。

モデルに対するこの追加の信頼性のコストは、 k分割交差検証のトレーニングにk倍の時間がかかることです。したがって、質問に対する回答の 90% を取得したい場合は、通常は 1 倍のクロス検証を実行するだけで済みます。この検証方法は、以前に実行したトレーニング セット/検証セットの分割方法とまったく同じです。私たちのモデルが現実世界のダイナミクスを信頼できる形で説明していると 100% 確信できるわけではありませんが、テスト セットで良好なパフォーマンスを示した場合、ターゲット変数を予測する上で有用なモデルであると確信できます。したがって、この実用的なアプローチを通じて得られた機械学習モデルは、ほとんどの商用アプリケーションにとって意味があります。

D.5 抑制モデル

model.fit() では、勾配降下法はモデル内の起こり得るエラーを減らすことに熱心になりすぎます。これにより、学習したモデルがトレーニング セットでは適切に機能するが、新しい未知の例のセット (テスト セット) では適切に機能しないという過剰適合が発生する可能性があります。したがって、モデルに対する制御を「保持」したい場合があります。これを行うには 3 つの方法があります。

  • 正規化;
  • ランダムドロップアウト。
  • バッチ正規化。

D.5.1 正規化

すべての機械学習モデルでは、最終的には過剰適合が発生します。幸いなことに、この問題を解決するのに役立つツールがいくつかあります。 1 つ目は正規化です。これは、各トレーニング ステップで学習したパラメータにペナルティを課すものです。通常は、パラメータ自体の要素ですが、常にそうとは限りません。その中で、L1 規範と L2 規範が最も一般的な慣行です。

L1 正規化:

L1 は、すべてのパラメータ (重み) の絶対値の合計に、通常は 0 から 1 の間の小さな浮動小数点数であるλ (ハイパーパラメータ) を乗じたものです。この合計は重みの更新に適用されます。重みが大きいほどペナルティも大きくなるため、モデルはより多くの均一な重みを使用するように促されます...

L2 正規化:

同様に、L2 は重量ペナルティですが、定義が若干異なります。この場合、それは重みの二乗の合計に、トレーニング前に選択された別のハイパーパラメータあるラムダを掛けた値になります。

D.5.2 ドロップアウト

ニューラル ネットワークでは、ドロップアウトは過剰適合に対するもう 1 つの解決策であり、一見すると魔法のように思えます。ドロップアウトの概念は、ニューラル ネットワークのどのレイヤーでも、トレーニング中にこのレイヤーを通過する信号を一定の割合で閉じるというものです。これは推論中ではなく、トレーニング中にのみ発生することに注意してください。すべてのトレーニング ステップ中、ネットワーク層内のニューロンのサブセットは「無視」され、その出力値は明示的にゼロに設定されます。予測への入力がないため、バックプロパゲーションのステップ中に重みの更新は行われません。次のトレーニング ステップでは、レイヤー内の異なる重みのサブセットが選択され、他の重みはゼロに設定されます。

常に 20% シャットダウンしている脳のネットワークは、どのようにして学習できるのでしょうか?データの特定のプロパティを完全に定義する重みの特定のパスは存在しないという考えです。モデルは、ニューロンを通る複数のパスに沿ってデータを処理できるように、内部構造を一般化する必要があります。

オフにされる信号の割合は、0 から 1 の間の浮動小数点数であるため、ハイパーパラメータとして定義されます。実際には、モデルによって異なりますが、ドロップアウト値は 0.1 ~ 0.5 が最適です。推論中はドロップアウトは無視され、トレーニングされた重みを最大限に活用して新しいデータを処理します。

この本全体の例やコード リスト D-1 に示されているように、Keras ではこれを非常に簡単に実行できます。

コードリストD-1 Kerasのドロップアウト層はオーバーフィッティングを軽減する

  1. >>> keras.models から Sequentialをインポートします
  2. >>> keras.layers から Dropout、LSTM、Flatten、Denseをインポートします
  3. >>> ニューロン数 = 20
  4. >>> 最大長 = 100
  5. >>> 埋め込み寸法 = 300
  6. >>> model = Sequential() >>> model.add(LSTM(num_neurons, return_sequences=True,
  7. ... input_shape=(maxlen,embedding_dims)))>>> model.add(Dropout(. 2 ))
  8. >>> モデルを追加します(フラット化())
  9. >>> model.add(Dense( 1 , activation= 'sigmoid' ))

D.5.3 バッチ正規化

バッチ正規化と呼ばれるニューラル ネットワークの新しい概念は、モデルの標準化と一般化に役立ちます。バッチ正規化の考え方は、入力データと同様に、各ネットワーク層の出力を 0 から 1 の間の値に正規化するというものです。これがどのように、なぜ、いつ有益であるか、またどのような条件下で使用すべきかについては、まだ議論が続いています。皆様がこの研究の方向性を自ら探求していただければ幸いです。

ただし、Keras BatchNormalization レイヤーでは、リスト D-2 に示すように、簡単な実装方法を提供しています。

コードリスト D-2 バッチ正規化

  1. >>> keras.models から Sequentialをインポートします
  2. >>> keras.layers から Activation、Dropout、LSTM、Flatten、Denseをインポートします
  3. >>> keras.layers.normalization から BatchNormalizationをインポートします
  4. >>> モデル = シーケンシャル()>>> model.add(Dense( 64 , input_dim= 14 ))
  5. >>> モデルを追加します(バッチ正規化())
  6. >>> model.add(アクティベーション( 'シグモイド' ))
  7. >>> model.add(Dense( 64 , input_dim= 14 ))
  8. >>> モデルを追加します(バッチ正規化())
  9. >>> model.add(アクティベーション( 'シグモイド' ))
  10. >>> model.add(Dense( 1 , activation= 'sigmoid' ))

D.6 アンバランスなトレーニングセット

機械学習モデルの良し悪しは、入力されたデータによって決まります。大量のデータを持つことは、予測フェーズで使用するすべての状況がサンプルでカバーされている場合にのみ役立ち、データセットが各状況を 1 回だけカバーするだけでは不十分です。画像が犬なのか猫なのかを予測しようとしていると想像してください。この時点で、トレーニング セットには猫の写真が 20,000 枚含まれていますが、犬の写真は 200 枚しかありません。このデータセットでモデルをトレーニングすると、入力に関係なく、与えられた画像を猫として予測することを単純に学習する可能性が高いでしょう。モデリングの観点から見ると、この結果は許容範囲内でしょうか?ここで私が言いたいのは、トレーニング例の 99% の予測が正しいということです。もちろん、この見解は現実にはまったく受け入れられず、このモデルは無価値です。ただし、これはこの特定のモデルの範囲外ですが、この失敗の最も可能性の高い理由は、トレーニング セットのバランスが取れていないことです。

モデルは、ラベル付けされたデータ内の過剰にサンプリングされたクラスからの信号が、サンプリング不足のクラスからの信号を圧倒するという単純な理由から、トレーニング セットに重点を置きすぎる可能性があります。メインクラス信号のエラーによって重みがより頻繁に更新されますが、マイナークラスからの信号は無視されます。モデルは独自にノイズの一部を克服できるため、各クラスの完全に均一な表現を取得することは重要ではありません。ここでの目標は、クラスの比率をバランスの取れたレベルにすることです。

あらゆる機械学習タスクと同様に、最初のステップは、データをじっくりと調べ、詳細をいくつか学習し、データが実際に何を表しているかについて大まかな統計を作成することです。データの量だけでなく、データの種類がいくつあるかを知ることも重要です。

では、最初から何も特別なことがなかった場合、人々はどうするのでしょうか?クラスの表現を均一にすることが目標である場合 (実際そうなります)、選択できる主なアプローチは、オーバーサンプリング、アンダーサンプリング、およびデータ拡張の 3 つです。

D.6.1 オーバーサンプリング

オーバーサンプリングは、1 つ以上の過小評価されたクラスからサンプルを繰り返しサンプリングする手法です。先ほどの犬と猫の分類の例を見てみましょう (犬は 200 匹しかいませんが、猫は 20,000 匹います)。既存の 200 枚の犬の画像を 100 回繰り返すだけで、40,000 個のサンプルが作成され、そのうち半分は犬で、残りの半分は猫になります。

これは極端な例であり、それ自体が固有の問題を引き起こします。ネットワークは、これらの 200 匹の特定の犬をうまく認識しますが、トレーニング セットに含まれていない他の犬についてはうまく一般化できない可能性が非常に高くなります。ただし、それほど極端ではない不均衡なケースでは、オーバーサンプリング手法はトレーニング セットのバランスをとるのに役立ちます。

D.6.2 アンダーサンプリング

アンダーサンプリングは同じコインの裏側です。ここでは、過剰に表現されているクラスからいくつかのサンプルを削除します。上記の猫と犬の例では、猫の画像 19,800 枚をランダムに削除し、400 枚の画像を残します。そのうち半分は犬で、残りの半分は猫です。もちろん、これを行うと、大部分のデータが破棄され、それほど広範囲ではないデータベースに基づいてのみ研究が行われるという、顕著な問題が生じます。このような極端なアプローチは上記の例では理想的ではありませんが、過小評価されているクラス自体に多数のサンプルが含まれている場合は、良い解決策になる可能性があります。もちろん、これほど大量のデータを持っているのは間違いなく贅沢です。

D.6.3 データ拡張

データ拡張は少し難しいですが、適切な状況では役立ちます。拡張とは、既存のデータの摂動または再生によって新しいデータを生成することを意味します。 AffNIST はその一例です。有名な MNIST データ セットは、0 から 9 までの手書きの数字のセットで構成されています (図 D-4 を参照)。 AffNIST は、元のラベルを保持しながら、各数字をさまざまな方法で歪曲、回転、拡大縮小します。

図 D-4. 左端の列のエントリは、元の MNIST からのサンプルです。他の列は、アフィン変換後の affNIST に含まれるデータです。(画像提供: affNIST)

この特定のアプローチの目的は、トレーニング セットのバランスをとることではなく、畳み込みニューラル ネットワークなどのネットワークを、他の方法で書き込まれた新しいデータに対してより耐性のあるものにすることですが、データ拡張の概念はここでも適用されます。

ただし、注意が必要です。モデル化されているデータを正確に表していないデータを追加すると、メリットよりもデメリットの方が大きくなる可能性があります。データセットが、以前の 200 匹の犬の写真と 20,000 匹の猫の写真のセットであるとします。さらに、これらの画像は理想的な条件下で撮影された高解像度のカラー画像であると想定しています。さて、19,000 人の幼稚園教諭にクレヨンの箱を配っても、必ずしも望む強化データが得られるとは限りません。したがって、拡張されたデータがモデルにどのような影響を与えるかを考えてみましょう。答えは必ずしも明確ではないため、この方法を採用する場合は、モデルを検証する際にその影響を念頭に置き、予期しない動作が誤って導入されないように、モデルの周辺を徹底的にテストするようにしてください。

最後に、あまり価値がないかもしれませんが、確かに真実であるということを述べておきます。データ セットが「不完全」な場合、最初に検討すべきことは、元のデータ ソースに戻って追加データを探すことです。これは必ずしも可能ではありませんが、少なくとも選択肢として検討する必要があります。

D.7 パフォーマンス指標

あらゆる機械学習パイプラインの最も重要な部分はパフォーマンス メトリックです。学習した機械学習モデルがどれだけうまく機能するかがわからなければ、それを改善することはできません。機械学習パイプラインを起動する場合、最初に行うことは、任意の sklearn 機械学習モデルに「.score()」などのパフォーマンス メトリック メソッドを設定することです。次に、完全にランダムな分類/回帰パイプラインを構築し、最後にパフォーマンス スコアを計算します。これにより、パイプラインを段階的に改善し、スコアを徐々に向上させて最終目標に近づくことができます。これは、上司や同僚に全員が正しい方向に進んでいることを再確認させる素晴らしい方法でもあります。

D.7.1 分類メトリクス

分類子については、次の 2 つの点が正しく行われることを期待します。1 つ目は、クラス ラベルを使用して、実際にそのクラスに属するオブジェクトをマークすること、2 つ目は、このラベルを使用してそのクラスに属していないオブジェクトをマークしないことです。これら 2 つのイベントに対応する正しいカウント値は、それぞれ真陽性と真陰性と呼ばれます。モデル分類または予測のすべての結果を含む numpy 配列がある場合は、リスト D-3 に示すように、正しい予測結果を計算できます。

コードリストD-4: 計算モデルから得られた誤った結果

これらの 4 つの数値は、エラー マトリックスまたは混同マトリックスと呼ばれる 4 × 4 マトリックスに結合されることがあります。リスト D-5 は、混同行列で予測値と真の値がどのようになるかを示しています。

コードリスト D-5 混同マトリックス

  1. >>> 混乱 = [[真陽性、偽陽性]、
  2. ... [偽陰性、真陰性]]>>> 混乱[[ 43 ]、[ 12 ]]
  3. >>> pandas を pd としてインポートします
  4. >>> 混乱 = pd.DataFrame(混乱、列=[ 1 , 0 ]、インデックス=[ 1 , 0 ])
  5. >>> 混乱.index.name = r '予測\真実'
  6. >>> 混乱1 0
  7. 予測\真実141
  8. 0 3 2

混同行列では、対角線 (左上と右下) 上の数字を大きくし、対角線 (左上と左下) の外側の数字を小さくする必要があります。ただし、正クラスと負クラスの順序は任意であるため、この表の数字が入れ替わっている場合があります。混同行列の列と下付き文字には常にラベルを付けます。統計学者がこのマトリックスを分類分割表と呼ぶのを耳にすることがありますが、「混同マトリックス」という名前に固執することで混乱を避けることができます。

機械学習の分類問題の場合、これら 4 つのカウントの一部を 1 つのパフォーマンス メトリック、精度と再現率に組み合わせる便利な方法が 2 つあります。情報検索 (検索エンジン) とセマンティック検索は、この分類問題の例です。その目的は、ドキュメントを一致する (入力クエリ) か一致しないかに分類することです。第 2 章では、ステミングとレマタイズによって再現率が向上する一方で、精度が低下する可能性があることを学びました。

精度は、関心のあるクラス (陽性クラスと呼ばれる) のすべてのオブジェクトを検出するモデルの能力を測定するため、陽性予測値とも呼ばれます。真陽性は正しく予測された陽性クラスのサンプルの数であり、偽陽性は誤って陽性とラベル付けされた陰性クラスのサンプルの数であるため、精度はコードリスト D-6 に示すように計算できます。

コードリスト D-6 精度

  1. >>> 精度 = 真陽性 / (真陽性 + 偽陽性)
  2. >>> 精度0.571 ...

上記の例の混同行列では、陽性クラスとして予測されたすべてのサンプルの約 57% が正しいため、精度は約 57% になります。

リコールは精度に似ており、感度、真陽性率、リコールとも呼ばれます。データセット内のサンプルの総数は真陽性と偽陰性の合計であるため、すべてのサンプルの中で正しく検出され予測された陽性クラス サンプルの割合であるリコール率を計算できます。コードはリスト D-7 に示されています。

コードリスト D-7 リコール率

  1. >>> リコール = 真陽性 / (真陽性 + 偽陰性)
  2. >>>リコール0.8

これは、上記の例で得られたモデルがデータセット内の陽性クラスサンプルの 80% を検出したことを意味します。

D.7.2 回帰指標

機械学習の回帰問題における最も一般的な 2 つのパフォーマンス メトリックは、二乗平均平方根誤差 (RMSE) とピアソン相関係数 (R2) です。分類問題は実際には回帰問題であることが判明しました。したがって、クラス ラベルが数値に変換されている場合 (前のセクションで行ったように)、それらに対して回帰メトリックを使用できます。次のコード例では、前のセクションの予測値と実際の値を再利用します。 RMSE は、予測値が実際の値にどの程度近いかを示す指標となるため、ほとんどの問題に最も役立ちます。 RMSE は、コード リスト D-8 に示すように、誤差の標準偏差を示します。

コードリスト D-8 二乗平均平方根誤差 (RMSE)

  1. >>> y_true = np.array( [ 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , 1 ])
  2. >>> y_pred = np.array([ 0 , 0 , 1 , 1 , 1 , 1 , 0 , 0 , 0 ])
  3. >>> rmse = np.sqrt((y_true - y_pred) ** 2 ) / len(y_true))
  4. >>> rmse
  5. 0.632 ...

ピアソン相関係数は、回帰関数のもう 1 つの一般的なパフォーマンス メトリックです。 sklearn モジュールは、これをデフォルトで .score() 関数としてほとんどのモデルに添付します。これらの指標の計算方法がわからない場合は、感覚をつかむために手動で計算する必要があります。相関係数の計算はコードリストD-9に示されています。

コードリスト D-9 相関係数

  1. >>> corr = pd.DataFrame([y_true, y_pred]).T.corr()
  2. >>> 相関[ 0 ][ 1 ]
  3. 0.218 ... >>> np.mean((y_pred - np.mean(y_pred)) * (y_true - np.mean(y_true))) /
  4. ... np.std(y_pred) / np.std(y_true)
  5. 0.218 ...

これは、サンプル予測値と実際の値との相関がわずか 28% であることを示しています。

D.8 専門スキル

基本を習得したら、優れたモデルをより速く構築するのに役立つ簡単なヒントをいくつか紹介します。

  • データセットの小さなランダム サンプル サブセットを使用して、パイプライン内の潜在的な欠陥を検出します。
  • モデルを本番環境にデプロイする準備ができたら、すべてのデータを使用してモデルをトレーニングします。
  • まずは最も使い慣れている方法を試してください。このトリックは、特徴抽出とモデル自体にも適用されます。
  • 低次元の特徴とターゲットに散布図と散布行列を使用して、明らかなパターンが見逃されないようにします。
  • 高次元データを元の画像としてプロットして特徴転移を発見する** ;
  • ベクトルのペア間の差を最大化したい場合は、高次元データには PCA (NLP データには LSA) を使用することができます。
  • 低次元空間で回帰を実行したり、一致するベクトルペアを検索したりする場合は、t-SNE などの非線形次元削減を使用できます。
  • モデルと特徴抽出器の保守性と再利用性を向上させるために sklearn.Pipeline オブジェクトを構築します。
  • ハイパーパラメータの調整を自動化することで、モデルがデータを学習し、機械学習の学習に時間を費やすことができます。

ハイパーパラメータの調整 ハイパーパラメータとは、モデルの種類や構成方法など、パイプラインのパフォーマンスを決定するすべての値です。ハイパーパラメータは、ニューラル ネットワーク内のニューロンとレイヤーの数、または sklearn.linear_model.Ridge 回帰モデルのアルファ値になることもあります。ハイパーパラメータには、トークン化のタイプ、無視されるすべての単語のリスト、TF-IDF 語彙の最小および最大ドキュメント頻度、トークンのマージを使用するかどうか、TF-IDF 正規化方法など、すべての前処理手順を制御する値も含まれます。

各実験で新しいモデルのトレーニングと検証が必要になるため、ハイパーパラメータの調整は時間のかかるプロセスになる可能性があります。したがって、広範囲のハイパーパラメータを検索する場合、データセットを代表的なサンプルの最小限のセットに縮小する必要があります。検索がニーズを満たす最終モデルに近づくにつれて、データセットのサイズを増やして、必要なデータをできるだけ多く使用できるようになります。

パイプラインのハイパーパラメータを最適化することは、モデルのパフォーマンスを向上させる方法です。ハイパーパラメータの調整を自動化すると、この本のような本を読んだり、最終結果を視覚化して分析したりする時間が増えます。もちろん、直感を使ってハイパーパラメータの範囲を設定し、チューニングを導くこともできます。

最も効果的なハイパーパラメータ調整のヒントを持つアルゴリズムは次のとおりです (最良から最悪まで):

(1)ベイズ探索

(2)遺伝的アルゴリズム

(3)無作為捜査

(4)マルチ解像度グリッドサーチ

(5)グリッド検索

しかし、いずれにせよ、全員が寝ている間に動作するコンピュータ検索アルゴリズムは、新しいパラメータを 1 つずつ手動で推測するよりも優れています。

この記事は「Python を使用した自然言語処理によるテキストの理解、分析、生成」からの抜粋です。

<<:  スマートビルディングでは通信システムに何が必要ですか?

>>:  ビジネス界におけるAIと自動化の変革的役割

ブログ    
ブログ    

推薦する

...

...

10行のコードで物体検出を実行する方法

導入人工知能の重要な分野はコンピュータービジョンです。コンピューター ビジョンは、コンピューターとソ...

よりスマートに:人工知能とエネルギー産業の革命

人工知能は私たちの生活、仕事、遊び方に革命をもたらそうとしているが、Amazon の Alexa や...

...

Python の高度なアルゴリズムとデータ構造: treap を使用してデュアル インデックスを実装する (パート 1)

\上記で紹介したヒープ構造では、データを部分的にしかソートできません。つまり、一部の要素のソートし...

...

魔法の顔認識: たとえマスクやサングラスをかけていても、身近な人を認識できるのはなぜでしょうか?

見知らぬ人々の集団の中に見覚えのある人を見つけたり、とても見覚えのある顔を見かけたりします。その人は...

DeepGlint: 顔認識の最新の進歩と産業グレードの大規模な顔認識の実践に関する議論

[[380229]] 1. 顔認識の背景紹介簡単に言えば、顔認識の問題は、2 つの顔が与えられたとき...

Nature: 衣服をマイクとして使う?新しい素材は銃声の方向を検知し、胎児の心拍を監視できる

FPS ゲームをプレイしたことがある人なら、音で位置を識別できるはずですよね?銃声と足音は敵の方向...

タオ氏の新しい論文:有名な素数予想を部分的に証明、新しい方法は彼の古いモデルを使用する

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

これまで見たことのないアルゴリズムのダンス(ビデオ)

[[21488]]サピエンティア大学の以下のビデオをご覧ください。学生たちが中央ヨーロッパの民族舞...

人工知能は日常のビジネス業務をどのように変えるのでしょうか?

「人工知能」という言葉を聞くと、まず頭に浮かぶのは「スマートデバイス/スマートシステム」です。しか...

...

クラウド上でのインテリジェント運転の 3D 再構築のベスト プラクティス

インテリジェント運転技術の継続的な発展により、私たちの移動方法や交通システムは変化しています。 3D...