テキストマルチラベル分類モデル開発記録

テキスト分類は、NLP アプリケーション分野で最も一般的かつ重要なタスク タイプであり、機械学習の分野における古典的なアプリケーション シナリオの 1 つでもあります。

この記事では、著者の仕事における実際のケースを使用して、機械学習と最適化の経験を通じてテキストのマルチラベル分類を実現するプロセスについて説明します。

この記事に含まれる一部の機械学習用語については、その意味がわからない場合は、Baidu を自分で調べるか、機械学習の基本を参照してください。

事例紹介

事例: テスト問題の知識点の予測

説明: 小学校および中学校のテスト問題は 1 つ以上の知識ポイントに対応しています。機械学習を通じてモデルをトレーニングする場合は、テスト問題のテキストからテスト問題の知識ポイントを予測できます。

このケースは、ナレッジ ポイントがラベルに属するテキストのマルチラベル分類タスクに抽象化できます。

機械学習ライブラリ: scikit-learn

データ収集

機械学習タスクの基礎はデータを持つことなので、まずデータを収集する必要があります。データは状況に応じてさまざまな方法で収集できます。

この場合、開発プログラムはデータ サービスまたはデータ インターフェイスに接続し、データを抽出して保存します。詳細な説明はここでは行いません。

データを探索する

この場合、データを調査する際に、実際の状況に応じて次の統計指標が定式化されました。

高校の化学のテストデータを例に挙げます。

1. 試験問題の総数

テスト問題の総量を数え、テスト問題の量を観察します。テスト質問の総量のサイズは、合計サンプル サイズのサイズに直接影響します。テスト質問は、サンプルになる前に処理する必要がある生データです。

ここに画像の説明を挿入

2. ラベル種類の割合

この場合、タグには NODE、KNOWLEDGE_POINT、TESTING_POINT の 3 種類があります。

このうち、NODE タイプ ラベルは業務上除外する必要があるため、データセットを処理する際には、NODE タイプ ラベルのデータも除外する必要があります。タイプ比率を観察すると、NODE タイプ ラベルの影響が大まかにわかります。データセット全体に影響を与えます。

ここに画像の説明を挿入

実際にさまざまなコースのナレッジ ポイント予測モデルを開発する場合、個々のコースで使用できるサンプル サイズはサンプル サイズの合計よりもはるかに小さいため、分析を通じて、ラベル内の NODE タイプの割合が高すぎることが判明し、結果的に、除外されたサンプルが多数あります。この指標は分析において大きな役割を果たします。

3. ラベルのサンプルサイズ統計

統計ラベルのサンプル サイズでは、各ラベルのサンプル サイズを観察でき、ラベルの使用状況を分析するのに役立ちます。

ここに画像の説明を挿入
ここに画像の説明を挿入

これら 2 つの図は、ラベル サンプル サイズ統計グラフのスライダーを異なる位置で示しています。サンプル サイズの最大位置と中央値の位置の間にギャップがあることがわかります。これは、サンプル データ セットが非常に不均衡であることを示しています。ラベルの数は非常に少ないです。

そこで、実際にモデルを開発する際に、特定のしきい値を超えるサンプル サイズを持つラベルを選択し、これらのラベルのサンプルを使用してサンプル データ セットを形成する、一般的なラベル戦略を策定しました。この戦略では、モデルの予測可能なラベルは入力データセット内のラベルの数に依存するため、ホット ラベルの数も考慮する必要があります。この場合、入力データセット内のラベルの数はホット ラベルの数が多すぎる場合 ホット ラベルの数が少ない場合、モデルが予測できるラベルの数が少なくなり、モデルがアプリケーションの要件を満たせない可能性があります。

4. ラベルのサンプルサイズと品質の分布

各タグのサンプル サイズ、つまり各タグが使用される回数を数えてから、タグのサンプル サイズの分布を数えます。これは、タグの使用状況を観察するのに役立ちます。

ここに画像の説明を挿入

上の図からわかるように、サンプル サイズが (100, 150] の範囲にあるラベルは 101 個あり、サンプル サイズが 150 未満のラベルは 416 個あります。

この指標から、ラベル サンプル サイズの品質分布を観察することができ、人気のあるラベル サンプル サイズのしきい値を決定するのにも役立ちます。

