首页 > 编程知识 正文

python基本数据类型,python 全局变量

时间:2023-05-04 20:54:16 阅读:26109 作者:1329

由于某些原因,回归和分类问题始终引起机器学习领域的大部分关注。 多标签分类在数据科学中是一个令人头疼的问题。 本文提供了关于什么是多标签分类以及如何解决这个问题的直观说明。

1 .多标签的分类是什么?

看看下面的照片吧。

如果你听说这张图上有房子,你会怎么回答? 选项为“是”或“否”。

还是所有的东西(或标签)都和这张图有什么关系?

这些类型的问题中有一组称为多标签分类问题的目标变量。 那么这两种情况有什么区别吗? 很明显有很大的区别。 因为在第二种情况下,任何图像都可能包含不同图像的多个不同标记。

但是,在详细说明多标签之前,我想先说明它与多分类问题有什么不同。 让我们来理解这两个问题的区别。

2 .多标签vs多分类

用一个例子来理解这两者的不同。

对于每部电影,电影中央委员会都会根据电影内容颁发证书。 例如,看上面的照片,这部电影被选为“UA”。 意思是“12岁以下的孩子需要父母陪着看”。 虽然也有其他类型的证书类,例如“a”(仅限成人)和“u”),但可以肯定的是,每部电影只能在这三种类型的证书中进行分类。 简而言之,这些问题被称为多类分类问题,因为有多个类别,但每个实例只分配一个。

同时,请回顾一下这张照片。 这部电影分为喜剧和浪漫类型。 但是这次,每部电影都可能被分为一个或多个不同的类别。

因此,可以使用多个类别为每个实例进行分配。 因此,这些类型的问题被称为多标签分类问题。

现在你应该能区分多标签和多分类问题了。 现在,让我们开始解决多标签这一类型的问题吧。

3 .加载和生成多标签数据集

Scikit-learn提供了独立的库scikit-multilearn,可用于各种标签分类。 为了更好地理解,让我们开始在多标签数据集上练习吧。 sci kit -多learn库地址: http://sci kit.ml/API/datasets.html

可以从MULAN package提供的存储库中找到实际的数据集。 这些数据集以ARFF格式显示。 存储库地址: http://Mulan.source forge.net/datasets-MLC.html

因此,要开始使用这些数据集,请检查以下Python代码并将其加载到计算机上: 在这里,我已经从存储库中下载了酵母(yeast )数据集。

导入脚本

from scipy.io import arff

data,meta=scipy.io.ARFF.load ARFF (/users/shubhamjain/documents/yeast/yeast-train.ARFF ' )。

df=PD.data帧(data )

这就是数据集的样子。

其中Att表示属性或独立变量,class表示目标变量。

为了实践目的,还有其他选项可以生成人工多标记数据集。

froms klearn.datasetsimportmake _ multilabel _ class ification

# thiswillgeneratearandommulti -标签数据集

x,y=make _ multilabel _ class ification (sparse=true,n_labels=20,

return_indicator='sparse ',allow_unlabeled=False )

看看上面使用的参数。

如果为True,则sparse (稀疏) :返回表示包含大量零元素的矩阵的稀疏矩阵。

n_labels:每个实例的标签平均数。

return_indicator:“sparse”以稀疏二进制指示符格式返回y。

如果为allow_unlabeled:true,则某些实例可能不属于任何类。

虽然我们到处使用稀疏矩阵,但scikit-multilearn也建议使用稀疏格式的数据。 因为在实际的数据集中非常少见。 通常,分配给每个实例的标签数量相当少。

好了,现在准备了数据集。 让我们快速学习解决多标签问题的技术吧。

4 .解决多标签分类问题的技术

基本上,用三种方法解决多标签的分类问题。 是:

转换问题

改编算法

整合方法

4.1问题的转变

该方法尝试将多标签问题转换为单标签问题。 该方法可以用三种不同的方法进行:

二元关系(二元关系) )。

分类器链(Classifier )

Chains)

标签Powerset(Label Powerset)

4.4.1二元关联(Binary Relevance)

这是最简单的技术,它基本上把每个标签当作单独的一个类分类问题。例如,让我们考虑如下所示的一个案例。我们有这样的数据集,X是独立的特征,Y是目标变量。

在二元关联中,这个问题被分解成4个不同的类分类问题,如下图所示。

我们不需要手动操作,multi-learn库在python中提供了它的实现。那么,让我们看看它在随机生成的数据上的实现。

# using binary relevance

from skmultilearn.problem_transform import BinaryRelevance

from sklearn.naive_bayes import GaussianNB

# initialize binary relevance multi-label classifier

# with a gaussian naive bayes base classifier

classifier = BinaryRelevance(GaussianNB())

# train

classifier.fit(X_train, y_train)

# predict

predictions = classifier.predict(X_test)

