コメントスパム機械学習モデルの作成

1. 始める前に

この Codelab では、TensorFlow と TensorFlow Lite Model Maker を使用して作成したコードを確認し、コメントスパムに基づいてデータセットを使用してモデルを作成します。元のデータは Kaggle で入手できます。1 つの CSV にまとめられ、破損したテキスト、マークアップ、繰り返しの単語などが削除されます。これにより、テキストではなくモデルにフォーカスが入れやすくなります。

これから提供するコードは、ここで提供されていますが、Google Colab でコードを使用することを強くおすすめします。

前提条件

  • この Codelab は、機械学習に不慣れなデベロッパーを対象にしています。
  • この Codelab は、モバイル向けのテキスト分類に関するスタートガイドの一部です。前の作業をまだ完了していない場合は、ここで停止して中止してください。

学習内容

  • Google Colab を使用して TensorFlow Lite Model Maker をインストールする方法
  • クラウド サーバーからデバイスにデータをダウンロードする方法
  • データローダの使用方法
  • モデルの作成方法

必要なもの

2. TensorFlow Lite Model Maker をインストールする

colab を開きます。ノートブックの最初のセルに TensorFLow Lite モデルメーカーがインストールされます。

!pip install -q tflite-model-maker

完了したら、次のセルに進みます。

3. コードをインポートする

次のセルには、ノートブックのコードで使用する必要があるいくつかのインポートがあります。

import numpy as np
import os
from tflite_model_maker import configs
from tflite_model_maker import ExportFormat
from tflite_model_maker import model_spec
from tflite_model_maker import text_classifier
from tflite_model_maker.text_classifier import DataLoader

import tensorflow as tf
assert tf.__version__.startswith('2')
tf.get_logger().setLevel('ERROR')

これにより、Model Maker を使用するための要件である、TensorFlow 2.x が実行されているかどうかも確認します。

4.データをダウンロードする

次に、Cloud サーバーからデバイスにデータをダウンロードし、ローカル ファイルを指すように data_file を設定します。

data_file = tf.keras.utils.get_file(fname='comment-spam.csv',
  origin='https://storage.googleapis.com/laurencemoroney-blog.appspot.com/lmblog_comments.csv',
  extract=False)

Model Maker では、このようなシンプルな CSV ファイルからモデルをトレーニングできます。テキストを保持する列とラベルを保持する列を指定するだけで済みます。その方法については、後ほど Codelab で説明します。

5. 事前に学習したエンベディング

一般的に、Model Maker を使用する場合、モデルをゼロから作成することはありません。ニーズに合わせてカスタマイズした既存のモデルを使用します。

このような言語モデルでは、事前学習の埋め込みを使用します。埋め込みの考え方では、単語は数値に変換され、コーパス全体の各単語には数値が設定されます。エンベディングは、単語の「方向」を確立することにより、その単語の感情を判断するために使用されるベクトルです。たとえば、コメントスパム メッセージで頻繁に使用される単語は、ベクトルの向きが似ていて、使用されない単語は逆方向です。

事前に学習したエンベディングを使用すると、大量のテキストから感情がすでに学習している単語のコーパス(コレクション)から始めることができます。これにより、ゼロから始めるよりも短時間でソリューションを取得できます。

Model Maker には、事前に学習したエンベディングがいくつか用意されていますが、最も簡単で早いものは average_word_vec です。

以下にコードを示します。

spec = model_spec.get('average_word_vec')
spec.num_words = 2000
spec.seq_len = 20
spec.wordvec_dim = 7

num_words パラメータ

モデルで使用する単語の数も指定します。

「あるほど良い」と思うかもしれませんが、一般的には各単語の使用頻度に応じて適切な数字があります。コーパス全体ですべての単語を使用すると、モデルは 1 回だけ使用される単語の方向を学習して確立しようとします。多くのテキスト コーパスでは、多くの単語は 1 回か 2 回しか使用されず、多くの場合、モデルで使用するのは感情にほとんど影響しないため、価値がありません。num_words パラメータを使用すると、必要な単語数でモデルを調整できます。

数値を小さくすると、サイズが小さく高速になりますが、認識される単語が少ないため、精度が低くなる可能性があります。この数値が大きいほど、動作が遅くなり、モデルの処理が遅くなります。スイート スポットを見つけることが重要

wordvec_dim パラメータ

wordved_dim パラメータは、各単語のベクトルに使用する次元数です。調査から判断されたのは、単語数の 4 番目です。たとえば、2,000 語を使用する場合は、7 から始めることをおすすめします。使用する単語数を変更する場合は、これも変更できます。

seq_len パラメータ

一般的に、入力値に関しては、モデルは非常に厳格です。これは、言語モデルの場合、言語モデルが静的で特定の長さの文を分類できることを意味します。これは、seq_len パラメータまたはシーケンスの長さによって決まります。

