在本文中,我们将探讨机器学习领域中的三种重要分类算法:二元分类、多类分类和多标签分类。我们将看看它们各自的定义、应用、相似点和不同点。最后,我们将深入研究一些 Python 示例以获得实践经验。
分类是机器学习中用于将数据分类为类或组的监督学习技术。目标是教一个模型根据对象的特征预测对象的类别。存在三种类型的分类问题——二元、多类和多标签。
二元分类是最简单的分类形式,我们的目标是预测两个可能类别中的一个。例如,我们可能想要预测一封电子邮件是垃圾邮件还是非垃圾邮件,或者肿瘤是恶性的还是良性的。
在多类分类中,我们有两个以上的类,每个实例只属于一个类。示例包括识别手写数字 (0-9)、识别不同种类的动物或将新闻文章分类为不同类别(体育、政治等)。
多标签分类不同于其他两种类型,因为每个实例可以属于多个类。一个例子可以是音乐流派分类,其中一首歌可能属于多种流派,如流行、摇滚和电子。
现在我们对三类分类问题有了基本的了解,我们将进一步讨论它们的异同。
所有三种类型的分类都有一个共同目标,即根据特定特征预测实例的一个或多个类。
在所有这些情况下,我们可以使用逻辑回归、支持向量机、决策树和随机森林等流行算法,同时调整超参数以获得最佳结果。
准确度、精确度、召回率和 F1 分数等性能指标可用于所有三种类型的分类任务,以确定所选模型的有效性。
在二元分类中,目标变量通常是一个一维数组,其中包含0或1(或-1和1)代表两个可能的类别。
在多类分类中,目标变量仍然是一维数组,但它包含表示多个类的整数值(0 到n-1,其中n是类数)。
在多标签分类中,目标变量是一个二维数组,其中每一行都包含一个二进制向量,表示该实例的每个类是否存在。
对于二元分类,可以直接使用逻辑回归等算法,不需要做任何改动。
对于多类分类,逻辑回归等一些算法需要进行调整以处理多个类,例如,通过使用“one-vs-rest”(OVR)或“one-vs-one”(OVO)策略,或通过合并直接多类分类的交叉熵损失。
多标签分类通常需要进行调整,例如使用OneVsRestClassifier,它本质上将问题视为多个独立的二元分类任务,其中每个分类器预测特定类别的存在或不存在。
在二元分类中,我们经常使用二元交叉熵损失,它衡量单个目标类的真实概率和预测概率之间的差异。
对于多类分类,我们使用分类交叉熵损失,它衡量每个(互斥)类的真实概率和预测概率之间的差异。
多标签分类通常对每个类独立使用二元交叉熵损失(如在二元分类中),在某种意义上结合了单独二元分类任务的损失。
现在我们已经探索了相同点和不同点,让我们深入研究一些 Python 示例。
# 导入必要的库
import numpy as np
import pandas as pd
from sklearn.datasets import load_breast_cancer, load_digits
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.multiclass import OneVsRestClassifier
from sklearn.metrics import accuracy_score, classification_report
在这个例子中,我们将使用威斯康星乳腺癌数据集,这是一个二元分类问题,我们可以在其中预测肿瘤是恶性的还是良性的。
# Load the breast cancer dataset
data = load_breast_cancer()
X = data.data
y = data.target
# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Train the logistic regression model
binary_model = LogisticRegression(max_iter=1000)
binary_model.fit(X_train, y_train)
# Make predictions on the test set
y_pred = binary_model.predict(X_test)
# Calculate the accuracy and print the report
binary_accuracy = accuracy_score(y_test, y_pred)
print("Binary Classification Accuracy:", binary_accuracy)
print(classification_report(y_test, y_pred))
对于多类分类问题,我们将使用 MNIST 数字数据集,其中每个实例都是一个手写数字 (0-9)。
# 加载数字数据集
data = load_digits()
X = data.data
y = data.target
# 将数据拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size= 0.2 , random_state= 42 )
# 训练逻辑回归模型
multi_class_model = LogisticRegression(max_iter= 1000 , multi_class= "ovr" )
multi_class_model.fit(X_train, y_train)
# 对测试集进行预测
y_pred = multi_class_model.predict(X_test)
# 计算准确率并打印报告
multi_class_accuracy = accuracy_score(y_test, y_pred)
print ( "Multi-Class Classification Accuracy:" , multi_class_accuracy)
print (classification_report(y_test, y_pred))
对于此示例,让我们考虑一个具有三个标签和四个特征的假设数据集。
# 创建一个假设数据集
np.random.seed( 42 )
X = np.random.randn( 100 , 4 )
y = np.random.randint( 0 , 2 , ( 100 , 3 ))
# 将数据拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size= 0.2 , random_state= 42 )
# 使用 OneVsRestClassifier 训练逻辑回归模型
multi_label_model = OneVsRestClassifier(LogisticRegression(max_iter= 1000 ))
multi_label_model.fit(X_train, y_train)
# 对测试集进行预测
y_pred = multi_label_model.predict(X_test)
# 计算准确率并打印报告
multi_label_accuracy = accuracy_score(y_test, y_pred)
print ( "Multi-Label Classification Accuracy:" , multi_label_accuracy)
print (classification_report(y_test, y_pred))
总结一下,我们探索了三种类型的分类问题:二元分类、多类分类和多标签分类,并演示了如何使用 Scikit-Learn 库使用逻辑回归来实现每一种分类问题。我们还讨论了它们的相似点和不同点,以及对它们内部工作原理的宝贵见解。请记住,对于每个问题,您还可以尝试各种其他算法并微调模型以获得更好的性能。了解这些分类任务对于构建强大的机器学习模型至关重要。
读英文
公众号
AI日新月异,但是万丈高楼拔地起,离不开良好的基础。您是否有兴趣了解人工智能的原理和实践? 不要再观望! 我们关于 AI 原则和实践的书是任何想要深入了解 AI 世界的人的完美资源。 由该领域的领先专家撰写,这本综合指南涵盖了从机器学习的基础知识到构建智能系统的高级技术的所有内容。 无论您是初学者还是经验丰富的 AI 从业者,本书都能满足您的需求。 那为什么还要等呢?
人工智能原理与实践 全面涵盖人工智能和数据科学各个重要体系经典
北大出版社,人工智能原理与实践 人工智能和数据科学从入门到精通 详解机器学习深度学习算法原理