は、私たちはあなたの目標は、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')