以下の 3 つの異なるファミリーの強力な分類アルゴリズムを使用して、テキスト分類用に独自のモデルをトレーニングできます。
- SVM を使用したクラシック機械学習 (サポート・ベクトル・マシン)
- CNN (Convolutional Neural Networks) を使用したディープ・ラーニング
- 事前にトレーニングされた変換プログラム・モデルを使用する変換プログラム・ベースのアルゴリズム: Slate IBM Foundation モデル
Watson Natural Language Processing ライブラリーには、さまざまな分類アルゴリズムと多数決を組み合わせた、使いやすいアンサンブル分類子も用意されています。
アルゴリズムは、複数ラベル・タスクと複数クラス・タスク、および特殊なケースをサポートします。例えば、ドキュメントが 1 つのクラスのみ (単一ラベル・タスク) に属している場合や、二項分類タスクに属している場合などです。
分類モデルのトレーニングでは、CPU とメモリーが集中的に使用されます。 トレーニング・データのサイズによっては、環境がトレーニングを完了するのに十分な大きさではない場合があります。 トレーニング中にノートブック・カーネルで問題が発生した場合は、CPU とメモリーの量が多いカスタム・ノートブック環境を作成し、それを使用してノートブックを実行します。 特に変換プログラム・ベースのアルゴリズムの場合は、GPU ベースの環境を使用する必要があります (使用可能な場合)。 独自の環境テンプレートの作成を参照してください。
トピック・セクション:
- トレーニング用の入力データ形式
- 入力データ要件
- ストップワード
- SVM アルゴリズムのトレーニング
- CNN アルゴリズムのトレーニング
- Slate IBM 基盤モデルを使用した変換プログラム・アルゴリズムのトレーニング
- Hugging Faceが提供するモデルを使用して、カスタムトランスフォーマーモデルをトレーニングする。
- アンサンブル・モデルのトレーニング
- トレーニングのベスト・プラクティス
- 新規データへのモデルの適用
- ユース・ケースに適したアルゴリズムの選択
トレーニング用の入力データ形式
分類ブロックは、CSV 形式および JSON 形式のトレーニング・データを受け入れます。
CSV 形式
CSV ファイルにヘッダーを含めることはできません。 CSV ファイルの各行は、サンプル・レコードを表しています。 各レコードには 1 つ以上の列があり、最初の列はテキストを表し、後続の列はそのテキストに関連付けられたラベルを表します。
注。
- SVM および CNN アルゴリズムは、インスタンスにラベルがないトレーニング・データをサポートしません。 したがって、SVM アルゴリズム、CNN アルゴリズム、またはこれらのアルゴリズムのいずれかを含むアンサンブルを使用している場合、各 CSV 行には少なくとも 1 つのラベル (2 列) が必要です。
- BERT ベースおよび Slate ベースの Transformer アルゴリズムは、各インスタンスに 0、1、または複数のラベルがあるトレーニング・データをサポートします。
Example 1,label 1 Example 2,label 1,label 2
JSON 形式
トレーニング・データは、複数の JSON オブジェクトを持つ配列として表されます。 各 JSON オブジェクトは 1 つのトレーニング・インスタンスを表し、テキスト・フィールドとラベル・フィールドが必要です。 テキストはトレーニング例を表し、ラベルは例に関連付けられたラベル (0、1、または複数のラベル) を保管します。
[ { "text": "Example 1", "labels": ["label 1"] }, { "text": "Example 2", "labels": ["label 1", "label 2"] }, { "text": "Example 3", "labels": [] } ]
注。
"labels": []
は、ラベルのない例を示しています。 SVM および CNN アルゴリズムは、インスタンスにラベルがないトレーニング・データをサポートしません。 そのため、SVM アルゴリズム、CNN アルゴリズム、またはこれらのアルゴリズムのいずれかを含むアンサンブルを使用する場合は、各 JSON オブジェクトに少なくとも 1 つのラベルが必要です。- BERT ベースおよび Slate ベースの Transformer アルゴリズムは、各インスタンスに 0、1、または複数のラベルがあるトレーニング・データをサポートします。
入力データ要件
SVM および CNN アルゴリズムの場合:
- 必要な固有ラベルの最小数: 2
- ラベルごとに必要なテキスト例の最小数: 5
BERT ベースおよび Slate ベースの Transformer アルゴリズムの場合:
- 必要な固有ラベルの最小数: 1
- ラベルごとに必要なテキスト例の最小数: 5
CSVまたはJSON形式のトレーニングデータは、トレーニング前にDataStreamに変換されます。 トレーニング・データ・ファイルの代わりに、分類ブロックのトレーニング機能にデータ・ストリームを直接渡すこともできます。
ストップワード
前処理中に削除される独自のストップワードを指定できます。 ストップワード・ファイルの入力は、標準形式 (1 行に 1 つの句を持つ単一のテキスト・ファイル) で行う必要があります。 ストップワードは、リストとして、または標準形式のファイルとして提供できます。
ストップワードは、アンサンブル分類子でのみ使用できます。
SVM アルゴリズムのトレーニング
SVM はサポート・ベクトル・マシン分類子であり、USE
(Universal Sentence Encoder) 埋め込みやTF-IDF
ベクトル・指定子など、機能ベクトルとしての組み込みブロックまたはベクトル化ブロックによって提供される任意の種類の入力に対する予測を使用してトレーニングできます。 マルチクラスおよびマルチラベルのテキスト分類をサポートし、Platt スケーリングを使用して信頼スコアを生成します。
SVM トレーニングの構成に使用できるすべてのオプションについて、以下を入力します。
help(watson_nlp.blocks.classification.svm.SVM.train)
SVM アルゴリズムをトレーニングするには:
以下の前処理ステップから始めます。
import watson_nlp from watson_nlp.toolkit.classification_utils.train_util import prepare_data_from_json from watson_nlp.blocks.classification.svm import SVM training_data_file = "train_data.json" # Load a Syntax model syntax_model = watson_nlp.load('syntax_izumo_en_stock') # Create datastream from training data train_stream = prepare_data_from_json(training_data_file, syntax_model) syntax_stream, labels_stream = train_stream[0], train_stream[1]
USE 埋め込みを使用して分類モデルをトレーニングします。 利用可能な事前学習済みブロックのリストについては、事前学習済みUSEエンベッディングを 参照してください。
# download embedding use_embedding_model = watson_nlp.load('embedding_use_en_stock') use_train_stream = use_embedding_model.stream(syntax_stream, doc_embed_style='raw_text') # NOTE: doc_embed_style can be changed to `avg_sent` as well. For more information check the documentation for Embeddings # Or the USE run function API docs use_svm_train_stream = watson_nlp.data_model.DataStream.zip(use_train_stream, labels_stream) # Train SVM using Universal Sentence Encoder (USE) training stream classification_model = SVM.train(use_svm_train_stream)
CNN アルゴリズムのトレーニング
CNN は、単純な畳み込みネットワーク・アーキテクチャーであり、短いテキストでのマルチクラスおよびマルチラベルのテキスト分類のために構築されています。 これは、GloVe 埋め込みを使用します。 GloVe 埋め込みは、ワード・レベルのセマンティクスをベクトル・スペースにエンコードします。 各言語の GloVe 埋め込みは、その言語の Wikipedia コーパスでトレーニングされています。 使用方法についてはGloVe埋め込みについては、GloVe埋め込み。
CNN トレーニングの構成に使用できるすべてのオプションについては、次のように入力します。
help(watson_nlp.blocks.classification.cnn.CNN.train)
CNN アルゴリズムをトレーニングするには:
import watson_nlp
from watson_nlp.toolkit.classification_utils.train_util import prepare_data_from_json
from watson_nlp.blocks.classification.cnn import CNN
training_data_file = "train_data.json"
# Load a Syntax model
syntax_model = watson_nlp.load('syntax_izumo_en_stock')
# Create datastream from training data
train_stream = prepare_data_from_json(training_data_file, syntax_model)
syntax_stream, labels_stream = train_stream[0], train_stream[1]
# Download GloVe embeddings
glove_embedding_model = watson_nlp.load('embedding_glove_en_stock')
# Train CNN
classification_model = CNN.train(watson_nlp.data_model.DataStream.zip(syntax_stream, labels_stream), embedding=glove_embedding_model.embedding)
IBM Slate モデルを使用した変換プログラム・アルゴリズムのトレーニング
事前学習済みのスレートを使用したトランスフォーマーアルゴリズムIBM基礎モデルは、短いテキストのマルチクラスおよびマルチラベルのテキスト分類に使用できます。
Transformer のトレーニングを設定するために使用できるすべてのオプションについて、以下のように入力します。
help(watson_nlp.blocks.classification.transformer.Transformer.train)
利用可能な Slate モデルの一覧については、次の表を参照してください。
モデル | 説明 |
---|---|
pretrained-model_slate.153m.distilled_many_transformer_multilingual_uncased |
汎用多目的モデル |
pretrained-model_slate.125m.finance_many_transformer_en_cased |
金融コンテンツで事前トレーニングされたモデル |
pretrained-model_slate.110m.cybersecurity_many_transformer_en_uncased |
サイバーセキュリティコンテンツで事前トレーニングされたモデル |
pretrained-model_slate.125m.biomedical_many_transformer_en_cased |
生物医学コンテンツで事前トレーニングされたモデル |
Transformer アルゴリズムのトレーニング方法:
import watson_nlp
from watson_nlp.blocks.classification.transformer import Transformer
from watson_nlp.toolkit.classification_utils.train_util import prepare_stream_of_train_records
from watson_nlp import data_model as dm
training_data_file = "train_data.json"
# Create datastream from training data
train_data_stream = dm.DataStream.from_file(training_data_file)
train_record_data_stream = prepare_stream_of_train_records(train_data_stream)
# Load pre-trained slate model
pretrained_model_resource = watson_nlp.load('<pretrained Slate model>')
# Train model - note that Transformer uses Slatea by default
classification_model = Transformer.train(train_data_stream=train_record_data_stream,
pretrained_model_resource=pretrained_model_resource)
Hugging Faceが提供するモデルを使用して、カスタムトランスフォーマーモデルをトレーニングする
Hugging Faceから事前に訓練されたモデルを使用して、カスタムトランスフォーマーベースのモデルを訓練することができます。
Hugging Faceを使うには、'watson_nlp.blocks.classification.transformer.Transformer
の'train
メソッドの'pretrained_model_resource
パラメーターにモデル名を指定する。 https://huggingface.co/models、モデル名をコピーする。
トランスフォーマー・トレーニングの構成に使用できるすべてのオプションのリストを取得するには、以下のコードを入力します。
help(watson_nlp.blocks.classification.transformer.Transformer.train)
変換プログラム・アルゴリズムのトレーニング方法については、以下のコード例を参照してください。
import watson_nlp
from watson_nlp.blocks.classification.transformer import Transformer
from watson_nlp.toolkit.classification_utils.train_util import prepare_stream_of_train_records
from watson_nlp import data_model as dm
training_data_file = "train_data.json"
# Create datastream from training data
train_data_stream = dm.DataStream.from_file(training_data_file)
train_record_data_stream = prepare_stream_of_train_records(train_data_stream)
# Specify the name of the Hugging Face model
huggingface_model_name = 'xml-roberta-base'
# Train model
classification_model = Transformer.train(train_data_stream=train_record_data_stream,
pretrained_model_resource=huggingface_model_name)
アンサンブル・モデルのトレーニング
アンサンブル・モデルは、CNN、TF-IDF を使用する SVM、および USE を使用する SVM の 3 つのアルゴリズムの重み付きアンサンブルです。 信頼性スコアを使用して、一連の分類予測の加重平均を計算します。 アンサンブル・モデルは非常に使いやすい。
GenericEnsemble 分類器を使用すると、ユーザーは 3 つの基本分類器 TFIDF-SVM、USE-SVM、および CNN からより柔軟に選択できます。 50 から 1000 文字の範囲のテキストの場合、TFIDF-SVM 分類器と USE-SVM 分類器の組み合わせを使用すると、多くの場合、品質とパフォーマンスのバランスが良くなります。 一部の中または長い文書 (500-1000 文字以上) では、CNN をアンサンブルに追加することで品質を向上させることができますが、通常は実行時のパフォーマンスに大きな影響を与えます (スループットが低下し、モデルのロード時間が増加します)。
アンサンブル・トレーニングの構成に使用できるすべてのオプションについて、以下を入力します。
help(watson_nlp.workflows.classification.GenericEnsemble)
アンサンブル・アルゴリズムのトレーニング方法:
import watson_nlp
from watson_nlp.workflows.classification.generic_ensemble import GenericEnsemble
from watson_nlp.workflows.classification.base_classifier import GloveCNN
from watson_nlp.workflows.classification.base_classifier import TFidfSvm
training_data_file = "train_data.json"
# Syntax model
syntax_model = watson_nlp.load('syntax_izumo_en_stock')
# GloVE Embedding model
glove_embedding_model = watson_nlp.load('embedding_glove_en_stock')
# Train classifier using the manually defined base classifier and manually defined weights¶
classification_model = GenericEnsemble.train(training_data_file,
syntax_model,
base_classifiers_params=[
TFidfSvm.TrainParams(syntax_model=syntax_model),
GloveCNN.TrainParams(syntax_model=syntax_model,
glove_embedding_model=glove_embedding_model,
)],
weights=[2,1])
すぐに使用可能な事前にトレーニングされたストップワード・モデル
ストップワードを識別するテキスト・モデルは、文書分類アンサンブル・モデルのトレーニングに使用されます。
以下の表に、事前にトレーニングされたストップワード・モデルと、サポートされる言語コードをリストします (xx
は言語コードを表します)。 言語コードおよび対応する言語のリストについては、『言語コード』を参照してください。
リソース・クラス | モデル名 | サポート対象言語 |
---|---|---|
text |
text_stopwords_classification_ensemble_xx_stock |
ar、de、es、en、fr、it、ja、ko |
トレーニングのベスト・プラクティス
分類モデルのトレーニングを妥当な時間で完了し、さまざまなパフォーマンス基準を満たすことができるようにするために、データの品質と数量に一定の制約があります。 それらを以下にリストします。 ハード制限はないことに注意してください。 ただし、これらのガイドラインからさらに逸脱するほど、モデルがトレーニングに失敗するか、モデルが満足できるものではなくなる可能性が高くなります。
データの量
- これまでにテストされたクラス分類モデルの最大数は、~1200 です。
- 分類のためのトレーニング・データおよびテスト・データに最適なテキスト・サイズは、約 3000 個のコード・ポイントです。 ただし、より大きなテキストを処理することもできますが、実行時のパフォーマンスが低下する可能性があります。
- トレーニング時間は、例の数とラベルの数に基づいて増加します。
- 推論時間は、ラベルの数に基づいて増加します。
データ品質
- 各サンプルのサイズ (例えば、各トレーニング・サンプルの句の数) は、品質に影響を与える可能性があります。
- クラスの分離は重要です。 言い換えると、トレーニング (およびテスト) データの間のクラスは、誤分類を避けるために、相互に意味的に区別できなければなりません。 Watson Natural Language Processing の分類アルゴリズムは単語の埋め込みに依存しているため、セマンティック・オーバーラップが多すぎるテキスト例が含まれているトレーニング・クラスは、高品質の分類を計算できなくなる可能性があります。 クラス間の意味的類似性を評価するためにより洗練されたヒューリスティックが存在する可能性がありますが、各クラスのいくつかの例の単純な「目のテスト」から始めて、それらが適切に分離されているかどうかを識別する必要があります。
- トレーニングにはバランスの取れたデータを使用することをお勧めします。 理想的には、トレーニング・データ内の各クラスからのほぼ同数の例が存在する必要があります。そうでない場合、分類子は、トレーニング・データ内の表現がより大きいクラスにバイアスがかけられる可能性があります。
- トレーニング・データ内の一部のクラスが、他のクラスと比較して十分に表現されていない状況を避けることをお勧めします。
制限と注意事項:
- CNN 分類ブロックには、1000 個のコード・ポイントの事前定義シーケンス長があります。 この制限は、パラメーター
max_phrase_len
を変更することにより、トレーニング時に構成できます。 このパラメーターには最大限度はありませんが、句の最大長を増やすと、CPU およびメモリーの消費量に影響します。 - SVM ブロックには、シーケンスの長さに関するこのような制限はなく、より長いテキストで使用できます。
新規データへのモデルの適用
データ・セットでモデルをトレーニングした後、既存の事前トレーニング済みブロックで使用する場合と同様に、run()
メソッドを使用して新規データにモデルを適用します。
サンプル・コード
アンサンブル・モデルの場合:
# run Ensemble model on new text ensemble_prediction = ensemble_classification_model.run("new input text")
SVM モデルおよび CNN モデルの場合 (例えば、CNN の場合):
# run Syntax model first syntax_result = syntax_model.run("new input text") # run CNN model on top of syntax result cnn_prediction = cnn_classification_model.run(syntax_result)
ユース・ケースに適したアルゴリズムの選択
ユース・ケースに最も適したモデル・アルゴリズムを選択する必要があります。
SVM、CNN、およびトランスフォーマーを選択する際には、以下を考慮してください。
変圧器ベースのスレート
- 高品質が必要で、より高いコンピューティング・リソースが使用可能な場合に選択します。
CNN
- 適切なサイズのデータが使用可能な場合に選択します
- 必要な言語で GloVe 埋め込みを使用できるかどうかを選択します
- 単一ラベルと複数ラベルの間のオプションがある場合に選択します
- CNN は、埋め込みを微調整することで、不明な用語や新しいドメインのパフォーマンスを向上させることができます。
SVM
- より簡単で単純なモデルが必要な場合に選択します
- SVM のトレーニングと推論にかかる時間が最速です
- データ・セット・サイズが小さい場合に選択します
SVM を選択する場合は、SVM のさまざまな実装から選択する際に、以下の点を考慮する必要があります。
- SVM は複数ラベル分類子をトレーニングします。
- クラスの数が多いほど、トレーニング時間が長くなります。
- TF-IDF:
- データ・セットが小さい場合、つまり、少数のクラス、少数の例、および短いテキスト・サイズ (例えば、文中の句が少数) を持つ場合は、SVM を使用した TF-IDF ベクトル化を選択します。
- SVM を使用する TF-IDF は、分類ブロック内の他のアルゴリズムよりも高速です。
- 必要な言語の埋め込みが使用できない場合は、「TF-IDF」を選択します。
- 使用:
- データ・セットの入力テキストに 1 つ以上の文が含まれている場合は、SVM での Universal Sentence Encoder (USE) を選択します。
- USE は、ワードまたはセンテンスのコンテキストを理解することが重要なデータ・セットでパフォーマンスを向上させることができます。
アンサンブル・モデルは、複数の個別 (多様な) モデルを結合して、優れた予測能力を提供します。 このモデル・タイプについては、以下の主要なデータを考慮してください。
- アンサンブル・モデルは、CNN、SVM と TF-IDF、および SVM と USE を組み合わせたものです。
- これは最も使用しやすいモデルです。
- これにより、個々のアルゴリズムよりもパフォーマンスが向上する可能性があります。
- これは、あらゆる種類のデータ・セットに対して機能します。 ただし、大規模なデータ・セット (20000 を超える例) のトレーニング時間が長くなる可能性があります。
- アンサンブル・モデルでは、重みを設定できます。 これらの重みは、アンサンブル・モデルが個々の分類子の結果をどのように結合するかを決定します。 現在、重みの選択はヒューリスティックであり、試行錯誤によって設定する必要があります。 関数自体に用意されているデフォルトの重みは、探索の開始点として適しています。
親トピック: 独自のモデルの作成