Fione開発版で文章列をAutoMLの特徴量に使う

問い合わせの本文やニュース記事のように、値がほとんど重複しない文章列は、値の出現頻度だけでは内容の違いを表しにくいものです。Fioneの開発版では、文章に含まれる単語の使われ方を数値に変換し、分類や回帰に使う派生特徴量の候補に加えます。あわせて、短い学習でも候補を評価する時間を確保するようになりました。

文章列を最大32個の数値に変換する

対象は、内部の順位付けで上位6つに入る文字列列です。各列の欠損を除いた先頭最大1,000件で語数を数え、その中央値が5語以上の列を文章と判定します。学習側の入力から最大2万行を使い、3文書以上に現れる語を最大3万語までTF-IDFで重み付けします。その行列を打ち切りSVDで最大32成分に圧縮します。語彙や行列のサイズが足りないと成分数が減り、候補の特徴量が生成されない場合もあります。元の値が欠損なら、生成した値も欠損のままです。

成分は単語の出現傾向を表す数値です。学習データに話題名を用意する必要はありません。日本語など単語境界が空白で区切られない文章では、内蔵の語判定やベクトル化で意図した単語に分かれるかを手元のデータで確認してください。

学習画面で派生特徴量を有効にする

開発版の学習画面で派生特徴量を有効にし、本文の列を入力、分類ラベルなどを目的列にして学習します。設定名は feature_engineering で、初期値は true です。無効にすると文章由来の成分も含めて派生特徴量の選別を省きます。文章列が条件を満たすとこの候補を先に評価しますが、採用は他の候補と同じく損失の比較で決まります。成分数や語数のしきい値は実装上の固定値です。

短時間の学習では選別の時間配分が変わる

従来は候補の選別に残り時間の10%を割り当てていました。変更後は、残り時間の10%と「30秒または残り時間の30%の短い方」を比べ、長い方を使います。選別開始時に60秒残っていれば18秒、180秒なら30秒、600秒なら60秒です。基準は学習画面に指定した総時間ではなく、選別を始める時点の残り時間です。

時間切れで最後の確認まで進めない場合は、それまでの判定で採用され、損失が5%以上減った候補群を残します。この割合は選別中の損失で測り、精度の上昇幅とは別です。選別に時間を割くと後続のモデル探索に使える時間も変わります。PRではニュース分類などで精度が改善した例があります。実際の効果は、同じ学習時間で有効・無効を切り替え、学習から分けたテストデータで比較できます。

この開発版で学習したモデルは、学習と予測で同じコミットの環境を使って検証してください。以前の実装で読み込めても、予測や説明が正しく動くとは限りません。

関連PR

Fioneのモデル説明案で予測の理由と診断を確認する

FioneのPython刷新案に、予測の理由やモデルの弱点を調べる説明機能が加わりました。学習してスコアを比較する流れから一歩進み、列ごとの寄与度、分類・回帰の診断、部分依存を画面とAPIで確認する提案です。

学習後の診断と各行の理由

モデルの指標タブでは、交差検証のout-of-fold予測から混同行列、クラス別指標、ROC・適合率再現率曲線、キャリブレーション、回帰の残差を表示します。独立したテストデータの評価とは異なり、やや楽観的になり得る点を踏まえて読みます。

説明タブには寄与度から作る重要度と部分依存を表示します。予測結果画面では先頭5行の理由を確認できます。寄与度は分類なら確率、回帰なら目的変数の単位へ変換して合成する近似で、厳密なShapley値や因果関係を示すものではありません。

学習後の説明計算は初期値で有効

FIONE_EXPLAIN_AFTER_TRAINING=true

初期値trueでは、学習後に短い説明ジョブをキューへ追加します。忙しい環境ではfalseにして必要時だけ計算できます。環境変数は起動時に読み込まれるため、配置方法に合わせて再起動します。

ジョブは最大1,000行の寄与度から重要度を作り、上位10列の部分依存を保存します。説明にはデータが必要で、インポート済みモデルや学習データ削除後のモデルでは、説明タブから列のそろったデータセットを選びます。保存済みの曲線がある場合と新規計算できる場合を区別してください。

