1. ホーム
  2. python

[解決済み] ConvergenceWarning: Liblinearの収束に失敗しました。

2023-06-23 10:07:57

質問

Adrianのために線形バイナリパターンのコードを実行しています。このプログラムは実行されますが、以下のような警告が表示されます。

C:\Python27\lib\site-packages\sklearn\svm\base.py:922: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.
 "the number of iterations.", ConvergenceWarning

python2.7をopencv3.7で動かしていますが、どうしたらよいでしょうか?

どのように解決するのですか?

通常、最適化アルゴリズムが収束しないときは、問題がうまく条件づけられていないことがほとんどで、おそらく決定変数のスケーリングがうまくいっていないことが原因です。試せることはいくつかあります。

  1. 学習データを正規化し、問題がよりよく条件付けされるようにします。 になり、収束が早くなります。1 つの データを0平均、単位標準偏差にスケーリングすることも可能です。 Scikit-Learnの 標準スケーラ を使うことです。学習データでフィットしたStandardScalerをテストデータに適用する必要があることに注意してください。また、離散的な特徴がある場合は、スケーリングが意味をなすように適切に変換されていることを確認します。
  2. 1)に関連しますが、正則化、重み付けなどの他の引数を確認します。 の重みを確認します。 C が適切に設定されていることを確認する。 C は > 0 でなければなりません。 C を対数スケール(1e-5, 1e-4, 1e-3, ..., 1, 10, 100, ...)で試し、特定の間隔内でより細かい粒度で調整するのが一般的です。最近では、例えば、以下のようなパッケージを使用したベイズ最適化などを使用してパラメータを調整する方が理にかなっていると思われます。 Scikit-Optimize .
  3. 設定 max_iter をより大きな値に設定する。デフォルトは1000です。これは最後の手段であるべきです。最初の1000回の反復で最適化プロセスが収束しない場合、より大きな max_iter で説明したような他の問題が隠されていることがあります。) また、適切な特徴量や特徴量に強い相関があることを示す場合もあります。この簡単な方法を取る前に、まずそれらをデバッグしてください。
  4. 設定 dual = True は、特徴の数 > 例の数、またはその逆の場合。これで、SVM最適化問題を双対定式化を使って解くことができます。 ありがとうございます。 Nino van Hooff と、私のミスを指摘してくれた@JamesKoに感謝します。
  5. 別のソルバー、例えばロジスティック回帰を使用している場合はL-BFGSソルバーを使用してください。参照 5ervant の回答を参照してください。

注意:この警告を無視してはいけません。

この警告が発生した理由は

  1. 線形SVMを解くことは、二次最適化問題を解くことに過ぎません。ソルバーは通常、解の実行推定値 (すなわち SVM の重みとバイアス) を保持する反復アルゴリズムです。 解がこの凸最適化問題に最適な目的値に対応するとき、または設定された最大反復回数に達したときに、実行を停止します。

  2. アルゴリズムが収束しない場合、SVMのパラメータの現在の推定値が良いものであることは保証されず、したがって予測値も完全なゴミとなる可能性があります。

編集

さらに、次のようなコメントも考えてみましょう。 ニノ・ヴァン・フーフ 5ervant を追加して、SVMの二重定式化を使用します。これは、特徴の数Dが学習例数Nより多い場合に特に重要です。これは、SVMの双対定式化が特にそのために設計されており、最適化問題の条件付けを助けるものです。謝辞 5ervant に感謝します。

さらに @5ervant はソルバーを変更する可能性、特にL-BFGSソルバーの使用についても指摘しています。彼の功績を称えましょう(つまり、私の答えではなく、彼の答えをアップヴォートしてください)。

なぜこのケースでこれが重要なのか、興味のある方(私はそうです:)のために、ざっとした説明をしたいと思います。2次法、特にL-BFGSソルバーのような近似2次法は、各反復でヘシアンを近似し、それを勾配方向のスケールに使用するので、条件不一致の問題で役に立ちます。これにより、より良い収束を得ることができます。 を使用しますが、反復あたりの計算コストは高くなる可能性があります。つまり、より少ない反復で終了しますが、各反復は勾配降下やその変種のような典型的な一次手法よりも遅くなります。

例えば、典型的な一次メソッドは各反復で次のように解を更新するかもしれません。

x(k + 1) = x(k) - alpha(k) * gradient(f(x(k)))

ここで、alpha(k)は反復計算kにおけるステップサイズであり、アルゴリズムや学習率スケジュールの特定の選択に依存します。

2次法、例えばニュートンは、更新方程式を持ちます。

x(k + 1) = x(k) - alpha(k) * Hessian(x(k))^(-1) * gradient(f(x(k)))

つまり、ヘシアンにエンコードされた局所曲率の情報を使って、それに応じて勾配をスケーリングするのです。問題が不正確な場合、勾配は理想的でない方向を指し、逆ヘッシアンのスケーリングはこれを修正するのに役立ちます。

特に、L-BFGSは 5ervant の回答にあるL-BFGSは、ヘシアンの逆数を計算するのが高価な操作になるため、それを近似する方法です。

しかし、2次の方法は、通常の勾配降下ベースのソルバーのような1次の方法よりもはるかに速く(すなわち、より少ない反復で)収束する可能性があります。これは、各反復で費やされる時間を補うことができます。

要約すると、よく調整された問題がある場合、あるいは正則化、特徴スケーリング、特徴より多くの例を持つようにするなどの他の手段によってよく調整できる場合、おそらく2次法を使う必要はないでしょう。しかし、最近では非凸問題を最適化する多くのモデル(例えばDLモデルなど)で、L-BFGS法などの2次法が別の役割を担っており、1次法と比較してより良い解が得られることがあることを示唆する証拠もあります。しかし、それはまた別の話です。