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

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

導入

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

ブログ    
ブログ    

推薦する

Pythonアルゴリズムの正しい実装の紹介

経験豊富な Python プログラマーにとって、Python アルゴリズムの実装は難しくありません。...

すべては可能だ:コンピュータビジョンCVとNLPの分野はますます融合している

[[347900]] 2020年10月、ディープラーニング分野のトップカンファレンスであるICLR ...

...

...

初のヒューマンモーションキャプチャーモデルをリリース! SMPLer-X: 7つのチャートを一掃

表現力豊かな人間の姿勢と形状の推定 (EHPS) の分野では大きな進歩が遂げられていますが、最も先進...

人工知能開発における5つの制約問題、数千の問題を解決する5つの解決策

[[237095]]人工知能はどこにでもあるようです。私たちはそれを自宅や携帯電話で体験します。起業...

ロボットR2-D2は50年後に人間の仕事を完全に置き換えるでしょうか?

[51CTO.com クイック翻訳] 海外メディアの報道によると、誰かが設計しているロボットがあな...

AIガバナンスがトップに躍り出るには

人工知能(AI)技術は現在、広く利用されています。 AI ガバナンスが重要なのは、AI はより大きな...

Google の内部対立が激化!従業員が共同書簡に署名:AIマスターのジェフ・ディーン氏は謝罪すべき!

この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...

アリババ人工知能ラボ:テクノロジーがあなたの生活をどう変えるかを見てみましょう

[PConline News] ジャカルタアジア競技大会が閉幕し、アジア競技大会は正式に杭州タイムに...

ビッグバンを証明した男が亡くなった!宇宙背景放射の発見でノーベル賞受賞者が90歳で死去

ノーベル物理学賞を受賞し、宇宙のビッグバン理論を証明したアメリカの物理学者で電波天文学者のアーノ・ア...

ロボット革命はビジネス環境を変えている

今世紀の前半には、巨大な片腕の巨人のような産業用ロボットがロボット工学の分野を支配していました。産業...

単一のニューロンでも DNN 機能を実現でき、画像分類の精度は 98% です。

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

...

初心者のためのホームオートメーション完全ガイド

スマートホームはテクノロジーを活用して、居住者にさらなる利便性、節約、快適性、セキュリティを提供しま...