分类问题是机器学习中的一种重要问题,其目标是将数据分为不同的类别或标签。在分类问题中,我们需要使用一些已知类别的训练数据来训练分类模型,然后用该模型对未知数据进行分类预测。
分类问题可以分为两类:单标签分类问题和多标签分类问题。在单标签分类问题中,每个样本只有一个标签,需要将其分为两个或多个类别;而在多标签分类问题中,每个样本可以属于多个类别,需要同时预测多个标签。
在分类问题中,我们通常使用监督学习算法,如决策树、逻辑回归、支持向量机、神经网络等来进行建模和预测。在建模过程中,我们需要选择合适的特征和模型,使用训练数据来拟合模型,并使用评估指标(如准确率、召回率、精确率、F1得分等)来评估模型的性能。
分类问题在实际应用中具有广泛的应用,如文本分类、图像分类、音频分类、信用评级等。
y
to an estimator’s fit method.dependent variable
,outcome variable
,response variable
,ground truth
,label
.sklearn.utils.multiclass.type_of_target — scikit-learn documentation
确定目标指示的数据类型。 需要注意的是,这个类型是可以推断出的最具体的类型。
target_typestr,One of:
‘continuous’: y is an array-like of floats that are not all integers, and is 1d or a column vector.
‘continuous-multioutput’: y is a 2d array of floats that are not all integers, and both dimensions are of size > 1.
‘binary’: y contains <= 2 discrete values and is 1d or a column vector.
‘multiclass’: y contains more than two discrete values, is not a sequence of sequences, and is 1d or a column vector.
‘multiclass-multioutput’: y is a 2d array that contains more than two discrete values, is not a sequence of sequences, and both dimensions are of size > 1.
‘multilabel-indicator’: y is a label indicator matrix, an array of two dimensions with at least two columns, and at most 2 unique values.
‘unknown’: y is array-like but none of the above, such as a 3d array, sequence of sequences, or an array of non-sequence objects.
target_typestr是用于描述目标数据类型的字符串,包括以下七种类型:
‘continuous’:y是一个浮点数数组,不全是整数,可以是1维数组或列向量。
‘continuous-multioutput’:Y 是一个2d 浮点数组,它不全是整数,而且两个维度的大小都大于1
‘binary’:y包含<=2个离散值,可以是1维数组或列向量。
‘multiclass’:y包含多于两个离散值,不是一个序列的序列,可以是1维数组或列向量。
‘multiclass-multioutput’:y是一个大小大于1的2维数组,包含多于两个离散值,不是一个序列的序列。
‘multilabel-indicator’:y是一个标签指示矩阵,一个大小为2的二维数组,其中至少有两列,最多有两个唯一值。
‘unknown’:y是类数组的数据类型,但不属于上述任何一种类型,例如3维数组、序列的序列或非序列对象的数组。
type_of_target(np.array([[1, 2], [3, 1]]))
type_of_target(np.array([[1.5, 2.0], [3.0, 1.6]]))
def unique_matrix(rng=10,u=2,m=3,n=4):
"""
#调整unique value来控制target_type
#如果unique<=2,则结果是multilabel-indicator
#如果unique>2,则结果是multilabel-multioutput
#m,n随便调,只要保证都大于0即可
examples:
--------
>>>unique_matrix()
@u=3,m=3,n=4
array([[6, 8, 6, 2],
[8, 6, 8, 8],
[6, 6, 8, 2]])
"""
l=range(rng)
c=np.random.choice(l,u,replace=False)
print(f"@{u=},{m=},{n=}")
M=np.random.choice(c,size=(m,n))
print(M,'@{M2}')
print(type_of_target(M),"@{type_of_target(M)}")
return M
unique_matrix()
unique_matrix(u=3,m=6)
@u=2,m=3,n=4
[[8 8 9 8]
[9 9 9 8]
[9 9 8 8]] @{M2}
multilabel-indicator @{type_of_target(M)}
@u=3,m=6,n=4
[[0 1 1 3]
[1 0 0 1]
[3 1 3 1]
[3 3 0 3]
[0 1 1 1]
[1 1 0 1]] @{M2}
multiclass-multioutput @{type_of_target(M)}
The number of features.
The number of outputs in the target.
The number of samples.
Synonym for n_outputs.
A classification problem consisting of two classes. A binary target may be represented as for a multiclass problem but with only two labels. A binary decision function is represented as a 1d array.
Semantically, one class is often considered the “positive” class. Unless otherwise specified (e.g. using pos_label in evaluation metrics), we consider the class label with the greater value (numerically or lexicographically) as the positive class: of labels [0, 1], 1 is the positive class; of [1, 2], 2 is the positive class; of [‘no’, ‘yes’], ‘yes’ is the positive class; of [‘no’, ‘YES’], ‘no’ is the positive class. This affects the output of decision_function, for instance.
Note that a dataset sampled from a multiclass y
or a continuous y
may appear to be binary.
type_of_target
will return ‘binary’ for binary input, or a similar array with only a single class present.
A classification problem where each sample’s target consists of n_outputs
outputs, each a class label, for a fixed int n_outputs > 1 in a particular dataset.
Each output has a fixed set of available classes, and each sample is labeled with a class for each output.
An output may be binary or multiclass, and in the case where all outputs are binary, the target is multilabel.
Multiclass multioutput targets are represented as multiple multiclass targets, horizontally stacked into an array of shape (n_samples, n_outputs).
XXX: For simplicity, we may not always support string class labels for multiclass multioutput, and integer class labels should be used.
multioutput provides estimators which estimate multi-output problems using multiple single-output estimators. This may not fully account for dependencies among the different outputs, which methods natively handling the multioutput case (e.g. decision trees, nearest neighbors, neural networks) may do better.
type_of_target will return ‘multiclass-multioutput’ for multiclass multioutput input.
一个分类问题,其中每个样本的标签都由n_outputs个输出组成,每个输出是一个标签类别,与特定数据集中的固定的、整数型的、大于1的n_outputs相对应。
每个输出都有一组固定的可用类,每个样本在每个输出下都标记有一个类。
输出可以是二分类或多分类的,并且在所有输出都是二分类的情况下,目标是多标签的。(多输出问题退化为多标签问题)
多分类多输出的标签被表示为多个分类型目标,它们可以被水平堆叠成(n_samples,n_outputs)形状的数组。 为简单起见,我们在多分类多输出问题中可能并不总是支持字符串类标签,应该使用整数类标签。
multioutput提供了使用多个单输出估算器来估计多输出问题的估算器。这可能无法完全说明不同输出之间的依赖关系,那些本来就能够处理多输出情况的算法(例如决策树,最近邻算法,神经网络等)可能会做得更好。
按我的理解是这样的,例如,我们对一批学习资料进行分类
科目(subject) | 适用阶段(stage) | 媒介(medium) |
---|---|---|
math | Elementary school | ebook |
Chinese | Junior high school | pbook |
english | High school | |
University |
A multiclass multioutput target where each output is binary. This may be represented as a 2d (dense) array or sparse matrix of integers, such that each column is a separate binary target, where positive labels are indicated with 1 and negative labels are usually -1 or 0. Sparse multilabel targets are not supported everywhere that dense multilabel targets are supported.
Semantically, a multilabel target can be thought of as a set of labels for each sample. While not used internally, preprocessing.MultiLabelBinarizer is provided as a utility to convert from a list of sets representation to a 2d array or sparse matrix. One-hot encoding a multiclass target with preprocessing.LabelBinarizer turns it into a multilabel problem.
type_of_target will return ‘multilabel-indicator’ for multilabel input, whether sparse or dense.
多标签分类(multi-label classification)是一种特殊的多输出多类分类(multiclass multioutput)问题,其中每个输出都是二元的。多标签分类可以使用一个二维数组或者稀疏矩阵来表示,每一列表示一个不同的二元目标,其中正类标签用1表示,负类标签通常用-1或0表示。稀疏多标签目标并不是在所有支持密集多标签目标的地方都被支持。
从语义上讲,多标签目标可以被视为每个样本的标签集合。虽然在内部没有被使用,但是可以使用preprocessing.MultiLabelBinarizer将多标签目标从列表集合的表示方式转换为二维数组或稀疏矩阵。使用preprocessing.LabelBinarizer对多类别目标进行one-hot编码可以将其转换为多标签问题。
对于多标签输入,type_of_target函数将返回’multilabel-indicator’。
多标签(Multilabel)、多类别(Multiclass)和多输出(Multioutput)分类是机器学习中的三种不同分类问题。让我们分别了解它们之间的关系和区别,并给出一些例子。
多类别分类是指一个样本只能属于一个类别。这是一个典型的分类问题,比如手写数字识别。在这种情况下,我们有10个类别(0到9),但一个样本只能属于其中一个类别。
例子:预测图片中的动物是猫、狗还是鸟。
多标签分类是指一个样本可以属于多个类别。在这种情况下,每个样本都可能有不止一个标签。
例子:给一篇文章打标签,可能的标签包括:“科技”、“政治”、“经济”、“娱乐"等。一篇文章可能既涉及"科技”,又涉及"政治",所以可以被同时打上这两个标签。
多输出分类是指有多个输出变量,每个输出变量都有多个类别。这可以看作是多个多类别分类问题的组合。
例子:预测一个人的职业和教育水平。在这个问题中,有两个输出变量:职业(如医生、律师、教师等)和教育水平(如高中、大学、研究生等)。每个输出变量都有多个类别,因此这是一个多输出分类问题。
关系:
简而言之,多类别分类关注单一标签,多标签分类关注多个标签,而多输出分类关注多个输出变量,每个变量可以有多个类别。
multilabel indicator matrices
Label indicator是一种用于表示多分类问题中标签的方法,通常在机器学习中使用。在Label indicator中,每个样本的标签被表示为一个向量,向量的长度等于类别数,每个元素表示该样本是否属于该类别。
如果一个样本属于某个类别,则该类别对应的向量元素取值为1,否则为0。
因此,Label indicator也被称为One-Hot编码或One-of-K编码。
例如
使用Label indicator的好处是,可以将多分类问题中的标签转化为一个简单的向量形式,方便模型训练和预测。同时,Label indicator也可以避免标签值之间的大小关系对模型带来的影响,因为在Label indicator中,每个类别被视为独立的二元变量。
sklearn中的type_of_target
函数将要求稍微放宽,只要是包含的元素只有两种就行,而不要求必须是0或1
二分类、多分类、单标签分类、多标签分类是分类问题的不同类型,它们之间的关系如下:
sklearn.Processing
sklearn.preprocessing
是Scikit-learn库(也称为sklearn)中的一个模块,提供了一系列数据预处理工具,用于在机器学习模型训练之前对数据进行处理和转换。该模块包含了许多常用的数据预处理方法,例如标准化、缩放、二值化、编码、填充等等。
以下是sklearn.preprocessing模块中常用的一些类和函数:
除了上述方法外,sklearn.preprocessing模块还提供了许多其他的数据预处理工具,可以根据具体需求进行选择和使用。这些工具可以帮助我们在机器学习模型训练之前对数据进行处理和转换,提高模型的准确性和可靠性。
OneHotEncoder
Specifies a methodology to use to drop one of the categories per feature. This is useful in situations where perfectly collinear features cause problems, such as when feeding the resulting data into an unregularized linear regression model. 使用一种方法来删除每个特征中的一个类别。这在存在完全共线特征导致问题的情况下非常有用,例如将结果数据输入到非正则化线性回归模型中。 简而言之,这种技术可以用来解决特征之间存在高度相关性(共线性)导致的问题。在某些机器学习算法中,这种问题可能会导致模型过拟合或者性能下降。通过删除每个特征中的一个类别,可以减少共线性,从而提高模型的泛化能力,并使结果更易于解释。
在机器学习和数据分析中,通常需要对数据进行预处理和转换,以使其适用于特定的算法或任务。其中一个常见的预处理步骤是将类别数据编码为数值形式,以便于计算机处理。
为了将类别数据编码为数值形式,需要确定每个特征的类别,即将每个类别映射到唯一的数值。这通常需要使用训练数据集中的样本来确定类别,然后将该映射应用于整个数据集。
例如,如果有一个特征表示颜色,可能有多个不同的类别,如红色、蓝色、绿色等。为了在机器学习算法中使用这个特征,需要将每个颜色类别映射到一个数值,如红色对应0,蓝色对应1,绿色对应2等。可以使用训练数据集中的颜色样本来确定这个映射,并将其应用于整个数据集。
sklearn.preprocessing.LabelBinarizer — scikit-learn documentation
Binarize labels in a one-vs-all fashion.
Several regression and binary classification algorithms are available in scikit-learn. A simple way to extend these algorithms to the multi-class classification case is to use the so-called one-vs-all scheme.
At learning time, this simply consists in learning one regressor or binary classifier per class. In doing so, one needs to convert multi-class labels to binary labels (belong or does not belong to the class). LabelBinarizer makes this process easy with the transform method.
At prediction time, one assigns the class for which the corresponding model gave the greatest confidence. LabelBinarizer makes this easy with the inverse_transform method.
用一对多的方法对标签进行二元化。
scikit-learn中提供了多种回归和二元分类算法。将这些算法扩展到多类别分类情况的一种简单方法是使用所谓的一对多方案。
在学习时,这个方案就是针对每个类学习一个回归器或二元分类器。为了做到这一点,需要将多类别标签转换为二元标签(属于或不属于该类)。LabelBinarizer提供了transform方法使这个过程变得容易。
在预测时,我们会将样本分配给相应模型给出的置信度最高的类别。LabelBinarizer提供了inverse_transform方法使这个过程变得容易。
scikit-learn中的LabelBinarizer模块是一种用于将标签数据进行二值化处理的工具。
在机器学习领域中,经常需要将标签数据转化为二进制表示形式,以便于对其进行处理和分析。LabelBinarizer模块就是用来实现这一功能的。
methods(https links) | Descriptoins |
---|---|
fit (y) |
Fit label binarizer. |
fit_transform (y) |
Fit label binarizer/transform multi-class labels to binary labels. |
get_params ([deep]) |
Get parameters for this estimator. |
inverse_transform (Y[, threshold]) |
Transform binary labels back to multi-class labels. |
set_output (*[, transform]) |
Set output container. |
set_params (**params) |
Set the parameters of this estimator. |
transform (y) |
Transform multi-class labels to binary labels. |
只包含0和1的矩阵通常被称为二进制矩阵(binary matrix),也可以称为布尔矩阵(Boolean matrix)。这种类型的矩阵通常用于表示图形、网络或逻辑关系等问题。
在Python中,可以使用NumPy库来创建二进制矩阵。例如要得到一个5x3的二进制进制矩阵,可以使用以下代码
M=np.random.randint(0,2,size=(5,3))
print(M)
Fit label binarizer.
Parameters:
Returns:
参数y
是目标值,用于多标签分类任务。对于二元分类问题,y
可以是一个形状为(n_samples,)
的一维数组,其中每个元素表示一个样本的标签,取值为0或1,表示该样本属于或不属于某个类别。对于多类别分类问题,y
可以是一个形状为(n_samples, n_classes)
的二维数组,其中n_samples
表示样本数,n_classes
表示类别数,每个元素表示一个样本在对应类别上的标签,取值为0或1,表示该样本属于或不属于该类别。
当一个样本属于多个类别时,对应的元素取值为1,否则为0。因此,参数y
的二维数组可以被看做是多个二元分类问题的组合,每个类别对应一个二元分类问题。
在多标签分类问题中,一个样本可以同时属于多个类别,与传统的单标签分类问题不同,因此需要使用多标签分类算法进行处理。
eg:
>>> from sklearn import preprocessing
>>> lb = preprocessing.LabelBinarizer()
>>> lb.fit([1, 2, 6, 4, 2])
LabelBinarizer()
>>> lb.classes_
array([1, 2, 4, 6])
>>> lb.transform([1, 6])
array([[1, 0, 0, 0],
[0, 0, 0, 1]])
>>> import numpy as np
>>> lb.fit(np.array([[0, 1, 1], [1, 0, 0]]))
LabelBinarizer()
>>> lb.classes_
array([0, 1, 2])
>>> lb.transform([0, 1, 2, 1])
array([[1, 0, 0],
[0, 1, 0],
[0, 0, 1],
[0, 1, 0]])
lb = preprocessing.LabelBinarizer()
bool_seq=['yes', 'no', 'no', 'yes']
lf=lb.fit(bool_seq)
classes=lf.classes_
print(f'{classes=}')
lb = preprocessing.LabelBinarizer()
lbft=lb.fit_transform(['yes', 'no', 'no', 'yes'])
print(lbft,'@{lbft}')
#
print(f'{lb.y_type_=}')
classes=array(['no', 'yes'], dtype=')
[[1]
[0]
[0]
[1]] @{lbft}
lb.y_type_='binary'
from sklearn.preprocessing import LabelBinarizer
# 三分类
# labels中含有4个样本的标签(label)
labels = ['cat', 'dog', 'bird', 'dog']
lb = LabelBinarizer()#实例化二元预处理对象
# 使用fit_transfrom(labels)拟合后直接转换labels
binary_labels = lb.fit_transform(labels)
# 打印结果
print(lb.y_type_,'@{lb.y_type}')
print(binary_labels,'@{binary_labels}')
# 通常会排序去重后再编码,这里排序labels只是为了放便对比
l=list(set(labels))
l.sort()
# print(l)
ord=len(l)
m=[list(range(ord)),l]
m=np.array(m,dtype=')
print(m)
multiclass @{lb.y_type}
[[0 1 0]
[0 0 1]
[1 0 0]
[0 0 1]] @{binary_labels}
[['0' '1' '2']
['bird' 'cat' 'dog']]
import numpy as np
# np.random.seed(0)
M=np.random.randint(0,2,size=(5,8))
print(M)
lb = LabelBinarizer()
#lb拟合二进制矩阵M(是5个样本的标签,每个标签是二进制向量,且向量长度为8,说明该分类问题包含8个标签)
#每个向量中可能包含k个1(k可能大于1),说明对应的样本被打上了k个标签
lb.fit(M)
print(f'{lb.classes_=}')
N=np.random.randint(0,2,size=(5,8))
print()
print(N,'@N')
R=lb.transform(N)
print(R,'@{R}')
print(f'{np.array_equal(N,R)=}')
print()
v=[0, 1, 4,7,9]
print(v,'@{v}')
lb.transform(v)
print(lb.transform(v),'@{lb.transform(v)}')
lb.y_type_
[[0 0 1 0 1 1 1 1]
[1 1 0 1 0 0 0 0]
[0 1 1 0 0 0 0 1]
[0 0 0 1 0 1 0 1]
[0 1 0 0 1 1 0 0]]
lb.classes_=array([0, 1, 2, 3, 4, 5, 6, 7])
[[0 1 1 1 1 0 1 1]
[0 1 0 1 0 0 0 0]
[0 0 1 0 0 1 1 1]
[1 1 0 1 0 0 1 0]
[0 1 0 1 1 1 1 0]] @N
[[0 1 1 1 1 0 1 1]
[0 1 0 1 0 0 0 0]
[0 0 1 0 0 1 1 1]
[1 1 0 1 0 0 1 0]
[0 1 0 1 1 1 1 0]] @{R}
np.array_equal(N,R)=True
[0, 1, 4, 7, 9] @{v}
[[1 0 0 0 0 0 0 0]
[0 1 0 0 0 0 0 0]
[0 0 0 0 1 0 0 0]
[0 0 0 0 0 0 0 1]
[0 0 0 0 0 0 0 0]] @{lb.transform(v)}
'multilabel-indicator'
貌似如果将一维数组v传递给lb.transform
,会将处理为单标签
0,1,2,...,n-1
)那么v中大等于n的值被转换为0向量如果传递二进制矩阵,则会原样输出)
Transform multi-class labels to binary labels.
The output of transform is sometimes referred to by some authors as the 1-of-K coding scheme.
Parameters:
Returns:
Fit label binarizer/transform multi-class labels to binary labels.
The output of transform is sometimes referred to as the 1-of-K coding scheme.
Fit label binarizer/transform multi-class labels to binary labels指的是将多类标签转换为二进制标签的过程,通过将每个类别转换为一个二进制向量,其中只有一个元素为1,其他元素为0。这个过程可以使用Scikit-learn中的LabelBinarizer类来实现。
LabelBinarizer类可以将多类标签转换为二进制标签,其中每个类别对应一个二进制向量。该类还可以用于反转转换,将二进制标签转换回多类标签。
输出的二进制标签有时也称为1-of-K编码方案,其中K表示类别的数量。在这种编码方案下,每个样本的标签都是一个K维的二进制向量,其中只有一个元素为1,其他元素为0,用于表示该样本所属的类别。
以下是几个使用LabelBinarizer的示例:
将字符串类型的标签数据进行二值化处理:
from sklearn.preprocessing import LabelBinarizer
labels = ['cat', 'dog', 'bird', 'dog']
lb = LabelBinarizer()
binary_labels = lb.fit_transform(labels)
# 通常会排序去重后再编码,这里排序labels只是为了放便对比
l=list(set(labels))
l.sort()
# print(l)
ord=len(l)
m=[list(range(ord)),l]
m=np.array(m,dtype=')
print(m)
#
print(binary_labels)
[['0' '1' '2']
['bird' 'cat' 'dog']]
[[0 1 0]
[0 0 1]
[1 0 0]
[0 0 1]]
在上述示例中,将字符串类型的标签数据进行了二值化处理,其中每一行表示一个样本,每一列表示一个类别,1表示该样本属于该类别,0表示不属于该类别。
将数值型的标签数据进行二值化处理:
from sklearn.preprocessing import LabelBinarizer
labels = [1, 2, 3, 2]
lb = LabelBinarizer()
binary_labels = lb.fit_transform(labels)
print(binary_labels)
# 输出:array([[1, 0, 0],
# [0, 1, 0],
# [0, 0, 1],
# [0, 1, 0]])
将机器学习模型输出的结果转化为原始的标签数据:inverse_transform
方法
In the case when the binary labels are fractional (probabilistic), inverse_transform chooses the class with the greatest value. Typically, this allows to use the output of a linear model’s decision_function method directly as the input of inverse_transform.
在二元标签为分数(概率)的情况下,inverse_transform
方法会选择具有最大值的类别。通常,这允许直接将线性模型decision_function
方法的输出作为inverse_transform
方法的输入。
这句话的意思是,在二元标签不仅仅是0和1,而是以概率或分数的形式表示(例如,在逻辑回归中),标签编码器的inverse_transform
方法会选择概率值最高的类别来将编码标签映射回其原始形式。
例如,如果我们有一个二元分类问题,标签以概率的形式表示,例如[0.2, 0.8],其中第一个值表示负类的概率,第二个值表示正类的概率,如果我们使用sklearn.preprocessing
模块中的LabelEncoder
对它们进行编码,得到的编码标签可能是[0, 1]。要将标签解码回其原始形式,我们可以使用标签编码器的inverse_transform
方法,它将选择具有最高概率值的类别(在本例中是概率为0.8的第二类),将其映射回原始标签值(在本例中是正类)。
inverse_transform
方法的这个性质允许我们直接将线性模型的decision_function
方法的输出(产生连续得分或概率)作为inverse_transform
方法的输入,避免在解码之前将得分或概率舍入为二元标签的需求。
from sklearn.preprocessing import LabelBinarizer
labels = ['cat', 'dog', 'bird', 'dog']
lb = LabelBinarizer()
binary_labels = lb.fit_transform(labels)
print(binary_labels,'@{binary_labels}')
#随机构造二进制形式的m个样本标签
m=6
v=np.random.randint(0,2,size=(m,3))
print(v,'@{v}')
label_str1 = lb.inverse_transform(binary_labels)
label_str2=lb.inverse_transform(v)
print(label_str1,'@{label_str1}')
print(label_str2,'@{label_str2}')
# 输出:array(['dog'])
[[0 1 0]
[0 0 1]
[1 0 0]
[0 0 1]] @{binary_labels}
[[0 1 0]
[1 0 1]
[0 1 0]
[1 0 0]
[0 1 0]
[1 1 1]] @{v}
['cat' 'dog' 'bird' 'dog'] @{label_str1}
['cat' 'bird' 'cat' 'bird' 'cat' 'bird'] @{label_str2}
在上述示例中,将机器学习模型输出的结果转化为了原始的标签数据,即将[0, 1, 0]转化为’dog’。