他にも次のようなものを数えることができます。

  • サンプルの合計サイズ - (この場合) はテスト質問の合計数とは異なります。サンプルは、テスト質問が処理された後にモデルをトレーニングするために使用できるデータです。通常、サンプルの合計サイズは、サンプルの合計サイズよりも小さくなります。テスト問題の総数。

  • サンプルラベルの量と品質の分布 - サンプル内のラベル数の全体的な分布を観察できます。

  • サンプル テキストの長さの質量分布 - サンプルのテキストの長さの全体的な分布を観察できます。

  • 単語の頻度分布 - テキストがセグメント化された後、単語の頻度をカウントし、単語の頻度の分布を観察します。これは、特徴エンジニアリングの参考となります。

データセットをより包括的に理解するために、より多くの指標を定式化することができ、指標を観察することで良いインスピレーションを得ることができ、モデルの最適化に非常に役立ちます。

アルゴリズムを選択する

この場合、scikit-learn を使用してマルチラベル分類タスクを実装し、スクリーニング後、最終的に次のアルゴリズムが保持されます。

アルゴリズム 序章
リニアSVC 一般的に使用される SVM である線形サポート ベクトル分類は、多数のサンプルに適しています。
SGD分類子 確率的勾配降下法分類器。確率的勾配降下法を使用してモデルをトレーニングし、デフォルトで線形 SVM を近似する線形分類器です。
多項NB 多項ナイーブ ベイズは、多項分布データに対してナイーブ ベイズ アルゴリズムを実装します。
補体NB 相補的ナイーブ ベイジアンは、標準多項式ナイーブ ベイジアン アルゴリズムの適応アルゴリズムであり、不平衡データに特に適しています。
KNeighborsClassifier K 最近傍分類子は、K 最近傍選択アルゴリズムを実装します。

このアルゴリズムはこの記事の範囲外であるため、ここでは詳しく説明しません。後日、機会があれば別途紹介させていただきます。

アルゴリズムの選択を容易にするために、モデル選択モジュールを開発し、各アルゴリズムをコアとしてパイプラインを構築し、グリッド検索用のいくつかのハイパーパラメーター オプションをプリセットしてから、データを選択モジュールに入力しました。 。評価レポートは完全に信頼できるものではなく、参考としてのみ使用できます。モデルのパフォーマンスが低い場合は、適切に調整されていない可能性があるためです。

評価レポートを分析し、実践とニーズを組み合わせた後、最終的に SGDClassifier が選択されました。

サンプルを準備する

このリンクの主なタスクは、データ仕様とビジネス要件に従って、要件を満たさないデータをデータ セットから削除し、同時にデータを下流タスクで処理できる形式に変換することです。

この場合、データ形式は次のようになります。

  • ナレッジポイントデータはツリー構造で存在します
  • テスト問題の知識ポイントタグはリスト形式で存在します。

ビジネス要件は次のとおりです。

  • できるだけ多くの予測可能な知識ポイント
  • 可能な限り高い予測精度

データ形式とビジネス要件を考慮して、整理されたクリーニングと変換の目標には主に次のものが含まれます。

  • テキスト処理戦略。試験問題の文章を細分化し、戦略に応じて有効な文章をサンプル候補として選定します。
  • タグ処理戦略。サンプル内の関連するナレッジ ポイントを削除し、最も詳細なナレッジ ポイントのみを保持します。
  • ビジネス ニーズを考慮してください。サンプル サイズのしきい値を設定することで、ラベル サンプル サイズがサンプル サイズのしきい値より小さいラベル サンプルを削除し、ラベルの数と精度を調整します。

テキスト処理戦略

テキスト処理の目的は主に 2 つの部分で構成されます。

  • テキストをモデルが使用できる形式に処理します。
  • サンプル セットのテキストが可能な限り標準化されていることを確認します。

テキストをモデルが使用できる形式に処理します。

特徴抽出モジュールはスペース単語分割を使用しますが、これは中国語には不向きなので、中国語に対していくつかの前処理を行う必要があります。このとき、中国語の文章を単語に分割し、それらをスペースで接続する単語分割ツールが必要です。特徴抽出モジュールを形成し、処理するフォーマット。

この場合に使用される切削工具という言葉はjiebaです。単語を切り取った後、単語と単語をスペースでつなぎますが、このとき中国語の文章はスペースで区切られた文章となり、英語の文章の形式と一致します。

