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

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

導入

機械学習プロジェクトに取り組むとき、すべてのデータ サイエンティストが直面しなければならない質問が 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 チェーン

ブログ    
ブログ    
ブログ    

推薦する

単純なOEMを拒否し、人工知能を備えた製造業は明るい未来を持っています

国民経済と国民生活に関わる基幹産業として、製造業における新技術や新政策は主要メディアの注目の的となっ...

方向を理解し、座標を伝える、Shikraはマルチモーダルな大規模モデル参照ダイアログの新しい次元を開きます

人間の日常的なコミュニケーションでは、場面内のさまざまな領域や物体に焦点が当てられることが多く、これ...

...

AI が「長すぎて読めない」問題の解決を支援: 深層要約モデルの構築方法

過去数十年にわたり、私たちは情報に関する一連の根本的な変化と課題を経験してきました。今日、情報へのア...

...

...

企業や不動産管理会社が課す顔認識要件をどのように規制するか?あなたの権利を守るには?

[[429833]]ショッピングモールは顔認識カメラをオンにし、情報は「気付かれずに」収集されます...

2021 年に検討すべき 15 のデータ サイエンス ツール

企業データの量と複雑さは増大しており、ビジネス上の意思決定や戦略計画においてデータが果たす中心的な役...

時速22キロのスピードと50キロの荷重で、四足の車輪付きロボット「スイスマイル」は変形することを学んだ。

テスラと「レース」を敢行する四輪ロボットを見たことがありますか?以下に示すように、かなり高速であるよ...

マイクロソフトの新特許公開:機械学習で「赤面」するリアルなアバターを作成

11月16日、現地時間の火曜日、米国特許商標庁のウェブサイトでマイクロソフトの新しい特許が公開された...

2022 年に AI が組織のランサムウェア防御を強化する方法

ランサムウェアは個人や企業にとって深刻な脅威になりつつありますが、人工知能はそれを軽減するのに役立ち...

ゲームAIの課題が進み、リアルタイム戦略ゲームや不完全情報ゲームがホットスポットに

前回の 2 つの記事では、ゲーム AI の歴史におけるいくつかの古典的なアルゴリズムと画期的なイベン...