分類器の精度を上げる方法は?


16

OpenCV letter_recog.cppの例を使用して、ランダムツリーやその他の分類子を実験しています。この例には、ランダムツリー、ブースティング、MLP、kNN、単純ベイズ、SVMの6つの分類子が実装されています。20000のインスタンスと16の機能を備えたUCI文字認識データセットが使用されます。これをトレーニングとテストのために半分に分割しました。SVMの経験があるため、その認識エラーをすばやく3.3%に設定しました。いくつかの実験の後、私が得たのは:

UCI文字認識:

  • RTrees-5.3%
  • ブースト-13%
  • MLP-7.9%
  • kNN(k = 3)-6.5%
  • ベイズ-11.5%
  • SVM-3.3%

使用されるパラメーター:

  • RTrees-max_num_of_trees_in_the_forrest = 200、max_depth = 20、min_sample_count = 1

  • ブースト-boost_type = REAL、weak_count = 200、weight_trim_rate = 0.95、max_depth = 7

  • MLP-method = BACKPROP、param = 0.001、max_iter = 300(デフォルト値-実験するには遅すぎる)

  • kNN(k = 3)-k = 3

  • ベイズ-なし

  • SVM-RBFカーネル、C = 10、ガンマ= 0.01

その後、同じパラメーターを使用し、最初に勾配フィーチャ(ベクトルサイズ200要素)を抽出して、DigitsおよびMNISTデータセットでテストしました。

数字:

  • RTrees-5.1%
  • ブースト-23.4%
  • MLP-4.3%
  • kNN(k = 3)-7.3%
  • ベイズ-17.7%
  • SVM-4.2%

MNIST:

  • RTrees-1.4%
  • ブースト-メモリ不足
  • MLP-1.0%
  • kNN(k = 3)-1.2%
  • ベイズ-34.33%
  • SVM-0.6%

私は、SVMとkNNを除くすべての分類器を初めて使用します。これらの2つについては、結果が良好であると言えます。他の人はどうですか?ランダムツリーからより多くを期待しました。MNISTkNNではより高い精度が得られますが、それを高くする方法はありますか。BoostとBayesは非常に低い精度を提供します。最後に、これらの分類子を使用して複数の分類子システムを作成したいと思います。何かアドバイス?

回答:


9

次元削減

もう1つの重要な手順は、トレーニングとテストデータセットのエラー率を比較して、過剰適合であるかどうかを確認することです(「次元の呪い」による)。たとえば、テストデータセットのエラー率がトレーニングデータセットのエラー率よりもはるかに大きい場合、これは1つの指標になります。
この場合、PCAやLDAなどの次元削減手法を試すことができます。

興味のある方は、PCA、LDA、その他のテクニックについてここに書いています:http : //sebastianraschka.com/index.html#machine_learningとGitHubのレポジトリ:https : //github.com/rasbt/pattern_classification

相互検証

また、分類器のパフォーマンスをより客観的な方法で評価するために、交差検証手法を調べてください。


はい、確かに、トレーニングデータセットのエラー率は約0です。オーバーフィットを減らすためにパラメーターを変更しても、テストデータセットの精度は上がりませんでした。できるだけ早くあなたが言及し、コメントするテクニックを検討します、ありがとうございます。
ミカ14

トレーニングとテストデータセットの相対的な割合はどのくらいですか?70:30、60:40、または50:50の行ですか?

最初のデータセット-UCI文字認識は50:50(10000:10000)に設定され、数字は約51:49(1893:1796)、MNISTは約86:14(60000:10000)です。
ミカ14

PCAを試しましたが、ランダムフォレストではまだ良い結果が得られませんでしたが、boostとBayesは他の分類器と同様の結果を提供します。ここでランダムフォレストについての議論を見つけました:stats.stackexchange.com/questions/66543 / ...実際にはオーバーフィットしていない可能性がありますが、そこに記載されているout-of-bag(OOB)予測エラーが見つかりませんでした。多数のツリーで実験を実行して、精度が向上するかどうかを確認します。
ミカ14

さて、あなたは少し進歩しているように聞こえます:)些細な質問ですが、標準偏差= 1の平均を中心とするように特徴(zスコア)を標準化しましたか?

5

私はランダムツリーからもっと期待しました

  • ランダムフォレストでは、通常N個の機能に対して、各決定木の構築にsqrt(N)機能が使用されます。N = 20の場合、max_depth(各決定木を構築するためのサブ機能の数)を5に設定してみてください。

  • 意思決定ツリーの代わりに、ランダムモデル、特に多項ロジスティック回帰および単純ベイズのベース推定量として線形モデルが提案および評価されています。これにより、精度が向上する場合があります。

MNISTでは、kNNはより高い精度を提供しますが、それを高くする方法はありますか?

  • Kの値を大きくしてみてください(5または7など)。Kの値が高いほど、ポイントのクラスラベルに関するより支持的な証拠が得られます。
  • k最近傍を実行する前に、PCAまたはフィッシャーの線形判別分析を実行できます。これにより、ポイント間の距離を計算している間に相関フィーチャを削除できる可能性があるため、k近傍はより堅牢になります。
  • K近傍間の距離の分散に基づいて、異なるポイントに対して異なるK値を試してください。

あなたはOpenCV nactive_varsパラメータ(max_depthではない)を参照していると信じています。これはデフォルトのsqrt(N)値に設定します。つまり、最初のデータセットではnactive_vars = sqrt(16)、他の2つではsqrt(200)です。max_depthは、ツリーが完全な深さまで成長するかどうか(25が最大値)を決定し、アンダーフィットとオーバーフィットのバランスを取ります。 詳細は、stats.stackexchange.com / questions / 66209 /… 1が最もよく機能しました。
ミカ14

OpenCVのドキュメントには、パラメーターの簡単な説明が記載されています。docs.opencv.org / modules / ml / doc / ...ここでは、複数の分類システムでの作業に集中したいので、ランダムツリーを適切に機能させ、物事をシンプルに保ちたいと思います。
ミカ14

kNNについて-これらはすべて本当に良い提案ですが、私が言いたいのは、kNNがランダムツリー分類器よりも優れていることであり、ランダムツリーで改善する余地がたくさんあると思います。
ミカ14

はい、ランダムフォレストが単純なk-NNアプローチよりもパフォーマンスが良くない(または優れている)理由がわかりません... P(y | D)(パラメトリックモデルなどのP(θ| D)(潜在モデルのデータ)を推定せずに、k-NNなどの(所定のデータを出力)。
デベース14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.