開発中に、jieba の 2 つの切断モード、精密モードとフル モードを試しました。

厳密モードでは元のテキストの順序が保存され、単語の分割順序に従って結合することで元のテキストを復元できます。

フル モードでは、テキスト内の単語または語句の検索が試みられ、一部の文字が再利用されて単語の数が増加しますが、元のテキストの順序は失われます。

例は次のとおりです。

# 精确模式
seg_list = jieba.cut("我来到北京清华大学", cut_all=False)
print("/ ".join(seg_list))
# 我/ 来到/ 北京/ 清华大学

# 全模式
seg_list = jieba.cut("我来到北京清华大学", cut_all=True)
print("/ ".join(seg_list))
# 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学

このケースの最適化の実践では、精密モード + N-Gramの組み合わせにより、モデルがより優れた効果を達成できることがわかりました。

サンプル セットのテキストが可能な限り標準化されていることを確認します。

元のデータには通常、異常なテキストが含まれています。これらのテキストをサンプルとして使用してモデルをトレーニングすると、モデルの学習効果が低下する可能性があります。そのため、実際の状況に応じていくつかのクリーニング戦略をカスタマイズする必要があります。サンプルセットは可能な限り標準化されています。

この場合、単語の区切り数が 2 未満のテキストは破棄されます。

タグ処理ポリシー

ラベル処理の主な目的は、サンプル セットのラベルが可能な限り標準化されていることを確認することです。

この場合、タグは知識ポイントです。

ナレッジポイントはツリー構造で存在し、3 種類に分かれており、要件に応じて 2 種類のナレッジポイントだけが必要になります。

元のデータを分析したところ、以下の問題が見つかりました。 (一部の問題はモデル最適化分析で見つかりました)

  1. 一部の古い試験問題には 3 種類の知識ポイントがあります
  2. 少数のテスト問題のラベル リストに重複したナレッジ ポイントが表示されます。
  3. 一部のコースの知識ポイントの数は膨大ですが、実際に適用される知識ポイントの数は比較的少ないです
  4. 知識ポイントに関連する試験問題の量は非常に不均一です
  5. 一部のコースでは、知識ポイントを手動でマークする基準が統一されていません。
  6. 一部のコースの知識ポイントには同義語があり、異なるテスト問題では同義の異なる知識ポイントが使用されます。

これらの問題の中には、プログラムで処理できるものもありますが、手動での処理が必要なものもあります。

手動処理​​はコストが高いため、この場合はプログラムで処理できる問題のみが処理されます。

ビジネスニーズを考慮して

テキストやラベルを可能な限り標準化した上で、ビジネスニーズも考慮する必要があります。

機械学習タスクにはサンプルサイズの要件があり、データ量が少なすぎると機械学習の適用には適しません。

分類タスクでは、カテゴリの数が増えるほど、モデルの予測精度を向上させることが難しくなります。実際のアプリケーションでは、ほとんどのサンプル セットが不均衡であるため、モデルの予測精度を向上させることがさらに困難になります。

この場合、ラベルのサンプルサイズが非常にアンバランスであるため、サンプルセットを作成する際にサンプルサイズを満たさないラベルデータを破棄する必要がありますが、これによりモデルが予測できるラベルの数が減少するため、モデルの予測精度を最適化し、予測可能なラベルの数のバランスをとることができます。

この場合、サンプル セット内のラベルの数は、サンプル サイズの最小しきい値を制御することによって制御されます。

トレーニングモデル

サンプル セットの準備ができたら、モデルをトレーニングする準備が整います。

この場合、モデルのトレーニング プロセスは主に、入力データの準備、モデル パイプラインの構築、モデルの評価の 3 つのステップに分かれています。

コアコードは次のとおりです。

from sklearn.preprocessing import MultiLabelBinarizer
from sklearn.feature_extraction.text import HashingVectorizer, TfidfTransformer
from sklearn.multioutput import MultiOutputClassifier
from sklearn.linear_model import SGDClassifier
from sklearn.pipeline import Pipeline
from .utils import mutillable_train_test_split
from .accuracy import mean_top_k_allin, mean_top_k_cross

......

# 拆分训练集和测试集
X_train, X_test, y_train, y_test = mutillable_train_test_split(
    texts, labels, test_fraction=0.2)

