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

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

導入

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

ブログ    
ブログ    

推薦する

AIがデータ統合の状況をどう変えるのか

生成 AI は統合の状況を変えています。 チームの経済性、速度、プロジェクト構造、配信モデルについて...

...

AI はなぜこれほど普及しているのに、実装が難しいのでしょうか?

過去 10 年間で、5G、ビッグデータ、クラウド コンピューティングなどの新興テクノロジーの登場によ...

...

日本のCGマスターがまた登場!リアルタイムの顔キャプチャのための 3D モデリング ソフトウェア

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

データ構造とアルゴリズム: リンクリストの交差、交差点を見つける

[[441326]]リンクリストの交差LeetCode の問題へのリンク: https://leet...

5Gテクノロジーが人工知能の能力をどのように向上させるか

5Gは人工知能の可能性を解き放ちます。しかし、AI と 5G は私たちの日常のビジネス生活にどのよう...

人工知能は若者を失業させるでしょうか? 996に圧倒されないでください。そうしないとチャンスがなくなります。

教育部が2019年3月に発表した新規登録学部専攻を例にとると、最も人気のある専攻は人工知能です。上海...

馬化騰と李延紅の対談:基礎技術は巨大産業の変革の基盤

11月8日、烏鎮で開催された世界インターネット大会で、馬化騰氏と李ロビン氏が首脳対談を行った。2人の...

...

学覇君主任科学者陳瑞峰:テクノロジーを活用して知識のサイロ化を減らし、教育の効率化を実現する

[51CTO.comからのオリジナル記事] 学習圧力が高く、教育資源の配分が不均衡な中国の教育システ...

...

DataCanvas Jiuzhang YunjiがCOOL NEWSをリリースし、企業が独立したAIを構築できるよう支援

[51CTO.comからのオリジナル記事] 人工知能の応用が深まるにつれ、データの価値はますます顕著...

大規模言語モデルはウォール街に勝てるか?株式選択における AI の可能性を明らかにする

金融分野における人工知能(AI)の応用は、特に株式市場の分析と予測において、幅広い注目と議論を集めて...