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

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

導入

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

ブログ    
ブログ    
ブログ    

推薦する

空から地上へ、そしてついに無人機が海へ

[[251878]]数日前、もう一つの非常に興味深い広告が私の注意を引きました。それはトルコのテクノ...

...

データ汚染:次の大きな脅威

人工知能 (AI) と機械学習 (ML) を使用したセキュリティ ソフトウェアを標的としたデータ ポ...

...

...

AIを活用した自動化はエンタープライズレベルの自動化2.0です

新たな常態に対応するために自動化プロセスを拡大多くの企業は、ニューノーマルに対処するための重要な技術...

AIoT: 人工知能 (AI) とモノのインターネット (IoT) が出会うとき

AIoT: AIとモノのインターネットが出会うときモノのインターネット (IoT) は私たちの日常生...

私は 8 つの企業と面接しましたが、機械学習に関する次のような質問をされました…

【はじめに】 筆者は今年初めからインドでデータサイエンス、機械学習、ディープラーニングの分野で仕事...

6144個のTPU、5400億個のパラメータ、バグ修正、ジョーク解釈など、GoogleはPathwaysを使用して大規模なモデルをトレーニングしました

Google の次世代アーキテクチャ Pathways は、大規模なモデルのトレーニングに使用されて...

李蘭娟氏との対話:人工知能は流行病を「すべて捕捉」し、医療をより正確にする

[[353851]] 「新型コロナウイルス感染症の突然の発生は、厳しい課題、不確実性、状況の進展の複...

...

第14次5カ年計画を見据えて、我が国のロボット産業はどこに向かっているのでしょうか?

ロボットは製造業の「至宝」とみなされています。近年、人口ボーナスの継続的な減少と自動化生産の需要の継...

...