# 标签向量化
mlb = MultiLabelBinarizer()
y_train = mlb.fit_transform(y_train)
y_test = mlb.transform(y_test)

# 初始化分类器pipeline
text_clf = Pipeline([
    ('vect', HashingVectorizer(ngram_range=(1, 3), n_features=(2 ** 16))),
    ('tfidf', TfidfTransformer()),
    ('clf', MultiOutputClassifier(
        estimator=SGDClassifier(loss='modified_huber', early_stopping=True),
        n_jobs=clf_n_jobs)
    )
])

# 训练
text_clf.fit(X_train, y_train)

# 评估
pred_proba_test = text_clf.predict_proba(X_test)  # 概率预测
# 评估准确率
cross_acc_test_top1 = mean_top_k_cross(y_test, pred_proba_test, labels=labels, k=1)
cross_acc_test_top2 = mean_top_k_cross(y_test, pred_proba_test, labels=labels, k=2)
cross_acc_test_top3 = mean_top_k_cross(y_test, pred_proba_test, labels=labels, k=3)
# NOTE: 对于allin指标,太小的k不合理,因为真实标签数量可能大于k。
allin_acc_test_top5 = mean_top_k_allin(y_test, pred_proba_test, labels=labels, k=5)
allin_acc_test_top10 = mean_top_k_allin(y_test, pred_proba_test, labels=labels)
logger.info('=' * 50)
logger.info(f'Test CrossAcc Top1: {
      
      cross_acc_test_top1}')
logger.info(f'Test CrossAcc Top2: {
      
      cross_acc_test_top2}')
logger.info(f'Test CrossAcc Top3: {
      
      cross_acc_test_top3}')
logger.info(f'Test AllinAcc Top5: {
      
      allin_acc_test_top5}')
logger.info(f'Test AllinAcc Top10: {
      
      allin_acc_test_top10}')
logger.info('=' * 50)

データ入力の準備をする

対応するコード:

# 拆分训练集和测试集
X_train, X_test, y_train, y_test = mutillable_train_test_split(
    texts, labels, test_fraction=0.2)

# 标签向量化
mlb = MultiLabelBinarizer()
y_train = mlb.fit_transform(y_train)
y_test = mlb.transform(y_test)

データセット部分の分割

予測可能な知識ポイントの数を増やすために開発されたカスタム データセット分割方法が使用されました。

中心的なアイデア: ラベル内に存在する可能性のある潜在的な関係に関係なく、複数分類のアイデアでデータを分割します。

実現ロジック: ラベルに従ってグループ化し、各グループで指定された割合でテスト セットをサンプリングし、これらのデータを組み合わせてテスト セットを生成し、残りのデータ セットをトレーニング セットとして使用します。トレーニング セットとテスト セットはテキストに従ってグループ化およびマージされ、マルチラベルに対応するテキストの形式が復元されます。

短所: 元のテキストラベルの対応が破壊されます。

ラベルのベクトル化部分

sklearn モジュールを使用して、ラベルをモデルが認識できる形式に変換します。

モデルのパイプラインを構築する

対応するコード:

# 初始化分类器pipeline
text_clf = Pipeline([
    ('vect', HashingVectorizer(ngram_range=(1, 3), n_features=(2 ** 16))),
    ('tfidf', TfidfTransformer()),
    ('clf', MultiOutputClassifier(
        estimator=SGDClassifier(loss='modified_huber', early_stopping=True),
        n_jobs=clf_n_jobs)
    )
])

# 训练
text_clf.fit(X_train, y_train)

パイプラインの最初の 2 つのステップは特徴抽出で、最後のステップはアルゴリズム モデルです。パイプライン全体がエンドツーエンドのモデルを構成します。

特徴抽出

テキスト特徴抽出には、バッグ オブ ワード モデルの N-Gram モデルが使用されます。

テキスト特徴抽出では、主にトークンの出現数をカウントし、そのトークンの出現数を特徴として使用します (トークンとは単語であり、実際には単語の出現頻度の統計です)。

sklearn には、テキストの単語頻度特徴を抽出できる 2 つのクラス、つまりCountVectorizerHashingVectorizerがあります。

どちらのクラスも、テキスト ドキュメントのコレクションをスパース行列であるトークン統計行列に変換できます。

違いは、CountVectorizer が特徴シーケンスをボキャブラリに保存するのに対し、HashingVectorizer はハッシュ関数を使用して特徴シーケンスをスパース行列にマップすることです。

