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

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

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

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

ブログ    
ブログ    

推薦する

...

APOS A5は従業員の健康情報登録管理をインテリジェントに強化します

訪問者は検問所で携帯電話の「健康コード」を開き、携帯電話の画面をコードスキャンウィンドウの前に置くこ...

ファーウェイ、セキュリティ業界を洞察から先見へと進化させる2019年スマートセキュリティ事業戦略を発表

[51CTO.comより引用] 2019年8月8日、ファーウェイの2019年スマートセキュリティビジ...

大規模モデルアプリケーションの探索 - エンタープライズ ナレッジ スチュワード

1. 伝統的なナレッジマネジメントの背景と課題1. 企業知識管理の必要性ナレッジ マネジメントは、あ...

Googleの研究ディレクターはスタンフォード大学で教鞭をとり、「人工知能:現代的アプローチ」の著者でもある。

スタンフォード大学は10月11日、Googleリサーチディレクターのピーター・ノーヴィグ氏がスタンフ...

機械学習の背後にある数学的なバックボーンを理解するのに役立つ5冊の本

この記事は公開アカウント「Reading Core Technique」(ID: AI_Discov...

2020年の人工知能市場の現状と発展の見通し

最近、教育部、国家発展改革委員会、財政部は共同で「『双一流』建設大学における人工知能分野の学科統合の...

...

...

マスク氏はテスラの完全自動運転が今年中に利用可能になると予測するが、AIの大きな変化を懸念している

同氏は、テスラは人間の介入なしの完全自動運転の実現に近づいていると述べ、完全自動運転の実用性と自動車...

ディープラーニングの最適化を理解するにはどうすればよいでしょうか?勾配降下法の軌跡を分析することで

ニューラル ネットワークの最適化は本質的に非凸ですが、単純な勾配ベースの方法は常にこのような問題を解...

完全なグラフが利用できない場合にグラフディープラーニングを使用するにはどうすればよいでしょうか?

多様体学習は、2000 年に有名な科学雑誌 Science で初めて提案されて以来、情報科学の分野に...

Kuaishou Agents システム、モデル、データはすべてオープンソースです。

7BサイズのモデルはAIエージェントも処理できますか?最近、Kuaishouは「KwaiAgent...

ビッグデータと人工知能のために生まれた新しい職業:アルゴリズム専門家

[[69076]]映画「マトリックス」でレオが銃弾の雨をかわす難しい動きを誰もが覚えているはずだ。こ...

ソフトウェア開発プロセスは、路上でのスマートカーの安全な運行を保証するものである。

2021年に入り、自動車の道路事故率を減らし、運転プロセスの快適性を向上させる先進運転支援システム...