注意:在这里,我们使用了Naive Bayes的算法,你也可以使用任何其他的分类算法。

现在,在一个多标签分类问题中,我们不能简单地用我们的标准来计算我们的预测的准确性。所以,我们将使用accuracy score。这个函数计算子集的精度,这意味着预测的标签集应该与真正的标签集完全匹配。

那么,让我们计算一下预测的准确性。

from sklearn.metrics import accuracy_score

accuracy_score(y_test,predictions)

0.45454545454545453

我们的准确率达到了45%,还不算太糟。它是最简单和有效的方法,但是这种方法的惟一缺点是它不考虑标签的相关性,因为它单独处理每个目标变量。

4.1.2分类器链(Classifier Chains)

在这种情况下,第一个分类器只在输入数据上进行训练,然后每个分类器都在输入空间和链上的所有之前的分类器上进行训练。

让我们试着通过一个例子来理解这个问题。在下面给出的数据集里,我们将X作为输入空间,而Y作为标签。

在分类器链中,这个问题将被转换成4个不同的标签问题,就像下面所示。黄色部分是输入空间,白色部分代表目标变量。

这与二元关联非常相似,唯一的区别在于它是为了保持标签相关性而形成的。那么,让我们尝试使用multi-learn库来实现它。

# using classifier chains

from skmultilearn.problem_transform import ClassifierChain

from sklearn.naive_bayes import GaussianNB

# initialize classifier chains multi-label classifier

# with a gaussian naive bayes base classifier

classifier = ClassifierChain(GaussianNB())

# train

classifier.fit(X_train, y_train)

# predict

predictions = classifier.predict(X_test)

accuracy_score(y_test,predictions)

0.21212121212121213

我们可以看到,使用这个我们得到了21%的准确率,这比二元关联要低得多。可能是因为没有标签相关性,因为我们已经随机生成了数据。

4.1.3标签Powerset(Label Powerset)

在这方面,我们将问题转化为一个多类问题,一个多类分类器在训练数据中发现的所有唯一的标签组合上被训练。让我们通过一个例子来理解它。

在这一点上,我们发现x1和x4有相同的标签。同样的,x3和x6有相同的标签。因此,标签powerset将这个问题转换为一个单一的多类问题,如下所示。

因此,标签powerset给训练集中的每一个可能的标签组合提供了一个独特的类。让我们看看它在Python中的实现。

# using Label Powerset

from skmultilearn.problem_transform import LabelPowerset

from sklearn.naive_bayes import GaussianNB

# initialize Label Powerset multi-label classifier

# with a gaussian naive bayes base classifier

classifier = LabelPowerset(GaussianNB())

# train

classifier.fit(X_train, y_train)

# predict

predictions = classifier.predict(X_test)

accuracy_score(y_test,predictions)

0.5757575757575758

这使我们在之前讨论过的三个问题中得到了最高的准确性,57%。唯一的缺点是随着训练数据的增加,类的数量也会增加。因此,增加了模型的复杂性,并降低了精确度。

现在,让我们看一下解决多标签分类问题的第二种方法。

4.2改编算法

改编算法来直接执行多标签分类,而不是将问题转化为不同的问题子集。例如,kNN的多标签版本是由MLkNN表示的。那么,让我们快速地在我们的随机生成的数据集上实现这个。

from skmultilearn.adapt import MLkNN

classifier = MLkNN(k=20)

# train

classifier.fit(X_train, y_train)

# predict

predictions = classifier.predict(X_test)

accuracy_score(y_test,predictions)

0.69

很好,你的测试数据已经达到了69%的准确率。

在一些算法中,例如随机森林(Random Forest)和岭回归(Ridge regression),Sci-kit learn提供了多标签分类的内置支持。因此,你可以直接调用它们并预测输出。

4.3集成方法

集成总是能产生更好的效果。Scikit-Multilearn库提供不同的组合分类功能,你可以使用它来获得更好的结果。

5.案例研究

在现实世界中,多标签分类问题非常普遍。所以,来看看我们能在哪些领域找到它们。

5.1音频分类

我们知道歌曲会被分类为不同的流派。他们也被分类为,如“放松的平静”,或“悲伤的孤独”等等情感或情绪的基础。

5.2图像分类

使用图像的多标签分类也有广泛的应用。图像可以被标记为不同的对象、人或概念。

5.3生物信息学

多标签分类在生物信息学领域有很多用途,例如,在酵母数据集中的基因分类。它还被用来使用几个未标记的蛋白质来预测蛋白质的多重功能。

5.4文本分类

谷歌新闻所做的是,将每条新闻都标记为一个或多个类别,这样它就会显示在不同的类别之下。

例如,看看下面的图片。

同样的新闻出现在“Technology”,“Latest” 等类别中,因为它已经被分类为不同的标签。从而使其成为一个多标签分类问题。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。