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

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

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

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

ブログ    
ブログ    
ブログ    
ブログ    
ブログ    

推薦する

自動化がビジネスに具体的な価値をもたらす方法

[[404690]]長年にわたり、多くの企業がロボット、自動化、人工知能などのテクノロジーからより多...

...

光学行列乗算は人工知能をどう変えるのか

現在の AI の世界は電力を大量に消費し、計算能力が制限されています。モデル開発の軌跡は急速でしたが...

人工知能はどれくらい怖いのでしょうか?アメリカはAI兵器を開発し、イランの科学者は死亡した

[[358758]]人工知能はかつてはSF映画にしか登場しない言葉でした。しかし、通信、ビッグデータ...

工業情報化省:人工知能やブロックチェーンなどの最先端技術の導入と統合を推進

工業情報化部のウェブサイトは13日、「産業ビッグデータ発展に関する指導意見」(以下、「意見」)を発表...

OpenAIの謎の新モデルQ*が暴露された。取締役会に警告するにはあまりにも強力だったため、ウルトラマン解任の導火線になるかもしれない

OpenAI 宮殿ドラマが終わったばかりですが、すぐにまた別の騒動が勃発しました。ロイター通信は、ア...

コンテンツ管理と AI – ContentOps の未来

人工知能 (AI) は、退屈な日常的な作業を一つずつこなして世界を席巻しています。 AI を使用して...

Nvidia H100 は GPT-3 を 11 分でトレーニングしました。PyTorch の創設者: 時間だけを見るのはやめましょう

昨日、Lao Huangが再び「勝利」しました!なぜ?最新の MLPerf ベンチマークでは、NVI...

埋め込みアルゴリズム空間ベクトル角度式とその応用

[[350122]]一部のデバイスは、正しく動作するために適切な方向に設置する必要があります。たとえ...

アリババ初のAIチップ「Pingtou Ge」が発売! NVIDIA P4 より 46 倍高速で、推論パフォーマンスの世界新記録を樹立

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

...

幾何学を利用してディープラーニングモデルのパフォーマンスを向上させることは、コンピュータービジョン研究の未来です。

[[189965]]ディープラーニングはコンピュータービジョンを変革しました。現在、ほとんどの問題...

顔認識: 顔の主要な特徴の認識

[[398462]]最後の顔認識画像の前処理では、前処理ステップを追加し、環境やその他の要因からの干...

実用的なヒント | 人工知能に変身するために習得すべき 8 つのニューラル ネットワーク

なぜ機械学習が必要なのでしょうか?機械学習は、人間が直接プログラムできない複雑な問題を解決できるため...

...