機械学習モデルを評価する際にデータ漏洩を防ぐ方法

機械学習モデルを評価する際にデータ漏洩を防ぐ方法

この記事では、モデルのパフォーマンスを評価する際のデータ漏洩の問題と、データ漏洩を回避する方法について説明します。

モデル評価中にトレーニング セットのデータが検証/テスト セットに入ると、データ漏洩が発生します。これにより、検証/テスト セットにおけるモデルのパフォーマンスの評価が偏ってしまいます。 Scikit-Learn を使用した「ボストンの住宅価格」データセットの例で理解してみましょう。データセットには欠損値がないため、データ漏洩をよりよく示すために 100 個の欠損値がランダムに導入されます。

  1. numpyをnpとしてインポートする
  2. pandasをpdとしてインポートする
  3. sklearn.datasetsからload_boston をインポートします
  4. sklearn.preprocessingからStandardScaler をインポートします
  5. sklearn.pipelineからパイプラインをインポートします
  6. sklearn.imputeからSimpleImputer をインポートします
  7. sklearn.neighborsからKNeighborsRegressor をインポートします
  8. sklearn.model_selectionからcross_validate、train_test_split をインポートします
  9. sklearn.metricsからmean_squared_errorをインポートする
  10.  
  11. #データセットのインポート
  12. データ = pd.DataFrame(load_boston()[ 'データ' ],列=load_boston()[ '機能名' ])
  13. データ[ 'ターゲット' ] = load_boston()[ 'ターゲット' ]
  14.  
  15.  
  16. #入力ターゲットの特徴を分割する
  17. X = data.iloc[:,:-1].copy()
  18. y = data.iloc[:,-1].copy()
  19.  
  20.  
  21. # 100個のランダムな欠損を追加する  
  22. np.ランダムシード(11)
  23. rand_cols = np.random.randint(0,X.shape[1],100)
  24. rand_rows = np.random.randint(0,X.shape[0],100)
  25. i,jzip(rand_rows,rand_cols)場合:
  26. X.iloc[i,j] = np.nan
  27.  
  28. #データをトレーニングセットテストセット分割する
  29. X_train、X_test、y_train、y_test = train_test_split(X、y、テストサイズ=0.2、ランダム状態=11)
  30.  
  31. #KNN回帰器の初期化
  32. knn = K近隣回帰関数()
  33.  
  34. #モード入力を初期化中
  35. imp = SimpleImputer(戦略 = 'most_frequent' )
  36.  
  37. #StandardScaler の初期化
  38. standard_scaler = 標準スケーラー()
  39.  
  40. #X_train の代入スケーリング
  41. X_train_impute = imp.fit_transform(X_train).copy()
  42. X_train_scaled = standard_scaler.fit_transform(X_train_impute).copy()
  43.  
  44. #5分割交差検証の実行
  45. cv = cross_validate(推定値=knn、X=X_train_scaled、y=y_train、cv=5、スコアリング= "neg_root_mean_squared_error" 、return_train_score= True )
  46.  
  47. #トレーニングスコア平均を計算する クロス検証
  48. print(f 'トレーニングRMSE(データ漏洩あり): {-1 * np.mean(cv["train_score"])}' )
  49.  
  50. #検証スコア平均を計算する クロス検証
  51. print(f '検証RMSE(データ漏洩あり): {-1 * np.mean(cv["test_score"])}' )
  52.  
  53. #モデルをトレーニングデータ適合させる
  54. lr.fit(X_train_scaled、y_train) は、
  55.  
  56. #テストデータの前処理
  57. X_test_impute = imp.transform(X_test).copy()
  58. X_test_scaled = standard_scaler.transform(X_test_impute).copy()
  59.  
  60. #未知のデータに対する予測モデル評価
  61. 予測 = lr.predict(X_test_scaled)
  62. print(f '未知のデータのRMSE: {np.sqrt(mean_squared_error(y_test,pred))}' )

上記のコードでは、「Xtrain」はトレーニング セット (k 分割交差検証) であり、「Xtest」は未知のデータでのモデル評価に使用されます。上記のコードは、データ漏洩を伴うモデル評価の例であり、欠損値を補完するためのモード (strategy='mostfrequent') は 'Xtrain' で計算されます。同様に、データのスケーリングに使用される平均と標準偏差も、「Xtrain」を使用して計算されます。 'Xtrain' の欠損値は補完され、 'X_train' は k 分割交差検証の前にスケーリングされます。

