この記事は、の一部として公開されました データサイエンスブログソン.
ええと! 始める前に、以下の視覚化を見て、私に教えてください、あなたの観察は何ですか? はい、ここでは、本番環境に移行する前にモデルのパフォーマンスを監視しています。 MLスペースでこれが必要なのはなぜですか? もちろん、これは、モデルの精度を検証する際の非常に重要な段階です。 この記事では、興味深い手法のXNUMXつを選択し、それについて詳しく説明します。
作者がデザインした画像
モデルのパフォーマンスとその必要性とは何ですか?
機械学習モデルのパフォーマンス評価は、スコアを評価するのと同じです。これは、高校や大学で、最高のコースを取得するための適格基準を満たすため、または企業のキャンパスインタビューで仕事やクリアカットを選択するための痛みを評価するために使用した方法です。 -選ばれるためのより多くの競争試験のオフスコア。 したがって、GOODスコアは、候補者が常に良いという事実を認識しているようです。 機械学習モデルでも同じことが予想され、予測/予測/石灰化の問題ステートメントで期待される結果が得られるはずです。 MLの世界でも、モデルはデータ、モデル、コードのコンテキストでトレーニングされています。
モデルとパフォーマンスの精度とは何ですか?
精度は、利用可能なレコード数を使用してチームによって構築されたモデルによって作成された予測を修正する予測ベースの問題をよりよく理解するための単なる数値です。 したがって、データのさまざまな組み合わせにわたってモデルをトレーニングする必要があります。
MLエンジニアとビジネスチーム契約
モデルのパフォーマンスを評価する方法は複数あることを認識しています。 チームは常に一般化されたモデルを構築する責任があり、生産では一定のパフォーマンスが期待されるため、同時に、SMEのガイダンスによる諮問委員会に基づいて、顧客、その利害関係者を説得し、主要なビジネス上の利点を追加する必要があります目標を達成するために。
私たちはMLエンジニアチームであるため、モデルのパフォーマンスを数値範囲で提供する必要があります。 モデルのパフォーマンスが85〜90%になるとしましょう。 トレーニングとテストでのモデルのパフォーマンスが本番環境で同じように動作しない場合があります。多くの場合、本番環境で過剰適合または過適合が発生します。
はい! もちろん、これは後輩のデータサイエンティストやMLエンジニアにとって本当に脅威ですが、課題は、技術的な能力を即興で作成する必要があるということです。 、したがって、多くの反復とCI / CD関与(MLOps)の後、モデルのみが期待どおりの一般化モードで精度を達成します。 さらに一歩進んで、常にパフォーマンスを監視し、モデルのアルゴリズムとコードに必要な変更を適用する必要があります。
リアルタイムのシナリオでこれをどのように克服できるかを見ていきます。
先に述べたように、RANGE-Factorにはさまざまな評価手法があり、Cross-ValidationまたはK-FoldCrossValidationが最適で理解しやすいものです。 これは本質的に単純であり、データを置き換えることなく、一般的なリサンプリング手法を使用します。 そして、実装中に簡単に理解して視覚化することができました。
作者がデザインした画像
Kフォールド
各セット(フォールド)では、トレーニングとテストはこのプロセス全体でXNUMX回だけ実行されます。 過剰適合を回避するのに役立ちます。 私たちが知っているように、モデルがXNUMXつのショートですべてのデータを使用してトレーニングされ、最高のパフォーマンス精度が得られます。 このk分割交差検定に抵抗することは、モデルを構築するのに役立ちます。これは一般化されたものです。
このK分割交差検定を実現するには、データセットをトレーニング、テスト、検証のXNUMXつのセットに分割し、データの量に挑戦する必要があります。
ここで、テストとトレーニングのデータセットは、モデルの構築とハイパーパラメータの評価をサポートします。
モデルは、パラメーターとして割り当てられた値に基づいて複数回検証されており、Kと呼ばれ、INTEGERである必要があります。
簡単に言うと、K値に基づいてデータセットが分割され、トレーニング/テストがK時間に等しい順序で実行されます。
K分割交差検定のライフサイクル
作者がデザインした画像
一般化されたK値を考えてみましょう。 K = 5の場合、それは、与えられたデータセットで、5つのフォールドに分割し、トレインとテストを実行していることを意味します。 各実行中に、XNUMXつのフォールドがテスト用に考慮され、残りはトレーニングと反復の進行に使用されます。以下の図解は、フォールドで定義されたサイズのフローのアイデアを示します。
作者がデザインした画像
各データポイントが使用されます。1回はホールドアウトセットで、K-XNUMXはトレーニングで使用されます。 したがって、完全な反復中に少なくともXNUMX回は、XNUMXつはテストに使用され、残りはトレーニングに使用されます。
上記のセットでは、5-テスト20トレーニング。 各反復で、精度スコアを取得し、それらを合計して平均を見つける必要があります。 ここでは、データが一貫性のある方法でどのように拡散されているかを理解でき、このモデルを使用して本番環境を作成するかどうかを結論付けます。
Kフォールドに関連する経験則
ここで、K –foldで遊んでいる間のいくつかの経験則について説明します。
- Kは常に>=2であり、=レコード数(LOOCV)である必要があります
- 2の場合、2回だけ繰り返します
- K =データセット内のレコード数の場合、テスト用に1、トレーニング用にn-
- Kの最適化された値は10であり、適切なサイズのデータで使用されます。 (一般的に使用されます)
- K値が大きすぎると、トレーニングセット全体の分散が少なくなり、反復全体のモデル通貨の差が制限されます。
- 折り畳みの数は、データセットのサイズに間接的に比例します。つまり、データセットのサイズが小さすぎると、折り畳みの数が増える可能性があります。
- Kの値を大きくすると、最終的に交差検定プロセスの実行時間が長くなります。
MLストリームでは、以下の目的でK-FoldCrossValidationを覚えておいてください。
- モデル選択
- パラメータチューニング
- 機能選択
これまで、K Foldとその実装方法について説明してきましたが、今度は実際に試してみましょう。
基本例
単純な配列を作成し、Kサイズを5として定義し、配列を分割しています。 単純なループを使用して、トレイン部分とテスト部分を印刷します。 ここでは、TTバケットのデータポイントとテストデータが各サイクルで一意であることがはっきりとわかります。
sklearn.model_selectionからインポートKFold
npとしてnumpyをインポートする
data = np.array([5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100])
kfold = KFold(5、True)
電車の場合、kfold.split(data)でテストします。
print(“ Train:%s、Test:%s”%(data [train]、data [test]))
出力
電車:[15 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95]、テスト:[5 10 20]電車:[100 5 10 15 20 25 30 35 45 55 65 70 80 85 90]、テスト:[95 100 40 50]トレイン:[60 75 5 10 15 20 25 40 45 50 60 65 70 75 80]、テスト:[90 95 100 30]トレイン:[35 55 85 5 10 20 30 35 40 45 50 55 60 70 75]、テスト:[85 90 95 100]トレイン:[15 25 65 80 5 10 15 20 25 30 35 40 50 55 60]、テスト:[65 75 80 85]
Train and Test配列と、反復ごとに配列がどのように分割されたかを確認できます。
データセットでこれを行いましょう。
ngK-Fold
from sklearn.linear_model import LogisticRegression from sklearn.svm import SVC from sklearn.ensemble import RandomForestClassifier import numpy as np from sklearn.datasets import load_digits import matplotlib.pyplot as plt Digits = load_digits()from sklearn.model_selection import train_test_split 、y_test = train_test_split(digits.data、digits.target、test_size = 0.3)
インポートされた必要なライブラリとロードされた数字(手書きの数字–オープンソース)、別のアルゴリズムを適用しましょう。
ロジスティック回帰
使っています liblinear。 これは "大規模な線形分類」 カテゴリ。 座標降下アルゴリズムを使用します。 これにより、ループ中に単変量とその最適化問題が解決されるため、多変量関数が最小化されます。
lr = LogisticRegression(solver ='liblinear'、multi_class ='ovr')lr.fit(X_train、y_train)lr.score(X_test、y_test)
出力
スコア:0.972222
SVC
使用するだけ ガンマは、超平面の非線形遠近法のパラメーターです。 ガンマの値は、トレーニングデータセットと 1/n_featuresを使用します。
svm = SVC(gamma ='auto')svm.fit(X_train、y_train)svm.score(X_test、y_test)
出力
スコア:0.62037
ランダムフォレスト
RFCの場合、推定量を40として割り当てています。
rf = RandomForestClassifier(n_estimators = 40)rf.fit(X_train、y_train)rf.score(X_test、y_test)
出力
スコア:0.96666
上記のアルゴリズムのリストからのスコア ロジスティック回帰と ランダムフォレスト SVMよりも比較的優れています。
次に、cross_val_score関数を使用してスコアを取得し、データセットとcvでさまざまなアルゴリズムを渡します。
sklearn.model_selectionからimportcross_val_score
LogisticRegression、CV=3に設定します
score_lr = cross_val_score(LogisticRegression(solver ='liblinear'、multi_class ='ovr')、digits.data、digits.target、cv = 3)print(score_lr)print( "Avg:"、np.average(score_lr))
出力:3倍の場合、3つのスコアがあります
[0.89482471 0.95325543 0.90984975]平均:0.9193099610461881
SVMとCV=3を設定します
score_svm = cross_val_score(SVC(gamma ='auto')、digits.data、digits.target、cv = 3)
print(score_svm)
print(“ Avg:”、np.average(score_svm))
出力:スコア
[0.38063439 0.41068447 0.51252087]平均:0.4346132442960489
ランダムフォレストとCV=3を設定します
score_rf = cross_val_score(RandomForestClassifier(n_estimators = 40)、digits.data、digits.target、cv = 3)
print(score_rf)
print(“ Avg:”、np.average(score_rf))
出力:スコア
[0.92821369 0.95325543 0.92320534]平均:0.9348914858096827
Kフォールドを適用する前に | Kフォールドを適用した後(平均) | |
ロジスティック回帰 | 視聴者の38%が | 視聴者の38%が |
SVM | 視聴者の38%が | 視聴者の38%が |
ランダムフォレスト | 視聴者の38%が | 視聴者の38%が |
上記の表に基づいて、 ランダムフォレスト このデータセットの本番用。 ただし、データドリフトに基づいてモデルのパフォーマンスを監視する必要があり、ビジネスケースの変化に応じて、モデルを再検討して再デプロイする必要があります。
パラメータ調整 K-Foldの使用
考えてみましょう RandomForestClassifier この分析のために、そして n_estimatorsは、この場合のパラメーターであり、CVは10(一般的に使用されます)
score1 = cross_val_score(RandomForestClassifier(n_estimators = 5)、digits.data、digits.target、cv = 10)
print(“推定量の平均スコア=5およびCV= 10:”、np.average(scores1))
出力
推定量=5およびCV=10の平均スコア:0.87369
score2 = cross_val_score(RandomForestClassifier(n_estimators = 20)、digits.data、digits.target、cv = 10)
print(“推定量の平均スコア=20およびCV= 10:”、np.average(scores2))
出力
推定量=20およびCV=10の平均スコア:0.93377
score3 = cross_val_score(RandomForestClassifier(n_estimators = 30)、digits.data、digits.target、cv = 10)
print(“推定量の平均スコア=30およびCV= 10:”、np.average(scores3))
出力
推定量=30およびCV=10の平均スコア:0.94879
score4 = cross_val_score(RandomForestClassifier(n_estimators = 40)、digits.data、digits.target、cv = 10)
print(“推定量の平均スコア=40およびCV= 10:”、np.average(scores4))
出力
推定量=40およびCV=10の平均スコア:0.94824
スコア1 | 視聴者の38%が |
スコア2 | 視聴者の38%が |
スコア3 | 視聴者の38%が |
スコア4 | 視聴者の38%が |
上記の観察に基づいて、Estimators=30を使用します。
視覚的な形でK-Fold
視覚的表現は、軸を横切って配置されているデータの最良の証拠です。
sklearn.model_selectionからimportcross_val_score
knn = KNeighborsClassifier(n_neighbors = 5)スコア= cross_val_score(knn、X、y、cv = 10、scoring ='accuracy')print(scores.mean())
出力
0.9666666666666668
k_range = list(range(1、25))k_scores = [] for k in k_range:knn = KNeighborsClassifier(n_neighbors = k)scores = cross_val_score(knn、X、y、cv = 10、scoring ='accuracy')k_scores。 append(scores.mean())print(k_scores)
出力
[0.96、0.95333、0.96666、0.96666、0.966668、0.96666、0.966666、0.966666、0.97333、0.96666、0.96666、0.97333、0.9800、0.97333、0.97333、0.97333、0.97333、0.98000、0.9733333、0.980000、0.966666、0.96666、0.973333、0.96、0.96666 、0.96、0.96666、0.953333、0.95333、0.95333]
matplotlib.pyplotをpltとしてインポート%matplotlib inline plt.plot(k_range、k_scores)plt.xlabel('KNNのKの値')plt.ylabel('Cross-Validated-Accuracy')
出力:単純なプロットで、X=>Kの値とY=>それぞれのCVの精度
上記の視覚的表現は、精度がK = 98の場合は約12,18%、KNNの場合は19であることを理解するのに役立ちます。
まとめ
彼ら! これまで、K-Fold Cross Validation Techniqueのさまざまな側面と、生産のための機械学習モデルにおけるその重要性、古典的な例を使用したパラメーター選択について説明してきました。 この記事は、皆さんがこのトピックをよりよく理解するのに役立つと信じています。 これに不利な点があるかどうか私に尋ねると、私の答えは「はい」になります。 それは、単純なトレーニングとテストよりも実行が遅いことに他なりません。 この小さな欠点にもかかわらず、K Foldの相互検証は、機械学習の世界で重要な役割を果たします。
御時間ありがとうございます。 すぐにいくつかの興味深いトピックに接続します。 さよなら! –シャンタバブ。
Shanthababuによって書かれた記事をもっと読む こちら.
この記事に示されているメディアは Analytics Vidhya が所有するものではなく、著者の裁量で使用されています。