CountVectorizer は語彙を保存するので、この語彙を取得して元の特徴を分析できます。

HashingVectorizer は、ハッシュ関数を使用して特徴シーケンスを疎行列にマップします。これにより、元の特徴は失われますが、メモリは節約されます。

特徴量が非常に大きい場合には HashingVectorizer が適しています. HashingVectorizer では特徴空間サイズを設定できます. ハッシュの衝突を避けるために比較的大きな値が設定されるのが一般的であり, デフォルトは 2**20 です.

実際には、HashingVectorizer の特徴空間のサイズもモデルのサイズに直接影響することがわかっているため、この指標をモデルのサイズを削減するために使用することもできます。もちろん、前提条件はモデル評価指標です。大幅に減ることはありません。

上記の手順では単語の頻度をカウントしますが、2 つの文書が同じトピックについて議論している場合でも、長い文書の方が短い文書よりも平均統計値が高くなるという問題があります。

これらの潜在的な不一致を回避するために、有名な tf-idf アルゴリズムが使用され、単語頻度ベクトルをtf-idf ベクトルに変換できる関連クラスである TfidfTransformer も sklearn で提供されています。

tf-idf は非常に強力ですが、どのアルゴリズムでも使用することはできません。たとえば、単純ベイジアン アルゴリズムでは、tf-idf は推奨されませんが、実際には tf-idf の単純ベイズが使用されます。このモデルはまた、良い。

このケースの実際の調査では、tf-idf を使用しない単純ベイジアン モデルは、tf-idf を使用する単純ベイジアン モデルよりもはるかに優れたパフォーマンスを示します。

以下は、多項式単純ベイズを導入する際の sklearn 公式 Web サイトからのテキストです。

MultinomialNB は、多項分布データに対する単純ベイズ アルゴリズムを実装しており、テキスト分類で使用される 2 つの古典的な単純ベイズ バリアントの 1 つです (通常、データは単語ベクトル数として表されますが、実際には tf-idf ベクトルも適切に機能することが知られています) )。

アルゴリズムモデル

この場合、アルゴリズム モデルの選択は、確率出力と予測精度の 2 つの側面を考慮し、実際の評価を通じて決定されます。

評価モデル

対応するコード:

# 评估
pred_proba_test = text_clf.predict_proba(X_test)  # 概率预测
# 评估准确率
cross_acc_test_top1 = mean_top_k_cross(y_test, pred_proba_test, labels=labels, k=1)
cross_acc_test_top2 = mean_top_k_cross(y_test, pred_proba_test, labels=labels, k=2)
cross_acc_test_top3 = mean_top_k_cross(y_test, pred_proba_test, labels=labels, k=3)
# NOTE: 对于allin指标,太小的k不合理,因为真实标签数量可能大于k。
allin_acc_test_top5 = mean_top_k_allin(y_test, pred_proba_test, labels=labels, k=5)
allin_acc_test_top10 = mean_top_k_allin(y_test, pred_proba_test, labels=labels)
logger.info('=' * 50)
logger.info(f'Test CrossAcc Top1: {
      
      cross_acc_test_top1}')
logger.info(f'Test CrossAcc Top2: {
      
      cross_acc_test_top2}')
logger.info(f'Test CrossAcc Top3: {
      
      cross_acc_test_top3}')
logger.info(f'Test AllinAcc Top5: {
      
      allin_acc_test_top5}')
logger.info(f'Test AllinAcc Top10: {
      
      allin_acc_test_top10}')
logger.info('=' * 50)

この場合、モデルの予測結果はリストです。従来の分類精度指標を使用して一部の予測の精度を評価することは不可能です。そのため、いくつかのマルチラベル精度指標はカスタマイズされており、指標は主に予測を中心に開発されています。 TopKの精度。

TopK 戦略: 予測結果から確率がゼロではないすべてのラベルを取り出し、確率に従って大きいものから小さいものまで並べて、TopK を取得します。

ここでは 2 つのメトリクスが適用されます。

  • means_top_k_cross: TopK ラベル リストと実際のラベル リストの間に共通部分があり、1 として記録されます。それ以外の場合は 0、および統計平均です。
  • means_top_k_allin: TopK ラベル リストには、1 として記録される実際のラベル リスト、それ以外の場合は 0、および統計的平均が含まれます。

