複数の機械学習モデルインスタンスを素早く比較する

複数の機械学習モデルインスタンスを素早く比較する

導入

機械学習プロジェクトに取り組むとき、すべてのデータ サイエンティストが直面しなければならない質問が 1 つあります。それは、「自分のデータに最適な機械学習モデル アーキテクチャはどれか?」です。

[[326370]]

残念ながら、どちらのモデルが優れているかについては明確な答えはありません。このような不確実性に直面したときの通常のアプローチは、「実験する」ことです。

この記事では、データセット上で複数のモデルを素早くテストし、優れたパフォーマンスを発揮する可能性のある機械学習モデルを見つける方法を説明します。これにより、モデルの微調整と最適化に集中できるようになります。

機械学習データセット

実験を始める前に、データセットが必要です。ここでの問題は教師ありバイナリ分類タスクであると仮定します。まず、sklearn から乳がんデータセットを読み込みます。

  1. sklearn.datasetsからload_breast_cancer をインポートします
  2. X, y = データ = load_breast_cancer(return_X_y= True )

次に、データをトレーニング セットとテスト セットに分割する必要があります。分割比率は75/25です。

  1. sklearn.model_selectionからtrain_test_split をインポートします
  2. X_train、X_test、y_train、y_test = train_test_split(X、y、test_size=0.25、random_state=8675309) です。

Pythonコーディング

このデータセットで 6 つの異なるモデルの適合度を簡単にテストします。

  1. ロジスティック回帰
  2. ランダムフォレスト
  3. K 最近隣
  4. サポートベクターマシン
  5. ガウス単純ベイズ
  6. XGBoost

各モデルの適合性をより正確に表現するには、実際にはデフォルトのパラメータを微調整する必要がありますが、デモンストレーションの目的で、全体的な考え方がより明確になるように、各モデルのデフォルトのパラメータを使用します。

  1. sklearn.linear_modelからLogisticRegression をインポートします
  2. sklearn.neighborsからKNeighborsClassifier をインポートします
  3. sklearn.svmからSVC をインポートします
  4. sklearn.ensembleからRandomForestClassifier をインポートします
  5. sklearn.naive_bayesからGaussianNB をインポートします
  6. xgboostからXGBClassifier をインポートします
  7. sklearnからmodel_selectionをインポート
  8. sklearn.utilsからclass_weightをインポートします
  9. sklearn.metricsからclassification_reportをインポート
  10. sklearn.metricsからconfusing_matrix をインポートします
  11. numpyをnpとしてインポートする
  12. pandasをpdとしてインポートする
  13. def run_exps(X_train: pd.DataFrame、y_train: pd.DataFrame、X_test: pd.DataFrame、y_test: pd.DataFrame) -> pd.DataFrame:
  14. '' '
  15. 多くのモデルをテストして勝者を見つけるための軽量スクリプト
  16. :param X_train: トレーニング分割
  17. :param y_train: トレーニングターゲットベクトル
  18. :param X_test: テスト分割
  19. :param y_test: テスト対象ベクトル
  20. :戻り値:予測DataFrame
  21. '' '
  22. dfs = []
  23. モデル = [
  24. ( 'LogReg' 、ロジスティック回帰())、
  25. ( 'RF' 、 RandomForestClassifier())、
  26. ( 'KNN' 、 KNeighborsClassifier())、
  27. ( 'SVM' 、 SVC())、
  28. ( 'GNB' 、ガウスNB())、
  29. ( 'XGB' 、 XGBClassifier())
  30. ]
  31. 結果 = []
  32. 名前 = []
  33. スコアリング = [ '精度' '精度加重' '再現率加重' 'f1加重' 'roc_auc' ]
  34. target_names = [ '悪性' '良性' ]
  35. のために モデル内のモデル:
  36. kfold = model_selection.KFold(n_splits=5、シャッフル= True 、ランダム状態=90210)
  37. cv_results = model_selection.cross_validate(モデル、X_train、y_train、cv=kfold、スコアリング=スコアリング)
  38. clf = model.fit(X_train, y_train)
  39. y_pred = clf.predict(X_test)
  40. print(名前)
  41. print(分類レポート(y_test, y_pred, target_names=target_names))
  42. 結果を追加します(cv_results)
  43. names.append(名前)
  44. this_df = pd.DataFrame(cv_results)
  45. this_df[ 'モデル' ] =名前 
  46. dfs.append(このdf)
  47. 最終 = pd.concat(dfs, ignore_index= True )
  48. 最終返却
  49. 最終 = run_exps(X_train、y_train、X_test、y_test)
  50. ファイナル

上記の Python コードには説明すべき点がたくさんあります。まず、トレーニング セットに 5 段階のクロス検証を適用して作成されたデータセットを保持するために使用される変数 dfs を作成します。

次に、モデルは、テストする各分類子の名前とクラスを含むタプルのリストに保存されます。この後、このリストをループして 5 段階のクロス検証を実行します。各実行の結果は、dfs リストに追加する pandas データフレームに記録されます。ここでの指標は 2 つのクラスの加重平均指標であることに注意する必要があります。

テストセットの分類レポートは次のとおりです。

評価結果

run_exps() スクリプトから返された final(dataframe) 内のデータを分析します。