k 分割交差検証では、「Xtrain」は「k」分割に分割されます。各 k 分割交差検証反復では、分割の 1 つが検証に使用され (検証部分と呼びます)、残りの分割はトレーニングに使用されます (トレーニング部分と呼びます)。各反復におけるトレーニング部分と検証部分には、「Xtrain」によって計算されたパターンを使用して入力された欠損値があります。同様に、「Xtrain」で計算された平均と標準偏差を使用してスケーリングされています。この推定およびスケーリング操作により、「Xtrain」からの情報が k 分割クロス検証のトレーニング部分と検証部分の両方に漏れてしまいます。この情報漏洩により、検証部分におけるモデルのパフォーマンスの推定値が偏ってしまう可能性があります。次のコードは、パイプを使用してこれを回避する方法を示しています。

  1. #前処理回帰パイプライン
  2. パイプライン = パイプライン(ステップ=[[ 'imputer' ,imp],[ 'scaler' ,standard_scaler],[ 'regressor' ,knn]])
  3.  
  4. #パイプラインを推定値として使用して 5 分割交差検証を実行する
  5. cv = cross_validate(推定器 = パイプライン、X = X_train、y = y_train、cv = 5、スコアリング = "neg_root_mean_squared_error" 、return_train_score = True )
  6.  
  7. #トレーニングスコア平均を計算する クロス検証
  8. print(f 'トレーニングRMSE(データ漏洩なし): {-1 * np.mean(cv["train_score"])}' )
  9.  
  10. #検証スコア平均を計算する クロス検証
  11. print(f '検証RMSE(データ漏洩なし): {-1 * np.mean(cv["test_score"])}' )
  12.  
  13. #パイプラインをトレーニングデータ適合させる
  14. パイプライン.fit(X_train,y_train)
  15.  
  16. #未知のデータに対する予測モデル評価
  17. 予測 = パイプライン.予測(X_test)
  18. print(f '未知のデータのRMSE: {np.sqrt(mean_squared_error(y_test,pred))}' )

上記のコードでは、パイプラインにインポーター、スカラー、およびリグレッサーを含めています。この例では、「X_train」は 5 つのフォールドに分割され、各反復でパイプラインはトレーニング部分を使用して、トレーニング部分と検証部分に欠損値を入力するためのモードを計算します。同様に、トレーニング部分と検証部分を測定するために使用される平均と標準偏差も、トレーニング部分で計算されます。このプロセスでは、補完モードとスケール平均および標準偏差がトレーニング部分で各 k 分割クロス検証反復時に計算されるため、データ漏洩が排除されます。各 k 分割クロス検証反復では、これらの値を使用してトレーニング部分と検証部分を計算およびスケーリングします。

データ漏洩の有無で計算されたトレーニング RMSE と検証 RMSE の違いを確認できます。データセットが小さいため、それらの間のわずかな違いしか確認できません。データセットが大きい場合、この違いは重要になる可能性があります。目に見えないデータの場合、検証 RMSE (データ漏洩あり) は偶然にのみ RMSE に近くなります。

したがって、k 分割クロス検証にパイプラインを使用すると、データ漏洩を防ぎ、未知のデータに対するモデルのパフォーマンスをより適切に評価できます。

<<:  Pythonアルゴリズムを使用して取引する方法

>>:  2021 年の自然言語処理 (NLP) のトレンド トップ 10

ブログ    
ブログ    
ブログ    

推薦する

...

自動化とロボット工学:どちらがあなたの会社に適していますか?

ロボット工学と自動化には違いがありますか? 自動化が自分に適しているかどうかわからない人はたくさんい...

データセンター管理者は AI と ML の爆発的な増加にどのように備えればよいのでしょうか?

生成 AI と機械学習 (ML) は急速に一般の人々の意識に入り込み、これらの有望なテクノロジーの能...

Alibaba Cloud がバッチおよびストリーム機械学習プラットフォーム Alink をオープンソース化し、アルゴリズム開発のハードルを下げる

11月28日、アリババクラウドは、世界初の統合バッチ・ストリームアルゴリズムプラットフォームでもある...

...

AIと5Gを組み合わせてIoTの収益を最大化する方法

[[402984]]研究によると、人工知能と 5G テクノロジーを組み合わせることで、通信会社は I...

ヘルスケアにおける人工知能の新たなフロンティア

[[262099]]医療機関が AI の導入を競う中、プロセス中心のアプローチを AI 戦略に組み込...

...

DrivingDiffusion: 最初のサラウンドワールド モデル: BEV データとシミュレーションの新しいアイデア!

この記事は、Heart of Autonomous Driving の公開アカウントから許可を得て転...

...

Microsoft が機械学習モデルを簡単に作成できる Lobe デスクトップ アプリケーションをリリース

なお、Lobe はインターネット接続やログインを必要とせず、現在は機械学習モデルの出力のみ可能である...

マイクロソフト、大規模 AI モデルのトレーニングにかかる​​時間とコストを大幅に削減する ZeRO++ テクノロジーを発表

6月27日、マイクロソフトの研究者らは、大規模なAIモデルのトレーニング時に遭遇しやすいデータ転送コ...

ソートアルゴリズムのより詳細な概要

ソートアルゴリズム平均時間計算量バブルソート (n2) 選択ソート (n2) 挿入ソート (n2) ...

...

血みどろの惨劇を突破できるのは誰か?自動運転プレイヤーが腕前を披露!

自動運転は爆発的な成長を遂げている最先端分野です。水平的な視点で見ると、BATを含むインターネット大...