モデルのチューニング

これは主に、各段階でのモジュールの選択やハイパーパラメーターの選択など、パイプラインの調整を目的としています。

sklearn のグリッド検索機能を使用して、パイプラインのハイパーパラメーターを調整し、内部でハイパーパラメーターを配置して組み合わせます。ハイパーパラメーターの各グループは 1 回トレーニングされ、評価結果が記録され、最終的に最適なハイパーパラメーターの組み合わせが決定されます。エフェクトが選択されます。

このアイデアを参照して、より複雑なパイプライン ハイパーパラメータ調整を開発できます。

モデルアプリケーション

モデルを保存およびロードします。

from joblib import dump, load

my_model = './model.joblib'
dump(text_clf, my_model)  # 存储模型
model = load(my_model)  # 加载模型

アプリケーション分析

アプリケーション分析は、収集されたアプリケーション データに基づいて、いくつかの合理的な指標を設計し、実際のアプリケーションでのモデルのパフォーマンスを観察します。

アプリケーション分析インジケーターを上記のモデルと組み合わせると、モデルの最適化の方向性と戦略に参考を提供できます。

この場合、アプリケーション分析データ ソースには主に 2 つの部分が含まれます。

  • ユーザーデータ
  • ログデータ

ユーザーデータ

このデータは、ユーザーがモデルを使用するときに記録されたデータから収集され、テスト問題単位で主に次の属性が含まれます。

属性 説明する
ID テスト質問ID
コースイド コースID
予測された モデルによって予測されたラベル
確認済み ユーザーがマークしたラベル
採用された モデルがヒットすると予測したタグの数
予想外の モデルがミスすると予測するラベルの数
確認日 ユーザーがマークした時間

これらのデータに基づいて、さまざまなインジケーターを設計できます。これまでのところ、次のインジケーターは、採用予想外の 2 つの属性を中心に設計されています。

索引 説明(1日あたりのコースごとのグループ化された統計) 使用
毎日のヒット率 平均命中率。 モデルの適用中に観察されたヒット率の全体的な平均パフォーマンス。
日次合計ヒット率 テスト問題の総数に対する、予測結果ですべてヒットしたテスト問題の数の割合。 モデルの適用中にすべてのタグをヒットするパフォーマンスを観察します。
昼の部のヒット率 テスト問題データ全体に対する、予測結果に少なくとも 1 つのヒットがあるテスト問題の数の割合。 モデルの適用中に少なくとも 1 つのタグ ヒットのパフォーマンスを観察します。
1 日あたりの平均ラベル数 テスト項目のラベルの平均数。 ユーザーがマークしたタグの平均数を観察します。
1日あたりの平均ヒット数 予測結果のヒット数の平均。 モデルがヒットしたラベルの平均数を観察します。
1日の平均ミス数 予測結果が外れた平均数。 モデルが見逃したラベルの数の平均を観察します。

上記のプロパティから、ヒット位置に関連するメトリックも計算できますこの場合、予測結果は確率でソートされたTopKの結果となるため、ヒットタグがTop1に近いほど予測効果が高くなります。したがって、ヒット位置関連指標は、モデルの観察にとって一定の参照的意義を有するが、この指標の設計は比較的複雑であり、現在統計は行われていない。

ここでこのケースのインジケーター設計を説明する目的は、実際のアプリケーションでは、特定の状況やニーズに応じてさまざまなインジケーターを設計できることを示すことです。これらのインジケーターには、モデルの最適化に意味がある限り、統一されたルールや制限はありません。 。

ログデータ

特定のアプリケーション シナリオに従って、サービス アプリケーションの状況を分析するためにいくつかのログ分析指標を設計します。

このケース (知識ポイント予測サービス) は、アプリケーション内のテスト ラベル予測サービスのサブサービスです。テスト ラベル予測サービスには現在、進路予測サービス (多分類モデル) というサブサービスがあります。ここで紹介します)。

アプリケーション ログは ELK を使用して分析されます。

テスト項目ラベル予測サービス全体のログ分析のために、現在 4 つの指標が設計されています。

  • インターフェースアクセス構成の日次統計
  • インターフェースへの訪問の割合
  • ナレッジ ポイント インターフェイスのアクセス傾向の週次統計
  • ナレッジポイントインターフェイスのアクセス統計