各モデルのメトリックの分布をより正確に推定するために、30 個のサンプルに対して経験的ブートストラップを実行しました。さらに、パフォーマンス メトリックとフィッティング時間メトリックの 2 つのメトリックに焦点を当てます。次の Python コード ブロックはこれを実現します。

  1. ブートストラップ = []
  2. リスト内のモデルの場合( set ( final.model.values ​​)):
  3. model_df = final.loc[final.model == モデル]
  4. ブートストラップ = model_df.sample(n=30, replace = True )
  5. bootstraps.append(ブートストラップ)
  6.          
  7. bootstrap_df = pd.concat(bootstraps, ignore_index= True )
  8. results_long = pd.melt(bootstrap_df、id_vars=[ 'モデル' ]、var_name= 'メトリック' 、value_name= '値' )
  9. time_metrics = [ 'fit_time' , 'score_time' ] # フィット時間メトリック
  10. ## パフォーマンス指標
  11. results_long_nofit = results_long.loc[~results_long[ 'metrics' ].isin(time_metrics)] # 適合データなしで自由度を取得
  12. results_long_nofit = results_long_nofit.sort_values( by = '値' )
  13. ##時間メトリクス
  14. results_long_fit = results_long.loc[results_long[ 'metrics' ].isin(time_metrics)] #適合データを使用した自由度
  15. results_long_fit = results_long_fit.sort_values( by = '値' )

まず、5 段階のクロス検証からパフォーマンス メトリックをプロットしてみましょう。

  1. matplotlib.pyplot をpltとしてインポートします。
  2. Seaborn をSNSとしてインポートする
  3. plt.figure(図のサイズ=(20, 12))
  4. sns.set (フォントスケール=2.5)
  5. g = sns.boxplot(x= "モデル" 、y= "値" 、色相= "メトリック" 、データ=results_long_nofit、パレット= "Set3" )
  6. plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
  7. plt.title( '分類メトリックによるモデルの比較' )
  8. #plt.savefig( './benchmark_models_performance.png' 、dpi=300)
  9. plt.show()

サポート ベクター マシンはすべてのメトリックにわたってデータに適合していないのに対し、アンサンブル決定木モデル (ランダム フォレストと XGBoost) はデータに非常に適合していることは明らかです。

トレーニング時間はどうですか?

  1. plt.figure(図のサイズ=(20, 12))
  2. sns.set (フォントスケール=2.5)
  3. g = sns.boxplot(x= "モデル" 、y= "値" 、色相= "メトリック" 、データ=results_long_fit、パレット= "Set3" )
  4. plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
  5. plt.title( '適合とスコア時間によるモデルの比較' )
  6. plt.show()

Random Forest は KNN、GNB、LogReg よりも遅いですが、パフォーマンスは KNN に次ぐものです。モデルの改良を続ける場合、おそらくほとんどの労力を Random Forest に集中させるでしょう。これは、パフォーマンスが XGBoost とほぼ同じ (95% 信頼区間はおそらく重複) でありながら、トレーニングがほぼ 4 倍高速だからです。

これらのモデルでさらに分析を実行する場合 (たとえば、各メトリックの信頼区間を計算する場合)、各メトリックの平均と標準偏差にアクセスする必要があります。

  1. メトリック = リスト(セット(results_long_nofit.メトリック.​​))
  2. bootstrap_df.groupby([ 'モデル' ])[metrics].agg([np.std, np.mean])

  1. time_metrics = list( set ( results_long_fit.metrics.values ​​))
  2. bootstrap_df.groupby([ 'モデル' ])[time_metrics].agg([np.std, np.mean])

結論は

上記の分析では、平均精度、再現率などのみを考慮しています。現実の問題では、クラス全体の平均精度を気にすることはほとんどなく、むしろ特定のクラスの精度に特に興味があるでしょう。さらに、各機械学習モデルのハイパーパラメータは、データにどれだけ適合しているかを正確に評価するために調整する必要があります。

<<:  ビッグデータは私たちを新たな AI の冬に引きずり込むのか?

>>:  Oracle データベース LRU アルゴリズムの詳細な説明 - LRU チェーン、ダーティ ブロック、ダーティ LRU チェーン

ブログ    

推薦する

自動運転技術が盛んに進歩していますが、実際に道路上で実用化されるまでにはどれくらい時間がかかるのでしょうか?

自動運転の概念は、誕生以来、常に資本家や技術起業家が好む分野のひとつでした。新しいインフラと5G商用...

...

2020 年の DevOps の 7 つのトレンド

[51CTO.com クイック翻訳] 権威ある調査によると、2017 年に DevOps は市場で ...

テスラの自動操縦装置が別の人をはねて死亡させ、被害者の家族が訴訟を起こす

電気自動車メーカー、テスラの自動操縦機能に関連する死亡事故がまた発生した。被害者は高速道路脇でモデル...

5Gが企業に与える影響

画像ソース: https://pixabay.com/images/id-1069218/ 2024...

...

RPAとAIを組み合わせることで、自動化の新しい世界が開かれます

たとえば、ボットに請求書を分析してもらい、それを社内の適切な連絡先に送信させたいとします。十分簡単そ...

シーメンスは自動化を推進力として変革の新たな機会を捉える

今日、企業のデジタル変革は避けられない選択肢となっており、従来の製造業では、変革の探求は実はずっと以...

...

大規模言語モデルと知識グラフに関する共同研究のレビュー:2つの相補的な技術的利点

大規模言語モデル (LLM) はすでに強力ですが、さらに強力になる可能性があります。 LLM は、ナ...

ディープラーニングの19の格闘技を見てください。絶滅危惧動物の保護にも役立ちます

絶滅危惧動物を研究する上で最大の課題の一つは、その数を正確に推定することであり、各個体を追跡して詳細...

世界を支配するトップ 10 のアルゴリズムをご存知ですか?

Reddit に、私たちの現代生活におけるアルゴリズムの重要性と、どのアルゴリズムが現代文明に最も...

クラウドベースの生成 AI システムを実行するためのベスト プラクティス

翻訳者 |ブガッティレビュー | Chonglou何だと思う?クラウド コンピューティング カンファ...

...