質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

3249閲覧

sklearnのSVCによる多クラス分類の動作について

ajdvsk184

総合スコア11

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/07/15 04:30

編集2019/07/15 04:57

sklearnのSVCによる多クラス分類の動作を知りたい

sklearnのSVCを使って多クラス分類をしています。
その際、__One-Vs-One__と__One-Vs-Rest__での結果の違いを比較するために、それぞれで結果を出力するつもりです。
そこで、SVCのデフォルトの動作がどちらなのか調べていたのですが、疑問が生じたのでお聞きさせて頂きたいと思います。

自分で調べた結果

自分で調べた結果では、おそらくデフォルトの動作は__One-Vs-One__である、というものでした。
sklearnの公式ドキュメントには
> The multiclass support is handled according to a one-vs-one scheme.
とあり、decision_function_shape__の項目にも、
**
> However, one-vs-one (‘ovo’) is always used as multi-class strategy.__**
とありました。
公式ドキュメント

試したこと

そこで、私は分類器生成に3つのコードを書いて、結果を比較してみました

  • コード1

python

1clf = SVC()
  • コード2

python

1clf = SVC() 2clf = OneVsOneClassifier(clf)
  • コード3

python

1clf = SVC() 2clf = OneVsRestClassifier(clf)

この3つで分類器を生成し、グリッドサーチによってパラメータチューニング(調整したパラメータは全て同じです)を行なって最良のパラメータによってテストデータの分類を行いました。
その結果、全て違う結果になりました。

生じた疑問

コード1とコード3、コード2とコード3が違う結果になるのは想定されていた通りの動作なのですが、コード1とコード2で異なる結果が出ました。
SVCのデフォルトが__One-Vs-One__であれば、単に生成しただけのコード1とOneVsOneClassifier()に通したコード2の結果が同じになると思うのですが、異なってしまいました。
これは何故でしょうか?

補足情報(FW/ツールのバージョンなど)

Python 2.7.16
scikit-learn 0.20.3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

random_stateがパラメータとしてあるので、両方で同じものを指定してみるといいかもしれません。

投稿2019/07/15 05:20

編集2019/07/15 05:23
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayataka2049

2019/07/15 05:26

試したけど、やっぱり一致しない気がする。違う実装だから、というので片付けてもいいような気もするんですが(汗)
ajdvsk184

2019/07/15 05:34

こちらでもrandom_stateを統一してやってみましたが、やはり違う結果が出ました。
hayataka2049

2019/07/15 05:35

The seed of the pseudo random number generator used when shuffling the data for probability estimates. なので、冷静に考えると確率の予測以外には効かないのかもしれません。
guest

0

decision_fuction_shapeパラメーターの説明は、デフォルトが'ovr'(つまりOne VS Rest)になっています。
よって、コード1とコード2が相違するのは、ovrとovoの相違であり、コード2とコード3は乱数未設定によるもの、ではないでしょうか

投稿2019/07/15 05:48

R.Shigemori

総合スコア3376

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayataka2049

2019/07/15 05:54

ドキュメントの記述を信頼するのであれば、内部的には常にovoを使い、decision_fuction_shape="ovr"でovoの結果をovrに変換して出力する(どうやるのかは知りませんが)という挙動になりそうです。 両方decision_function_shape="ovo"にしてみても、まだ違いますね・・・
guest

0

ベストアンサー

それは...SVCは非線形ですから汗

もしも比較をするのであれば、LinearSVCを使うべきではないでしょうか。以下の資料を参考にしてください。

https://qiita.com/nazoking@github/items/9decf45d106accc6afe1

投稿2019/07/15 04:41

bamboo-nova

総合スコア1408

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ajdvsk184

2019/07/15 04:46

すみません、タイトルが悪かったようです。 本当に知りたいのはOne-Vs-Oneなのかどうかと、もしそうならなぜコード1とコード2の結果が異なるのか、ということです。
bamboo-nova

2019/07/15 05:04

多クラス分類では、様々な手法がありますが(PRMLの7章とか参考にしてください)、その中のovoを採用しているのでしょう。 自分も原因は分からなかったのでgithubのissuesを見てみましたが、似たような事例はあるみたいです。パッと読んだだけですが、どうも訓練時とテスト時における判別する統計量が微妙に異なるのが原因だと思いました。 https://github.com/scikit-learn/scikit-learn/issues/9174
ajdvsk184

2019/07/15 05:32

ありがとうございます。 実装の仕様の違い、ということですかね。 今やりたい事はOne-Vs-OneとOne-Vs-Restでの結果の比較ですので、コード1かコード2のどちらかに統一して行えば良さそうですね。
hayataka2049

2019/07/15 06:01

@bamboo-novaさん それを読んでドン引きしましたが、幸い最新バージョンでは治っているようなので、他の原因を考えるべきかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問