(長期間ELKにログデータが接続されていないため、以下の図はアクセス時のログデータのみです)

ここに画像の説明を挿入

このケースで対象となる分析指標 (ナレッジ ポイント予測サービス) には、ナレッジ ポイント インターフェイスの訪問傾向の週次統計と、ナレッジ ポイント インターフェイスの訪問量統計が含まれます。

ここではインジケーターの役割について簡単に説明します。

ナレッジポイントインターフェースアクセス傾向週次統計では、ナレッジポイント予測サービスの各コースの最近のインターフェースアクセス傾向を観察することができ、傾向が異常に変化した場合には、異常の原因を深く分析することができます。

ナレッジ ポイント インターフェイスの訪問数の統計を通じて、各コースの最近のナレッジ ポイント予測サービス インターフェイスの訪問数を観察できます。訪問数が多いインターフェイスについては、関連するモデルの最適化に重点を置くことができます。

モデルの最適化

モデルの最適化には主に 2 つの部分が含まれます。

  • 特徴量エンジニアリングの最適化: データセット、より優れた抽象データ、およびより正確で標準化されたデータを最適化します。
  • モデルの最適化: モデルのハイパーパラメーターの最適化、モデルの置換。

上記で開発されたモデル バージョンが v1.0 であると仮定すると、以下は、このケースでこれまでに行われた最適化を示すモデル バージョンの更新です。

v1.1

このバージョンでは、主にパイプラインのハイパーパラメーターが最適化されます。

# v1.0
text_clf = Pipeline([
    ('vect', HashingVectorizer(ngram_range=(1, 3), n_features=(2 ** 16))),
    ('tfidf', TfidfTransformer()),
    ('clf', MultiOutputClassifier(
        estimator=SGDClassifier(loss='modified_huber', early_stopping=True),
        n_jobs=clf_n_jobs)
    )
])

# v1.1
text_clf = Pipeline([
    ('vect', HashingVectorizer(  # 调整超参 token_pattern=r'(?u)\b\w+\b'
        token_pattern=r'(?u)\b\w+\b', ngram_range=(1, 3), n_features=(2 ** 16))),
    ('tfidf', TfidfTransformer()),
    ('clf', MultiOutputClassifier(
        estimator=SGDClassifier(loss='modified_huber', early_stopping=True),
        n_jobs=clf_n_jobs)
    )
])

主にHashingVectorizerのtoken_patternのデフォルト値を変更しました。

token_pattern パラメータは主にトークンのパターンを制御するために使用され、デフォルト値では句読点や単一文字の英字など、文字長が 2 未満のトークンは無視されます。

を指定した場合token_pattern=r'(?u)\b\w+\b'、文字長が 2 未満のトークンは無視されません。

この場合のトークンは主に中国語の単語や記号であり、文字長が2未満のトークンが有効な特徴量となる可能性があります。

最適化後、モデル評価指標は大幅に改善され、アプリケーション分析指標もわずかに改善されました。

v1.2

このバージョンでは、主に特徴量エンジニアリングが最適化されています。

最適化項目には主に次のようなものがあります。

  • テキスト処理ロジックをリファクタリングする
  • タグ処理ロジックのリファクタリング
  • データセットの分割方法を更新する

テキスト処理ロジックをリファクタリングする

jieba 単語セグメンテーションの代わりに、paddlehub 字句解析 lacを使用します。

目的は、テキストの機能を充実させるのに役立つ意味情報を増やすことです。

Jieba には字句解析機能もあり、パドル モードも導入されています。

paddle の方が高度な NLP テクノロジーを備えていることを考慮して、paddlehub 字句解析を使用することにしました。

パドルハブラックの例:

import paddlehub as hub

lac = hub.Module(name="lac")
test_text = ["今天是个好日子", "天气预报说今天要下雨", "下一班地铁马上就要到了"]

results = lac.cut(text=test_text, use_gpu=False, batch_size=1, return_tag=True)

for result in results:
    print(result['word'])
    print(result['tag'])

# ['今天', '是', '个', '好日子']
# ['TIME', 'v', 'q', 'n']
# ['天气预报', '说', '今天', '要', '下雨']
# ['n', 'v', 'TIME', 'v', 'v']
# ['下', '一班', '地铁', '马上', '就要', '到', '了']
# ['f', 'm', 'n', 'd', 'v', 'v', 'xc']

