fasttextによる文書分類
正解ラベルの付いた文章から、分類モデルを作ります。 問い合わせを種類別に振り分ける、レビューを評価別に分ける、といった使い方をします。
作ったモデルはfasttextによる予測で使います。
入出力
| ポート | 内容 |
|---|---|
| 入力データ | データ |
| 機械学習モデル | モデル |
| 文書ベクトル | データ |
出力が 2 つあります。 機械学習モデル をfasttextによる予測につなぎます。
Spark エンジンでは動きません。
出力の形
文書ベクトル は、入力の列をすべて残したまま、右に ftv_0 〜 ftv_<次元数 - 1> の列が増えた表です。既定の次元数は 100 なので ftv_0 〜 ftv_99 の 100 列になります。
行ごとに、その文章に出てきた単語のベクトルをまとめた値が入ります。まとめ方は各単語の特徴量の集計方法を設定で選びます。
| 行の状態 | ftv_* の値 |
|---|---|
| 文章が空欄 | すべて 0 |
| モデルが知っている単語が 1 つもない | すべて 0 |
この列は、ほかのモデル(決定木や回帰)の説明変数としても使えます。
設定項目
- 目的変数列を選択必須
- 正解のラベル。文字列と数値が選べます。1 列だけです。
- 文書の列を選択必須
- 分かち書き済みの文章。文字列の列だけ選べます。1 列だけです。
オプション
15 項目あります。すべて既定のままで動きます。
15 項目の既定値と意味
- 学習率を設定
- 既定は
0.1。1 回の更新でどれだけ動かすか。 - 単語ベクトルの次元数を設定
- 既定は
100。この数だけftv_*の列ができます。 - 前後何文字をコンテキストとして考慮するか設定
- 既定は
5。前後いくつの単語を一緒に見るか。 - 学習回数を設定
- 既定は
5。データを何周するか。 - 無視する単語の出現回数の下限を設定
- 既定は
1。これ未満しか出ない単語を無視します。 - 無視する目的変数の出現回数の下限を設定
- 既定は
1。件数の少ないラベルを無視します。 - 使用するngramの最小文字数を設定
- 既定は
0。 - 使用するngramの最大文字数を設定
- 既定は
0。最小・最大とも 0 なので、既定では単語を文字に割らずに扱います。 - ネガティブサンプリングで使用する負例のサンプル数を設定
- 既定は
5。損失関数にネガティブサンプリングを選んだときに効きます。 - 学習に使用するNgramの文字数を設定
- 既定は
1。いくつ続きの単語をひとまとまりとして扱うか。 - 損失関数を設定
- ソフトマックス(既定)/ ネガティブサンプリング / ハイエラキカルソフトマックス / ワンvsオール(マルチラベル分類に対応)。
- 分解したNgramの挿入数を設定
- 既定は
2000000。 - 学習率の更新を行う割合を設定
- 既定は
100。 - 学習時に単語を無視する確率を設定
- 既定は
0.0001。よく出る単語を間引く度合い。 - 各単語の特徴量の集計方法を設定
- 平均(既定)か合計。文書ベクトルの作り方だけに効き、モデルの学習には影響しません。
まず既定のまま試す
パラメータは既定のままで動きます。 精度が足りないときに、学習回数を設定を増やす → 単語ベクトルの次元数を設定を上げる、という順で変えてください。
学習回数を増やすと時間がかかり、増やしすぎると訓練データに合わせすぎます。
先に形態素解析が要る
このノードは、単語が空白で区切られていることを前提にします。 先に形態素解析を掛けてください。
fasttextによる予測でも同じ前処理をします。 学習と予測で分け方が違うと精度が落ちます。
1 つのラベルしか付けられない
目的変数は 1 列で、1 行につき 1 つのラベルだけを学習します。 目的変数列の値をそのままラベルにするので、1 つの文書に 2 つ以上のラベルを与えることはできません。
損失関数を設定にワンvsオール(マルチラベル分類に対応)という選択肢がありますが、このノードからは複数のラベルを渡せないため、マルチラベルの学習にはなりません。 fasttextによる予測が返すのも、いちばん確からしいラベル 1 つだけです。
複数のラベルを付けたいときは、ラベルごとに「付くか付かないか」の列を作り、ラベルの数だけこのノードを並べてそれぞれモデルを作ってください。
エラーと対処
列を選ばずに実行した
「目的変数列を選択」または「文書の列を選択」が空のまま実行したときに出ます。前の処理で列名が変わり、選んでいた列が入力データからなくなったときにも同じメッセージです。
対象の列が選択されていません。
直し方 — 列を選び直してください。
よく使う例
1. 問い合わせを分類するモデルを作る
過去の問い合わせに種類が付いていて、今後は自動で振り分けたいとき。
入力
| 本文_形態素 | 種類 |
|---|---|
返品 手続き 送料 | 返品 |
配送 日時 変更 | 配送 |
設定
| 設定項目 | 値 |
|---|---|
| 目的変数列を選択 | 種類 |
| 文書の列を選択 | 本文_形態素 |
出力 — 機械学習モデル と、ftv_0 〜 ftv_99 が足された 文書ベクトル が出ます。モデルをfasttextによる予測につなぎます。
2. 精度を測る
どれくらい当たるかを数字で知りたいとき。
入力 — 例 1 と同じ
設定 — 先にランダムにデータを分割で訓練と検証に分け、訓練側だけをこのノードに入れます。検証側はfasttextによる予測に入れて、正解と見比べます。
出力 — 検証側に 予測結果 が付くので、種類 と一致した割合が正解率です。
3. 件数の少ないラベルを外す
5 件しかない種類が混ざっていて、モデルが不安定なとき。
入力 — 例 1 と同じ
設定
| 設定項目 | 値 |
|---|---|
| 無視する目的変数の出現回数の下限を設定 | 10 |
出力 — 10 件未満のラベルは学習から外れます。
4. 精度が足りないとき
既定のままでは当たらないとき。
入力 — 例 1 と同じ
設定
| 設定項目 | 値 |
|---|---|
| 学習回数を設定 | 20 |
| 単語ベクトルの次元数を設定 | 200 |
出力 — 時間はかかりますが、当たり方が変わります。次元数を上げると ftv_* の列も 200 本に増えます。
5. 文書ベクトルだけを使う
分類そのものではなく、文章を数値にして別のモデルに入れたいとき。
入力 — 例 1 と同じ
設定
| 設定項目 | 値 |
|---|---|
| 各単語の特徴量の集計方法を設定 | 平均(既定) |
出力 — 文書ベクトル の ftv_0 〜 ftv_99 を、決定木や回帰の説明変数に使えます。テキストから特徴量抽出と違い、列数が単語の種類に左右されません。