バッチ予測とServingは明示して要求する

バッチ予測の「各予測の内訳を含める」は初期値で無効です。有効にするとcontrib_<列名>などの列が増え、処理時間とCSV容量も増えます。対象は最大10万行で、幅の広いモデルでは特に大きな出力になります。

Servingはリクエストにcontributions=trueを指定すると寄与度を返します。省略・false・nullなら従来の応答を維持し、それ以外の型は400です。

FIONE_SERVING_MAX_CONTRIBUTION_INSTANCES=100
FIONE_SERVING_MAX_CONTRIBUTION_REQUESTS=2

これは既定値です。寄与度付きリクエストは100件の入力、同時2リクエストまでで、混雑時は503となります。列数やクラス数によってさらに制限され、説明の計算中は通常予測も同じモデルを待ちます。Servingに認証が追加されるわけではありません。

共有範囲と読み違いを確認する

Web側のその場の説明計算はサーバー全体で1件ずつ、待機4件・最大15秒です。閲覧者の操作でもCPUやメモリーを使います。大きなモデルや信頼未確認のインポートはその場では拒否され、書き込み権限を要するジョブでの説明になります。

診断にはクラスラベルと、回帰では最大2,000件の実測目的値が残り、プロジェクトの閲覧者へ見えます。診断はモデルのエクスポートにも入り、元データを削除しても残ります。説明結果にもカテゴリ値などが残るため、共有前に内容を確認します。旧実装は診断を含むエクスポートを拒否し、同じ20.0.0表記でも互換性を判断できません。

リークの疑いが強い列への警告も追加されますが、スコアによる疑いだけでは入力列を自動除外しません。警告がないこともリークがない保証にはなりません。Notebook連携は別の計画で、今回の説明機能に含まれません。

関連PR

Fessの英単語検索で大文字と語尾を考慮する曖昧検索の修正案

Fessで英単語の入力ミスを含む検索をすると、小文字なら見つかるのに先頭を大文字にすると見つからない場合があります。PR #3726は、通常の検索に自動で加わる曖昧検索を、検索語の解析後に行う修正案です。

入力した文字列と索引の語をそろえる

従来の処理では、索引側で小文字化や語尾処理を受けた語に対して、入力した文字列をそのまま使って編集距離を計算していました。修正案は検索解析器を通してから曖昧一致させます。PRの検証用索引では、fabianに対するFbian、onboardingに対するOnbordingのような入力で改善が報告されています。件数や改善幅は索引と解析器によるもので、すべての環境で同じ結果になる保証はありません。

foo-barのように複数のトークンへ分かれる入力は、曖昧検索部分でもすべてのトークンを要求します。一部だけの一致によって候補が広がりすぎることを抑えるためです。

設定の初期値は変わらない

新しい有効化設定はありません。修正を含む検証ビルドで、既存のquery.boost.fuzzy.*を引き続き使います。標準値は次のとおりです。

query.boost.fuzzy.min.length=4
query.boost.fuzzy.title=0.01
query.boost.fuzzy.content=0.005
query.boost.fuzzy.title.fuzziness=AUTO
query.boost.fuzzy.content.fuzziness=AUTO

titleとcontentの両方で、prefix_lengthは0、expansionsは10、transpositionsはtrueです。最小長4の判定は入力文字列の長さですが、AUTOが許す編集距離は解析後の各トークンの長さに応じて決まります。短くなった語では許される編集回数も変わりえます。

日本語の誤字訂正を追加する変更ではない

漢字・ひらがな・カタカナ・ハングルを含む入力には、この暗黙の曖昧検索を追加しません。日本語などの誤字訂正を新たに提供する機能ではありません。明示的なfoo~1の構文、フレーズ検索、言語別フィールドの処理も今回の変更対象外です。解析後にストップワードだけになる入力は、この部分から近似語のヒットを得ません。

検証時は同じ索引で、小文字と大文字、語尾変化、ハイフン入り、正しく綴った単語を比較します。通常の単語にも低スコアの候補が増える可能性があり、上位順位が常に同じとは限りません。適合率と検索結果の順序も確認してから導入を判断します。

関連PR