ホームページ >テクノロジー周辺機器 >AI >PythonでNannymlを使用したエンドツーエンドMLモデルの監視ワークフロー
機械学習プロジェクトは反復プロセスです。 Jupyterノートブック内の成功したモデルで停止するだけではありません。モデルがオンラインになった後も停止することさえありません。人々はそれにアクセスできます。展開後でも、開発フェーズ中と同じように機能するように、常にベビーシッターをしなければなりません。
Zillowのスキャンダルは、そうでない場合に何が起こるかの完璧な例です。 2021年、Zillowは、住宅価格を推定した機械学習モデルのために、3億4,400万ドルを失いました。 Zillowは7000戸以上の家で過払いで、はるかに低い価格でオフロードする必要がありました。同社は独自のモデルによって「破壊された」ため、労働力を25%削減する必要がありました。これらのタイプのサイレントモデル障害は、実際のモデルでは一般的であるため、生産パフォーマンスが低下する前に絶えず更新する必要があります。そうしないと、企業の評判、利害関係者との信頼、そして最終的にはポケットに損害を与えます。
この記事では、nannymlを展開した後の機械学習モデルを監視するためにエンドツーエンドのワークフローを実装する方法を教えてください。nannymlは、展開後の機械学習に焦点を当てた成長するオープンソースライブラリです。生産ML環境で発生するあらゆる種類の問題を解決するための幅広い機能を提供します。いくつか名前を付けるには:
ロボットの物理的属性や環境条件(風や天候など)に加えて、矢印と弓の特性は、モデルの特徴または入力変数です。
弓、矢印、ターゲット(データの準備など)を注意深く準備したと想像してください。多くのセンサーとカメラを備えたロボットは、トレーニング中に10000回撮影します。時間が経つにつれて、それは印象的な頻度で雄牛の目に当たり始めます。私たちはパフォーマンスに興奮しており、ロボットとそのコピーをアーチェリー愛好家に販売し始めます(モデルの展開)。
しかし、すぐに、苦情の流れが得られます。一部のユーザーは、ロボットにターゲットが完全に欠落していると報告しています。驚いたところ、私たちはチームを集めて何がうまくいかなかったかを話し合いました。私たちが見つけたのは、
データドリフトの古典的なケースです。ロボットが動作している環境は変化しました - さまざまな風のパターン、さまざまな湿度レベル、さらには矢の物理的特性(重量、バランス)と弓の変化さえあります。 入力機能のこの現実世界の変化は、入力データ、特に機能間の関係、時間の経過とともに変化するときに機械学習モデルがどのようにパフォーマンスを下げるかと同様に、ロボットの正確性を捨てました。 コンセプトドリフト
これらの問題に対処した後、ロボットの新しいバッチをリリースします。しかし、数週間で、同様の苦情が流れます。困惑して、私たちはより深く掘り下げ、ターゲットが頻繁にユーザーに置き換えられていることを発見します。
これらの新しいターゲットのサイズは異なり、さまざまな距離に配置されます。この変更には、ロボットの撮影技術に対する別のアプローチが必要です。これは、機械学習の用語では、入力変数とターゲットの結果が変化すると、概念ドリフトが発生します。私たちのロボットの場合、新しいタイプのターゲットは、変化に関してトレーニングされたデータのダイナミクスを大幅に調整する必要があるのと同じように、撮影に異なる撮影に適応する必要があることを意味しました。
概念とデータドリフトのより現実世界の例
ポイントを家に持ち帰るには、データと概念のドリフトがどのように発生するかについての実際の例をいくつか見てみましょう。 生産中のモデルにグラウンドトゥルースがすぐに利用できる場合、モデルの動作の変化を簡単に検出できます。たとえば、ユーザーは、ロボット/アーチェリーの類推で何が悪いのかをすぐに伝えることができます。なぜなら、彼らはターゲットを見て、ロボットが見逃したことを伝えることができるからです。
対照的に、ローンのデフォルトを予測するモデルの例を挙げてください。このようなモデルは、ユーザーが次の支払いでデフォルトであるかどうかを予測します。予測を確認するには、モデルは実際の支払い日まで待つ必要があります。これは、 監視システムがパフォーマンスの低下を検出した場合、システムが実現したパフォーマンス(グラウンドトゥルース付き)または推定パフォーマンス(グラウンドトゥルースなし)に関係なく、MLエンジニアはドロップの背後にある原因を特定する必要があります。
彼らの発見に基づいて、彼らはさまざまな問題解像度の手法を採用しています
データセットのこの特別なバージョンには、「セット」という名前の列があります。
はい、あなたはそれを正しく読みます。データを4つのセットに分割します。伝統的に、あなたはそれを3つに分割しているかもしれません: モデルがパターンを学習するためのトレーニングセット しかし、実際のデータセットには組み込まれたセットラベルが付属していないため、データを手動で4つのセットに分割する必要があります。 sklearnのtrain_test_splitを使用してタスクを実行する関数は次のとおりです。
さあ、モデルトレーニングに進みましょう。
素晴らしい - 検証セットのRMSEに関して503ドルを達成するモデルがあります。テストセットで最後にモデルを評価しましょう。
テストパフォーマンスは551 $です。それで十分です。 参照セットは、モデル監視コンテキストで使用されるテストセットの別名です。 Nannymlは、テストセットでのモデルのパフォーマンスを、生産パフォーマンスのベースラインとして使用します。参照セットには、機能以外の2つの列が必要です。 今、テストセットには機能とターゲットが含まれていますが、Y_TEST_PREDがありません: 追加しましょう: 次に、テストセットを参照に変更します: この時点で、私たちのリグレッサーがクラウドに展開されていると想像してみましょう。想像力は、この記事の過剰なモデルを実際に展開するよりも簡単です。
分析セットを作成することは、参照の作成に似ています:
のパフォーマンスの推定
(CBPE) プロットを解釈しましょう。参照および分析セットにパフォーマンスを表示する2つのセクションがあります。推定生産RMSEがしきい値を超えて上昇した場合、Nannymlはそれらをアラートとしてマークします。
ステップ3:監視における推定対実現パフォーマンス 推定パフォーマンスをプロットしている間、貨物が到着し、ダイヤモンドの専門家は実際の価格を計算しました。価格としてProdに保存しました。 ここで、モデルの実現パフォーマンス(実際のパフォーマンス)を推定パフォーマンスと比較して、監視システムがうまく機能しているかどうかを確認できます。
クラスには、4つのパラメーターが必要です
まあ、推定RMSE(紫)は実際のパフォーマンスにかなり近かったようです(RMSE、青)。
今、これに飛び込みます。
イントロで述べたように、モデルが生産に失敗する最も一般的な理由の1つはドリフトです。このセクションでは、データ(機能)ドリフト検出に焦点を当てます。
多変量ドリフト検出 最高の多変量ドリフト検出方法の1つは、PCAを使用したデータ再構成エラーの計算です。それは非常にうまく機能し、特徴分布のわずかなドリフトさえも捕まえることができます。この方法の高レベルの概要は次のとおりです
データ再構成エラー -Reconstruct_Error。
生産データの再構築エラーがベースラインよりも高い場合、機能が漂いました。
l-infinity、chi2 最も問題のある機能は、色と深さであることがわかります。記事を書く前に人為的にドリフトさせたのは私だったので、これは私を驚かせるべきではありません。
結論 残念ながら、問題の解決を停止しました。監視ワークフローの最後のステップは、この記事の範囲を超えています。ただし、モデルの監視については、それをカバーする優れた推奨事項がいくつかあります。
機械学習監視の概念コース
データドリフトの例
ソーシャルメディアコンテンツのモデレーション:コンテンツモデレートモデルは、進化する言語と文化的現象に常に適応する必要があります。
モニタリングモデルは、直接的なビジネスへの影響を測定し、つまりKPI(主要なパフォーマンスインジケーター)の監視を測定することで実行することもできます。 Zillowの場合、適切な監視システムが利益の損失を検出し、エンジニアに警告した可能性があります(仮説的に)。
2。根本原因分析
データのリバランス:パフォーマンスの低下がデータドリフトによるものである場合、トレーニングデータセットを調整して現在の条件を反映することは良い選択肢です。
import warnings
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import OneHotEncoder
warnings.filterwarnings("ignore")
ダイヤモンドデータセットはかなりきれいです。したがって、私たちが実行する唯一の前処理は、テキスト機能をPandasカテゴリデータ型にキャストすることです。これは、xgboostによる自動カテゴリデータの前処理を有効にするための要件です。
dataset_link = "https://raw.githubusercontent.com/BexTuychiev/medium_stories/master/2024/1_january/4_intro_to_nannyml/diamonds_special.csv"
diamonds_special = pd.read_csv(dataset_link)
diamonds_special.head()
# Extract all feature names
all_feature_names = diamonds_special.drop(["price", "set"], axis=1).columns.tolist()
# Extract the columns and cast into category
cats = diamonds_special.select_dtypes(exclude=np.number).columns
# Define the target column
target = "price"
「コードを説明する」ボタンを使用して、関数の行ごとの説明を取得します。
for col in cats:
diamonds_special[col] = diamonds_special[col].astype("category")
モデルのトレーニングdiamonds_special.set.unique()
['train', 'val', 'test', 'prod']
Categories (4, object): ['prod', 'test', 'train', 'val']
さて、ここにハイパーパラメーターが既に調整されているリグレッサーをトレーニングするコードがあります:参照セットの作成
この時点まで、すべてが非常に簡単でした。さて、私たちは主要な部分に来ます - 参照と分析セットを作成します。
import warnings
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import OneHotEncoder
warnings.filterwarnings("ignore")
dataset_link = "https://raw.githubusercontent.com/BexTuychiev/medium_stories/master/2024/1_january/4_intro_to_nannyml/diamonds_special.csv"
diamonds_special = pd.read_csv(dataset_link)
diamonds_special.head()
# Extract all feature names
all_feature_names = diamonds_special.drop(["price", "set"], axis=1).columns.tolist()
# Extract the columns and cast into category
cats = diamonds_special.select_dtypes(exclude=np.number).columns
# Define the target column
target = "price"
分析セットの作成
for col in cats:
diamonds_special[col] = diamonds_special[col].astype("category")
実際のダイヤモンドが到着し、人間の専門家がモデルによって生成された価格を検証する前に、モデルがうまく機能しているかどうかを確認する必要があります。ウェブサイトに不正確な価格でダイヤモンドを表示したくありません。
これを行うには、Y_PROD_PREDをGround Truthの実際の価格と比較することにより、モデルのパフォーマンスを測定する必要があります。しかし、価格が検証される前に、私たちは基本的な真実を持つことはありません。したがって、グラウンドトゥルースなしでモデルのパフォーマンスを推定する必要があります。
このタスクを実行するには、nannymlには分析セットが必要です。モデルによって行われた予測を含む生産データを含むデータ。
diamonds_special.set.unique()
['train', 'val', 'test', 'prod']
Categories (4, object): ['prod', 'test', 'train', 'val']
回帰の直接損失推定(DLE)
分類のための信頼性ベースのパフォーマンス推定
import warnings
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import OneHotEncoder
warnings.filterwarnings("ignore")
監視システムは、モデルのパフォーマンスが生産で約半分に低下したことを示しています。しかし、それは見積もりにすぎません - 私たちはそれを確実に言うことはできません。
dataset_link = "https://raw.githubusercontent.com/BexTuychiev/medium_stories/master/2024/1_january/4_intro_to_nannyml/diamonds_special.csv"
diamonds_special = pd.read_csv(dataset_link)
diamonds_special.head()
rublec_type:タスクは何ですか?
# Extract all feature names
all_feature_names = diamonds_special.drop(["price", "set"], axis=1).columns.tolist()
# Extract the columns and cast into category
cats = diamonds_special.select_dtypes(exclude=np.number).columns
# Define the target column
target = "price"
このステップでは、PCAの性質により、元のデータセットに関する情報が失われます。
3。 ReferenceとReference_Reconstructedの違いが見つかり、
システムは、生産データをさらに調査するように促すアラートを送信します
データの各塊(それぞれ250行)にエラーが発生したら、プロットできます。
import warnings
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import OneHotEncoder
warnings.filterwarnings("ignore")
dataset_link = "https://raw.githubusercontent.com/BexTuychiev/medium_stories/master/2024/1_january/4_intro_to_nannyml/diamonds_special.csv"
diamonds_special = pd.read_csv(dataset_link)
diamonds_special.head()
# Extract all feature names
all_feature_names = diamonds_special.drop(["price", "set"], axis=1).columns.tolist()
# Extract the columns and cast into category
cats = diamonds_special.select_dtypes(exclude=np.number).columns
# Define the target column
target = "price"
単変量ドリフト検出データ再構成エラーは、すべての機能のドリフトを測定するための単一の数値です。しかし、個々の機能のドリフトはどうですか?データセットに何百もの機能が含まれていた場合、どのようにして最も漂流している機能を見つけて適切な手段を講じますか?
wasserstein、kolgomor-smirnov test
for col in cats:
diamonds_special[col] = diamonds_special[col].astype("category")
モデル監視は、良いモデルができたら機械学習が終了するという幻想を打ち砕くため、魅力的だと思います。地球が丸くなり、ユーザーパターンが変化するにつれて、長い間関連するモデルはありません。これにより、モデルがMLエンジニアのスキルセットの重要な部分を監視するようになります。
今日、基本的なモデル監視ワークフローについて説明しました。私たちは、基本的な監視の概念について話すことから始めました。次に、コードに向かって先端を投げます。データをNannymlと互換性のある形式に偽造しました。推定モデルパフォーマンスの最初のプロットを作成し、実現したパフォーマンスと比較するために別のプロットを作成しました。パフォーマンスが低下しているといういくつかのアラートを受け取りました。多変量ドリフト検出でチェックしました。重い機能ドリフトが見つかりました。個々の機能ドリフト検出でダブルチェックしました。漂流機能を特定しました
これらのコースはどちらも、あなたが望むことができる最高の人から作成されています - NannymlのCEO兼創設者。コースには、見逃せない情報のナゲットがたくさんあります。
以上がPythonでNannymlを使用したエンドツーエンドMLモデルの監視ワークフローの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。