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

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

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

モデル評価中にトレーニング セットのデータが検証/テスト セットに入ると、データ漏洩が発生します。これにより、検証/テスト セットにおけるモデルのパフォーマンスの評価が偏ってしまいます。 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

推薦する

ローコード プラットフォームに関する不完全な推奨事項!

ソフトウェア開発者向けのローコード機能それでは、ソフトウェア開発者に機械学習機能を提供するローコード...

RLHFの2%ハッシュレートを使用してLLMからの有害な出力を阻止するために、ByteはLLM忘却学習を提案した。

大規模言語モデル (LLM) の開発により、実務者はより多くの課題に直面しています。 LLM からの...

AIの「不確実な時代」にどう向き合うか

AIの拡大する影響私たちの日常生活における AI の影響はますます明らかになってきています。 AI ...

...

スマートロボットについて知っておくべきことすべて

スマートロボットは、タスクをより効率的かつ正確に実行し、生産性を向上させ、人的エラーを削減するように...

機械学習における欠損値に対処する9つの方法

データサイエンスはデータに関するものです。これは、あらゆるデータ サイエンスや機械学習プロジェクトの...

顔認識の3つの主要技術と4つの主要機能

2016年百度世界大会が開幕し、百度創始者の李承燁氏は大会で「人工知能」をテーマに講演し、最新製品「...

...

交通大学ACMクラス卒業生のGoogleでの新たな仕事:Excelの表の数式を自動で記述

[[433049]]数式ビルダーのテーブルバージョンが登場しました。交通大学の ACM クラスを卒業...

...

...

...

プライベート5GとAI技術は自動化から自律性への移行を加速させる

モノのインターネットとインダストリー 4.0 の登場以来、マシン ビジョン、人工知能、機械学習、ディ...

製造業における人工知能の活用事例トップ10

世界経済の礎である製造業は、人工知能 (AI) が推進する技術革命の最前線にあります。この記事では、...

一般的なモデル統合手法の紹介: バギング、ブースティング、スタッキング

この記事では、ブートストラップ、バギング、ランダム フォレスト、ブースティング、スタッキング、その他...