単語を数字(またはトークン)に変換すると、文がそれらのトークンのシーケンスになります。そのため、モデルは、この場合には 20 個のトークンを含む文を分類して認識するようにトレーニングされます。この数より長い場合、文は切り捨てられます。それより短い場合、パディングが追加されます。コーパスには、これに使用する専用の <PAD> トークンが表示されます。

6. データローダを使用する

先ほど CSV ファイルをダウンロードしました。次に、データローダを使用して、これをトレーニング データに変換し、モデルが認識できるようにします。

data = DataLoader.from_csv(
    filename=data_file,
    text_column='commenttext',
    label_column='spam',
    model_spec=spec,
    delimiter=',',
    shuffle=True,
    is_training=True)

train_data, test_data = data.split(0.9)

この CSV ファイルをエディタで開くと、各行には 2 つの値のみが表示され、ファイルの最初の行にテキストで記述されます。通常、各エントリは列と見なされます。

最初の列の記述子は commenttext で、各行の最初のエントリはコメントのテキストです。同様に、2 列目の記述子は spam であり、各行の 2 つ目のエントリは True または False, です。これは、そのテキストがコメントスパムであるかどうかを示します。他のプロパティには、先ほど作成した model_spec と区切り文字(この場合は、ファイルがカンマ区切りなのでカンマ)が設定されます。このデータはモデルのトレーニングに使用するため、is_TrainingTrue に設定します。

モデルの一部をテストするために、データの一部を保留します。データを 90% をトレーニング用、残りの 10% をテスト/評価用に分割します。この処理は、テストデータがランダムに選択され、データセットの「下位」10% ではないことを確認する必要があるため、データを読み込むときに shuffle=True を使用します。

7. モデルの構築

次のセルは、単にモデルをビルドするためのもので、1 行のコードです。

# Build the model
model = text_classifier.create(train_data, model_spec=spec, epochs=50,
                               validation_data=test_data)

これにより、Model Maker でテキスト分類モデルを作成し、使用するトレーニング データ(ステップ 4 で設定)、モデル仕様(ステップ 4 で設定)、エポック数(この場合は)を指定する 50.

機械学習の基本原則は、パターン マッチングの一種です。まず単語の事前トレーニング済みの重みを読み込み、グループ化して、スパム、スパムを示す予測とともにグループ化しようとします。最初の頃は 50 時 50 分前後と考えられますが、これはモデルはまだ始まったばかりだからです。

b94b00f0b155db3d.png

その後、その結果を測定し、最適化コードを実行して予測を微調整してから再試行します。これはエポックです。そのため、epochs=50 を指定すると、その「ループ」が 50 回繰り返されます。

103f1d21c0b64d654.png

モデルは、50 エポックに達するまでに、はるかに高いレベルの精度を報告します。この場合は 99% です。

右側に検証精度の値が表示されます。これらは通常、モデルが過去に見たことのないデータの分類方法を示すため、トレーニングの精度より少し低い値になります。先ほど確保した 10% のテストデータを使用します。

07767ec70e4302.png

8. モデルをエクスポートする

トレーニングが完了したら、モデルをエクスポートできます。

TensorFlow は独自の形式でモデルをトレーニングします。モバイルアプリで使用するには、これを TFLITE 形式に変換する必要があります。 Model Maker は、この複雑な処理を行います。

次のように、ディレクトリを指定してモデルをエクスポートします。

model.export(export_dir='/mm_spam')

そのディレクトリ内に model.tflite ファイルがあります。ダウンロードします。次の Codelab でこれを使用して、Android アプリに追加します。

iOS に関する考慮事項

先ほどエクスポートした .tflite モデルは、そのモデルに関するメタデータが埋め込まれているので Android で適切に動作し、Android Studio ではそのメタデータを読み取ることができます。

このメタデータは、モデルが単語を認識するための単語を表すトークンの辞書を含むため、非常に重要です。以前に、単語がトークンになり、そのトークンの感情のベクトルが与えられることを学習したときに、そのことを思い出してください。 モバイルアプリは、これらのトークンを認識する必要があります。たとえば、「dog」が 42 にトークン化され、ユーザーが「dog」を文にした場合、アプリがそれを認識するには「dog」を 42 に変換する必要があります。Android デベロッパーはこれを簡単に使える「TensorFlow Lite タスク ライブラリ」を手に入れることができますが、iOS の場合はボキャブラリを処理する必要があるので、それを用意する必要があります。Model Maker では、export_format パラメータを指定することで、この処理をエクスポートできます。モデルのラベルとボキャブラリを取得するには、次のコマンドを使用します。

model.export(export_dir='/mm_spam/',
             export_format=[ExportFormat.LABEL, ExportFormat.VOCAB])

9. 完了

この Codelab では、モデルの構築とエクスポートに使用する Python コードについて説明しました。末尾に .tflite ファイルを追加します。

次の Codelab では、このモデルを使用するように Android アプリを編集し、スパムコメントの分類を開始する方法について説明します。