この場合、テスト問題のテキストは単語の分割と意味の組み合わせの形式に変換され、次のように単語の分割を接続するためにスペースが使用されます。

test_text = ["今天是个好日子", "天气预报说今天要下雨", "下一班地铁马上就要到了"]

results = lac.cut(text=test_text, use_gpu=False, batch_size=1, return_tag=True)

for result in results:
    wt = []
    for w, t in zip(result['word'], result['tag']):
        wt.append(w + '/' + t)
    print(' '.join(wt))

# 今天/TIME 是/v 个/q 好日子/n
# 天气预报/n 说/v 今天/TIME 要/v 下雨/v
# 下/f 一班/m 地铁/n 马上/d 就要/v 到/v 了/xc

さらに、テキスト データをさらに標準化するためにデータ クリーニング戦略が更新されました。

タグ処理ロジックのリファクタリング

ラベル処理ロジックは主に次の 2 つの側面でリファクタリングされました。

  • サンプルサイズのしきい値ポリシーの調整
  • タグクリーニングロジックを更新する

サンプルサイズの制限を取り除く

v1.0 では、一部のコースの正解率とタグ数を考慮するために、コースごとにサンプル サイズの閾値が異なり、実際には正解率が優先されるサンプル サイズ閾値戦略が使用されています。

v1.2 ではサンプル サイズのしきい値戦略が調整されました。すべてのコースで最小サンプル サイズのしきい値として一律 50 が使用されます。50 は有効なサンプル サイズを確保するためです。このバージョンの最適化の方向は、ラベルの数を優先することです。

タグクリーニングロジックを更新する

v1.0では、タグの数を増やすため、タグの組み合わせをサンプルサイズスクリーニングの単位とするのではなく、単一のタグをサンプルサイズスクリーニングの単位として使用します。

v1.2 の中心となるアイデアは、ラベルの組み合わせをサンプルサイズのスクリーニングの単位として使用することです。その中で、ラベルの組み合わせの数、ラベルの数、および総サンプルサイズを増やすために、ラベル組み合わせ導出戦略が主に使用されます。

ここでは、タグの組み合わせの導出戦略を簡単に紹介します。

  1. 統計的な単一ラベルのサンプルサイズ
  2. ラベルのサンプル サイズを小さいものから大きいもの、ラベル ID に従って小さいものから大きいものの順に、元のラベルの組み合わせを並べ替えます。
  3. 統計ラベルの組み合わせサンプルサイズ
  4. サンプル サイズのしきい値を満たさないラベルの組み合わせについては、サブセット導出を実行し、組み合わせリストの最初のラベルを順番に削除し、N 個のサブセットを生成します。
  5. サンプル サイズのしきい値を満たすラベルの最大のサブセットを保持しながら、派生データのサンプル サイズをカウントします。
  6. サンプルサイズのしきい値を満たすすべてのデータをマージします

データセットの分割方法を更新する

ラベル クリーニング ロジックと連携して Top10 の精度を向上させるために、v1.0 ではカスタム分割メソッドを使用し、ラベル間の潜在的な接続を無視し、複数ラベル分類を複数分類メソッドに従って分割および再編成します。本質的に、テキストとラベルの間の元の対応関係は破壊されます。

v1.2 では、テキストとラベルの元の分布を維持することを第一に考慮し、sklearn のデータセット分割方法を使用します。

指標分析

v1.2ではv1.1と比べて評価指標が大幅に向上しました。

小学校の算数を例に考えてみましょう。

モデル評価指標が大幅に改善され、正解率が大幅に向上し、ラベル数も大幅に向上しました。

ここに画像の説明を挿入

アプリケーション分析指標はあまり変化しておらず、タグ数が大幅に増加してもアプリケーション指標は減少していないため、隠れた改善と言えます。

ここに画像の説明を挿入

今後の最適化の方向性

主に特徴エンジニアリングとモデル アルゴリズムの最適化に焦点を当てています。

モデルアルゴリズムに関してはディープラーニングを利用する予定で、BERTなど現在主流のNLP技術も試すことができます。

特徴量エンジニアリングはモデルのアルゴリズムに従って設計する必要があり、優れた特徴量エンジニアリングによってモデルのパフォーマンスが大幅に向上します。

おすすめ

転載: blog.csdn.net/xwd127429/article/details/123788939