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

Fessのinitコマンドで初回起動前のパスワードと暗号鍵を設定する

Fessを新規に導入するときは、管理者の初期パスワードと、保存した認証情報の暗号化に使う鍵を最初に決めておきたいところです。開発版に追加されたfess-setup initで、この2項目を初回起動前に設定できるようになります。

初回起動前に実行する

出荷時のindex.user.initial_passwordはadmin、app.cipher.keyは___change__me___です。対応する開発版を展開し、まだFessを起動していない状態で、Fessの配置ディレクトリーから次を実行します。設定ファイルを書き換えられる権限が必要です。

bin/fess-setup init

オプションを省略すると、英数字16文字の管理者パスワードと英数字32文字の暗号鍵をランダム生成します。既定の設定ファイルはFess配下のapp/WEB-INF/classes/fess_config.propertiesです。RPM・DEB形式の配置では、対象ファイルを明示します。

bin/fess-setup init --config /etc/fess/fess_config.properties

成功後に表示される生成パスワードを安全に控えてから、Fessを初めて起動します。生成パスワードはコマンド実行時に表示され、設定ファイルにも書き込まれます。ターミナル出力や設定ファイルを不必要に共有しないようにします。暗号鍵そのものは通常の成功メッセージには表示されません。

既存環境のパスワード変更には使わない

初期パスワードはユーザーインデックスの作成時に読み込まれます。既に起動してユーザーを作成した環境で設定ファイルを変更しても、既存の管理者パスワードは変わりません。

また、暗号鍵を変えると、以前の鍵で保存したクロール設定などの認証情報を復号できなくなります。出荷時の値から変更済みの鍵がある場合、通常はコマンドが書き換えを拒否します。--forceで上書きはできますが、既存データを新しい鍵で暗号化し直す機能ではありません。新規導入向けのコマンドと考え、既存環境の鍵を安易に置き換えないようにします。移行や復元のためにも、設定ファイルと暗号鍵を安全に保管します。

値を指定する場合の条件

--admin-passwordと--cipher-keyで値を指定することもできます。ただし、コマンドライン引数は同じマシンの他の利用者から見える場合があるため、通常は自動生成を使う方が扱いやすいでしょう。

パスワードには空文字、前後の空白、制御文字、出荷時のadminを指定できません。明示する暗号鍵は空白を含まない印字可能なASCII文字の16・24・32文字で、出荷時の鍵も拒否されます。暗号方式がaes以外に設定されているファイルには対応しません。

対象の設定ファイルは既に存在する必要があります。2項目の既存行を置き換え、項目がなければ追記します。Fessを起動したり、既存ユーザーをリセットしたりするコマンドではないので、実行後の設定内容と初回ログインを確認して導入を進めます。

関連PR