コンテンツにスキップ

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 を、決定木や回帰の説明変数に使えます。テキストから特徴量抽出と違い、列数が単語の種類に左右されません。

関連