多类分类
为了更好地说明差异,让我们假设您的目标是将 SO 问题分类为n_classes
不同的、互斥的类。在这个例子中为了简单起见,我们将只考虑四个类,即'Python'
、'Java'
和。让我们假设您有一个仅由六个 SO 问题组成的数据集,并且这些问题的类标签存储在一个数组中,如下所示:'C++'
'Other language'
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')
一个重要的特殊情况是只有两个类,即n_classes = 2
. 这通常称为二元分类。
多标签分类
现在让我们假设您希望使用一个n_classes
二元分类器池(n_classes
即不同类的数量)来执行这种多类分类。这些二元分类器中的每一个都会决定项目是否属于特定类别。0
在这种情况下,您不能将类标签编码为从到的整数n_classes - 1
,您需要创建一个二维指示矩阵。考虑 samplen
是 class 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 问题进行分类怎么办?在这种情况下,您打算进行多输出分类。为简单起见,我将只考虑三个应用程序类,即'Computer Vision'
''Speech Processing
和'Other application
'。您的数据集的标签数组应该是二维的:
y2 = np.asarray([['Java', 'Computer Vision'],
['C++', 'Speech Recognition'],
['Other language', 'Computer Vision'],
['Python', 'Other Application'],
['C++', 'Speech Recognition'],
['Python', 'Computer Vision']])
同样,我们需要将文本类标签转换为数字标签。据我所知,此功能尚未在 scikit-learn 中实现,因此您需要编写自己的代码。该线程描述了一些巧妙的方法来做到这一点,但就本文而言,以下单行就足够了:
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')