6

scikit-learnでの差異OneVsRestClassifierMultiOutputClassifierの間に説明がありますか(例を考えてください)。scikitのOneVsRestClassifierとMultiOutputClassifierの違いは何ですか?

私はドキュメントを読んでいると私は、我々が使用することを理解しました:

  • OneVsRestClassifier - 私たちはマルチクラスまたはマルチラベル分類をしたいと、それは戦略だときに、クラスにつき1つの分類器を取り付けるで構成されてい。各分類子について、そのクラスは他のすべてのクラスに適合する。 (これはかなり明確であり、マルチクラス/マルチラベル分類の問題は、複数のバイナリ分類問題に分解されることを意味する)。
  • MultiOutputClassifier - 私たちは、マルチターゲットの分類をしたい(?これは何ですか)、それは戦略がターゲットにつき1つの分類器を取り付けるで構成されています(?ターゲットが何を意味する)

I OneVsRestClassifierをマルチラベル分類に使用しましたが、どのように動作するのか理解できますが、MultiOutputClassifierが見つかり、OneVsRestClassifierとはどのように動作するのか理解できません。よりよいの違いを説明するために

答えて

9

は、私たちはあなたの目標は、4つの異なる相互に排他的なクラス、すなわち'Python''Java''C++''Other language'にSOの質問を分類することであると仮定しましょう。私たちはあなたがちょうど6によって形成されたデータセットにSOの質問があり、次のようにこれらの質問のクラスラベルは、アレイyに格納されていることを考えてみましょう:

import numpy as np 
y = np.asarray(['Java', 'C++', 'Other language', 'Python', 'C++', 'Python']) 

上記のような状況は通常マルチクラス分類と呼ばれています。クラシファイアを適合させ、scikit-learnライブラリを通してモデルを検証するためには、テキストクラスラベルを数値ラベルに変換する必要があります。あなたが使用できることを達成するためにLabelEncoder

from sklearn.preprocessing import LabelEncoder 
le = LabelEncoder() 
y_numeric = le.fit_transform(y) 

これは、データセットのラベルがエンコードされている方法です。

これらの数字は、次の配列のインデックス表す
In [220]: y_numeric 
Out[220]: array([1, 0, 2, 3, 0, 3], dtype=int64) 

In [221]: le.classes_ 
Out[221]: 
array(['C++', 'Java', 'Other language', 'Python'], 
     dtype='|S14') 

ここで、0123のプールを使用してこのようなマルチクラス分類を実行したいとしますバイナリクラシファイア、n_classes異なるクラスの数です。これらのバイナリ分類器のそれぞれは、アイテムが特定のクラスのものであるかどうかを決定する。この場合、クラスラベルを0からn_classes - 1までの整数値としてエンコードすることはできません。代わりに2次元のインジケータ行列を作成する必要があります。サンプルnがクラスkであるとします。次に、指標行列の[n, k]エントリは1であり、行nの残りの要素は0です。クラスが相互に排他的でない場合、複数の1が連続して存在する可能性があることに注意することが重要です。このアプローチは、マルチラベル分類命名され、容易MultiLabelBinarizerを介して実装することができる。

from sklearn.preprocessing import MultiLabelBinarizer 
mlb = MultiLabelBinarizer() 
y_indicator = mlb.fit_transform(y[:, None]) 

インジケータは次のようになります

In [225]: y_indicator 
Out[225]: 
array([[0, 1, 0, 0], 
     [1, 0, 0, 0], 
     [0, 0, 1, 0], 
     [0, 0, 0, 1], 
     [1, 0, 0, 0], 
     [0, 0, 0, 1]]) 

1「sは実際にこの配列のインデックスであり、列番号:

In [226]: mlb.classes_ 
Out[226]: array(['C++', 'Java', 'Other language', 'Python'], dtype=object) 

特定のSO質問を言語とアプリケーションなどの2つの異なる基準に従って同時に分類したい場合はどうすればよいですか?この場合、複数出力の分類を実行する予定です。わかりやすくするために、私は3つのアプリケーションクラス、すなわち'Computer Vision','Speech Processing 'および'Other application'のみを考慮する。データセットのラベル配列は2次元でなければなりません。

y2 = np.asarray([['Java', 'Computer Vision'], 
       ['C++', 'Speech Recognition'], 
       ['Other language', 'Computer Vision'], 
       ['Python', 'Other Application'], 
       ['C++', 'Speech Recognition'], 
       ['Python', 'Computer Vision']]) 

また、テキストクラスラベルを数値ラベルに変換する必要があります。私が知る限り、この機能はまだscikit-learnで実装されていないので、独自のコードを書く必要があります。 This threadはそれを行うにはいくつかの巧妙な方法を説明していますが、この記事の目的のために、次のワンライナーで十分です:

y_multi = np.vstack((le.fit_transform(y2[:, i]) for i in range(y2.shape[1]))).T 

エンコードされたラベル

は次のようになります。

In [229]: y_multi 
Out[229]: 
array([[1, 0], 
     [0, 2], 
     [2, 0], 
     [3, 1], 
     [0, 2], 
     [3, 0]], dtype=int64) 

との意味各列の値は、次の配列から推測できます。

In [230]: le.fit(y2[:, 0]).classes_ 
Out[230]: 
array(['C++', 'Java', 'Other language', 'Python'], 
     dtype='|S18') 

In [231]: le.fit(y2[:, 1]).classes_ 
Out[231]: 
array(['Computer Vision', 'Other Application', 'Speech Recognition'], 
     dtype='|S18') 
関連する問題