一、引言

在当今数据驱动的时代,机器学习技术广泛应用于各个领域,从金融风险预测到医疗疾病诊断,从图像识别到自然语言处理,都离不开机器学习的强大支持。而分类任务作为机器学习中的重要组成部分,旨在将数据对象划分到不同的类别中。Python 凭借其简洁的语法、丰富的库以及庞大的社区支持,成为了机器学习领域最受欢迎的编程语言之一。Scikit-learn(简称 sklearn)是 Python 中用于机器学习的重要库,它提供了简单高效的数据挖掘和数据分析工具,使得构建分类模型变得更加便捷和高效。本文将详细介绍如何使用 Scikit-learn 库在 Python 中构建分类模型,帮助初学者快速入门机器学习分类任务。

二、Scikit-learn 库概述

Scikit-learn 是一个开源的机器学习库,建立在 NumPy、SciPy 和 Matplotlib 等库之上。它提供了丰富的机器学习算法和工具,涵盖了分类、回归、聚类、降维等多种机器学习任务。Scikit-learn 的设计理念是简洁、高效和易用,其 API 设计遵循统一的规范,使得用户可以轻松地切换不同的算法进行实验和应用。

Scikit-learn 库包含了众多经典的机器学习算法,如支持向量机(SVM)、决策树、随机森林、逻辑回归、K 近邻算法等。同时,它还提供了数据预处理、模型评估、模型选择等一系列工具,能够帮助用户完成从数据准备到模型部署的整个机器学习流程。

2.1 安装 Scikit-learn

在使用 Scikit-learn 之前,需要先安装该库。如果已经安装了 Python 的包管理工具 pip,可以通过以下命令进行安装:


pip install -U scikit-learn

如果使用的是 Anaconda 环境,也可以使用 conda 命令进行安装:


conda install scikit-learn

安装完成后,可以在 Python 脚本或 Jupyter Notebook 中导入 Scikit-learn 库进行验证:


import sklearn

print(sklearn.__version__)

上述代码将输出 Scikit-learn 库的版本号,表明安装成功。

2.2 Scikit-learn 的基本结构和常用模块

Scikit-learn 库主要包含以下几个常用模块:

  1. sklearn.datasets:该模块提供了一些用于测试和学习的数据集,包括鸢尾花数据集、手写数字数据集等。用户可以方便地加载这些数据集进行模型训练和测试。
  1. sklearn.preprocessing:数据预处理模块,用于对原始数据进行清洗、转换和标准化等操作,以提高模型的性能和稳定性。例如,对数值型数据进行归一化、对类别型数据进行编码等。
  1. sklearn.model_selection:模型选择和评估模块,提供了各种用于划分数据集、交叉验证、网格搜索等功能的工具。通过这些工具,用户可以选择最优的模型参数,评估模型的泛化能力。
  1. sklearn.metrics:模型评估指标模块,包含了各种用于评估分类模型和回归模型性能的指标,如准确率、精确率、召回率、F1 值、均方误差等。
  1. sklearn.neighbors:K 近邻算法模块,实现了 K 近邻分类和回归算法。
  1. sklearn.tree:决策树算法模块,提供了决策树分类和回归模型的实现。
  1. sklearn.ensemble:集成学习模块,包含了随机森林、梯度提升树等集成学习算法。
  1. sklearn.svm:支持向量机算法模块,实现了支持向量机分类和回归模型。
  1. sklearn.linear_model:线性模型模块,包含了逻辑回归、线性回归等线性模型的实现。

三、分类模型基础

在深入学习使用 Scikit-learn 构建分类模型之前,有必要先了解一些分类模型的基础知识。

3.1 分类任务的定义

分类任务是指根据输入数据的特征,将其划分到预先定义好的不同类别中的任务。输入数据通常表示为一个特征向量,而输出则是对应的类别标签。例如,在垃圾邮件分类任务中,输入数据可以是邮件的文本内容、发件人信息、邮件主题等特征,输出则是 “垃圾邮件” 或 “正常邮件” 这两个类别标签之一。

3.2 常见的分类算法

  1. K 近邻算法(K-Nearest Neighbors,KNN):KNN 算法是一种简单直观的分类算法。其基本思想是:对于一个待分类的数据点,找到训练数据集中与其距离最近的 K 个数据点,根据这 K 个数据点中出现次数最多的类别来确定待分类数据点的类别。KNN 算法的优点是简单易懂、易于实现,不需要进行复杂的模型训练;缺点是计算量较大,尤其是当数据集较大时,需要计算待分类数据点与所有训练数据点的距离。
  1. 决策树(Decision Tree):决策树是一种基于树结构的分类算法。它通过对特征进行递归划分,将数据集逐步划分成不同的子集,直到满足一定的停止条件。每个内部节点表示一个特征的测试,每个分支表示测试的结果,每个叶节点表示一个类别标签。决策树的优点是可解释性强,能够直观地展示分类的决策过程;缺点是容易过拟合,尤其是在数据量较小或特征较多的情况下。
  1. 随机森林(Random Forest):随机森林是一种集成学习算法,它由多个决策树组成。在构建随机森林时,通过随机采样的方式从原始数据集中抽取多个子集,然后在每个子集上独立地构建决策树。最终的分类结果通过对所有决策树的预测结果进行投票或平均得到。随机森林能够有效地降低决策树的过拟合问题,提高模型的泛化能力和稳定性。
  1. 支持向量机(Support Vector Machine,SVM):SVM 是一种基于统计学习理论的分类算法。它的目标是在特征空间中找到一个最优的超平面,将不同类别的数据点尽可能地分开。对于线性可分的数据,SVM 可以直接找到最优超平面;对于线性不可分的数据,SVM 可以通过核函数将数据映射到高维空间,使得数据在高维空间中变得线性可分。SVM 的优点是在小样本数据集上表现出色,能够处理高维数据;缺点是计算复杂度较高,对大规模数据集的训练效率较低。
  1. 逻辑回归(Logistic Regression):逻辑回归虽然名字中包含 “回归”,但它实际上是一种分类算法。它通过构建逻辑函数,将线性回归的输出映射到 0 到 1 之间的概率值,然后根据概率值来判断数据点属于某个类别的可能性。逻辑回归模型简单、计算效率高,并且具有较好的可解释性,常用于二分类和多分类任务。

3.3 分类模型的评估指标

  1. 准确率(Accuracy):准确率是最常用的分类模型评估指标之一,它表示分类正确的样本数占总样本数的比例。计算公式为:\(Accuracy = \frac{TP + TN}{TP + TN + FP + FN}\),其中 TP(True Positive)表示真正例,即实际为正类且被正确预测为正类的样本数;TN(True Negative)表示真负例,即实际为负类且被正确预测为负类的样本数;FP(False Positive)表示假正例,即实际为负类但被错误预测为正类的样本数;FN(False Negative)表示假负例,即实际为正类但被错误预测为负类的样本数。
  1. 精确率(Precision):精确率表示预测为正类的样本中真正为正类的比例。计算公式为:\(Precision = \frac{TP}{TP + FP}\)。精确率在一些对误判为正类后果较为严重的场景中非常重要,例如垃圾邮件过滤,如果误将正常邮件判断为垃圾邮件,会给用户带来不便。
  1. 召回率(Recall):召回率也称为灵敏度或真正例率,它表示实际为正类的样本中被正确预测为正类的比例。计算公式为:\(Recall = \frac{TP}{TP + FN}\)。召回率在一些需要尽可能找出所有正类样本的场景中很关键,例如疾病诊断,需要尽可能地检测出所有患病的病例。
  1. F1 值(F1-Score):F1 值是精确率和召回率的调和平均数,它综合考虑了精确率和召回率两个指标,能够更全面地评估模型的性能。计算公式为:\(F1 = \frac{2 \times Precision \times Recall}{Precision + Recall}\)。

四、使用 Scikit-learn 构建分类模型的步骤

使用 Scikit-learn 构建分类模型通常遵循以下几个步骤:

4.1 加载数据集

首先,需要加载用于训练和测试的数据集。Scikit-learn 提供了一些内置的数据集,可以通过sklearn.datasets模块方便地加载。例如,加载鸢尾花数据集:


from sklearn.datasets import load_iris

iris = load_iris()

X = iris.data

y = iris.target

上述代码中,load_iris()函数用于加载鸢尾花数据集,返回的iris对象包含了数据集的特征数据data和类别标签target。将特征数据赋值给X,类别标签赋值给y,以便后续使用。

除了使用内置数据集,也可以加载自己的数据集。通常,数据集可以存储为 CSV、Excel 等格式的文件。可以使用pandas库读取这些文件,并将数据转换为适合 Scikit-learn 处理的格式。例如,使用pandas读取 CSV 文件:


import pandas as pd

data = pd.read_csv('your_data.csv')

X = data.drop('target_column', axis=1)

y = data['target_column']

上述代码中,read_csv()函数用于读取 CSV 文件,然后通过drop()方法将目标列从特征数据中分离出来,分别赋值给X和y。

4.2 数据预处理

原始数据往往存在各种问题,如缺失值、异常值、数据格式不一致等,需要进行预处理操作,以提高模型的性能。常见的数据预处理操作包括:

  1. 数据清洗:处理缺失值和异常值。对于缺失值,可以采用删除含有缺失值的样本、使用均值、中位数或众数填充等方法;对于异常值,可以通过统计分析或可视化方法识别并处理。

from sklearn.impute import SimpleImputer

imputer = SimpleImputer(strategy='mean')

X = imputer.fit_transform(X)

上述代码使用SimpleImputer类,采用均值填充的策略对特征数据X中的缺失值进行处理。

2. 特征标准化:将特征数据缩放到相同的尺度,常用的方法有归一化和标准化。归一化是将数据映射到 [0, 1] 或 [-1, 1] 区间内,标准化是将数据转换为均值为 0,标准差为 1 的正态分布。


from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()

X = scaler.fit_transform(X)

上述代码使用StandardScaler类对特征数据X进行标准化处理。

3. 特征编码:对于类别型特征,需要将其转换为数值型数据。常用的编码方法有标签编码和独热编码。


from sklearn.preprocessing import LabelEncoder

label_encoder = LabelEncoder()

y = label_encoder.fit_transform(y)

上述代码使用LabelEncoder类对类别标签y进行标签编码。

4.3 划分数据集

为了评估模型的性能,需要将数据集划分为训练集和测试集。通常,将大部分数据用于训练模型,小部分数据用于测试模型。可以使用sklearn.model_selection模块中的train_test_split函数进行划分:


from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

上述代码将数据集按照 8:2 的比例划分为训练集和测试集,test_size=0.2表示测试集占总数据集的 20%,random_state=42用于设置随机种子,确保每次划分的结果一致。

4.4 选择和训练分类模型

根据具体的分类任务和数据特点,选择合适的分类算法,并使用训练集数据对模型进行训练。以 K 近邻算法为例:


from sklearn.neighbors import KNeighborsClassifier

knn = KNeighborsClassifier(n_neighbors=3)

knn.fit(X_train, y_train)

上述代码创建了一个 K 近邻分类器对象knn,设置n_neighbors=3表示选择距离待分类数据点最近的 3 个邻居,然后使用训练集数据X_train和y_train对模型进行训练。

同样地,也可以选择其他分类算法进行训练,如决策树:


from sklearn.tree import DecisionTreeClassifier

dt = DecisionTreeClassifier()

dt.fit(X_train, y_train)

随机森林:


from sklearn.ensemble import RandomForestClassifier

rf = RandomForestClassifier()

rf.fit(X_train, y_train)

支持向量机:


from sklearn.svm import SVC

svm = SVC()

svm.fit(X_train, y_train)

逻辑回归:


from sklearn.linear_model import LogisticRegression

lr = LogisticRegression()

lr.fit(X_train, y_train)

4.5 模型评估

使用测试集数据对训练好的模型进行评估,计算模型的各项评估指标,如准确率、精确率、召回率和 F1 值等。以 K 近邻模型为例:


from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score

y_pred = knn.predict(X_test)

accuracy = accuracy_score(y_test, y_pred)

precision = precision_score(y_test, y_pred, average='macro')

recall = recall_score(y_test, y_pred, average='macro')

f1 = f1_score(y_test, y_pred, average='macro')

print("Accuracy:", accuracy)

print("Precision:", precision)

print("Recall:", recall)

print("F1 Score:", f1)

上述代码中,knn.predict(X_test)用于使用训练好的 K 近邻模型对测试集数据X_test进行预测,得到预测结果y_pred。然后使用accuracy_score、precision_score、recall_score和f1_score函数分别计算准确率、精确率、召回率和 F1 值,并打印输出。

4.6 模型调优

如果模型的性能不理想,可以通过调整模型的参数来优化模型。常用的模型调优方法有网格搜索和随机搜索。以网格搜索为例,使用sklearn.model_selection模块中的GridSearchCV类对 K 近邻模型的参数进行调优:


from sklearn.model_selection import GridSearchCV

param_grid = {'n_neighbors': [1, 3, 5, 7, 9]}

grid_search = GridSearchCV(KNeighborsClassifier(), param_grid, cv=5)

grid_search.fit(X_train, y_train)

best_knn = grid_search.best_estimator_

上述代码中,param_grid定义了要搜索的参数范围,这里是对 K 近邻算法的n_neighbors参数进行搜索。GridSearchCV类用于执行网格搜索,cv=5表示进行 5 折交叉验证。通过grid_search.fit(X_train, y_train)对模型进行训练和参数搜索,grid_search.best_estimator_返回最优参数下的模型对象best_knn。

五、实例演示:鸢尾花数据集分类

下面通过一个完整的实例,使用鸢尾花数据集演示如何使用 Scikit-learn 构建分类模型。

5.1 加载和查看数据集


from sklearn.datasets import load_iris

iris = load_iris()

X = iris.data

y = iris.target

print("Features:", iris.feature_names)

print("Target Names:", iris.target_names)

print("Data Shape:", X.shape)

print("Target Shape:", y.shape)

上述代码加载鸢尾花数据集,并打印出数据集的特征名称、类别标签名称、特征数据形状和类别标签形状。

5.2 数据预处理


from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()

X = scaler.fit_transform(X)

对特征数据进行标准化处理。

5.3 划分数据集


from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

将数据集划分为训练集和测试集,测试集占比 20%。

5.4 选择和训练分类模型(以随机森林为例)


from sklearn.ensemble import RandomForestClassifier

rf = RandomForestClassifier()

rf.fit(X_train, y_train)

创建并训练随机森林分类模型。

5.5 模型评估


from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score

y_pred = rf.predict(X_test)

accuracy = accuracy_score(y_test, y_pred)

precision = precision_score(y_test, y_pred, average='macro')

recall = recall_score(y_test, y_pred, average='macro')

f1 = f1_score(y_test, y_pred, average='macro')

print("Accuracy:", accuracy)

print("Precision:", precision)

print("Recall:", recall)

print("F1 Score:", f1)

运行上述代码,可得到随机森林模型在鸢尾花数据集测试集上的评估结果。例如,可能输出类似 “Accuracy: 0.9666666666666667” 等具体数值,这表明模型在测试集上有较高的分类准确率,其他指标也反映了模型在精确率、召回率和 F1 值方面的表现。

六、多类别分类场景下的深入分析

在鸢尾花数据集这类多类别分类场景中,除了使用上述的宏观平均(average='macro')方式计算精确率、召回率和 F1 值外,还有微观平均(average='micro')和加权平均(average='weighted')等计算方式 。微观平均是先计算每个样本的各项指标,再进行平均,它对每个样本的贡献同等对待;加权平均则考虑了每个类别的样本数量,对样本数量多的类别赋予更高的权重。


from sklearn.metrics import precision_score, recall_score, f1_score

precision_micro = precision_score(y_test, y_pred, average='micro')

recall_micro = recall_score(y_test, y_pred, average='micro')

f1_micro = f1_score(y_test, y_pred, average='micro')

precision_weighted = precision_score(y_test, y_pred, average='weighted')

recall_weighted = recall_score(y_test, y_pred, average='weighted')

f1_weighted = f1_score(y_test, y_pred, average='weighted')

print("Precision (micro):", precision_micro)

print("Recall (micro):", recall_micro)

print("F1 Score (micro):", f1_micro)

print("Precision (weighted):", precision_weighted)

print("Recall (weighted):", recall_weighted)

print("F1 Score (weighted):", f1_weighted)

通过不同平均方式的计算,可以更全面地了解模型在多类别分类任务中的性能表现。在实际应用中,需要根据具体场景和数据特点选择合适的评估方式。

七、不同分类模型在鸢尾花数据集上的效果对比

为了更直观地感受不同分类模型的性能差异,我们将 K 近邻、决策树、支持向量机和逻辑回归模型也应用到鸢尾花数据集上,并对比它们的评估指标。


# K近邻模型

from sklearn.neighbors import KNeighborsClassifier

knn = KNeighborsClassifier(n_neighbors=3)

knn.fit(X_train, y_train)

y_pred_knn = knn.predict(X_test)

accuracy_knn = accuracy_score(y_test, y_pred_knn)

precision_knn = precision_score(y_test, y_pred_knn, average='macro')

recall_knn = recall_score(y_test, y_pred_knn, average='macro')

f1_knn = f1_score(y_test, y_pred_knn, average='macro')

# 决策树模型

from sklearn.tree import DecisionTreeClassifier

dt = DecisionTreeClassifier()

dt.fit(X_train, y_train)

y_pred_dt = dt.predict(X_test)

accuracy_dt = accuracy_score(y_test, y_pred_dt)

precision_dt = precision_score(y_test, y_pred_dt, average='macro')

recall_dt = recall_score(y_test, y_pred_dt, average='macro')

f1_dt = f1_score(y_test, y_pred_dt, average='macro')

# 支持向量机模型

from sklearn.svm import SVC

svm = SVC()

svm.fit(X_train, y_train)

y_pred_svm = svm.predict(X_test)

accuracy_svm = accuracy_score(y_test, y_pred_svm)

precision_svm = precision_score(y_test, y_pred_svm, average='macro')

recall_svm = recall_score(y_test, y_pred_svm, average='macro')

f1_svm = f1_score(y_test, y_pred_svm, average='macro')

# 逻辑回归模型

from sklearn.linear_model import LogisticRegression

lr = LogisticRegression()

lr.fit(X_train, y_train)

y_pred_lr = lr.predict(X_test)

accuracy_lr = accuracy_score(y_test, y_pred_lr)

precision_lr = precision_score(y_test, y_pred_lr, average='macro')

recall_lr = recall_score(y_test, y_pred_lr, average='macro')

f1_lr = f1_score(y_test, y_pred_lr, average='macro')

print("K近邻模型 - Accuracy:", accuracy_knn)

print("K近邻模型 - Precision:", precision_knn)

print("K近邻模型 - Recall:", recall_knn)

print("K近邻模型 - F1 Score:", f1_knn)

print("决策树模型 - Accuracy:", accuracy_dt)

print("决策树模型 - Precision:", precision_dt)

print("决策树模型 - Recall:", recall_dt)

print("决策树模型 - F1 Score:", f1_dt)

print("支持向量机模型 - Accuracy:", accuracy_svm)

print("支持向量机模型 - Precision:", precision_svm)

print("支持向量机模型 - Recall:", recall_svm)

print("支持向量机模型 - F1 Score:", f1_svm)

print("逻辑回归模型 - Accuracy:", accuracy_lr)

print("逻辑回归模型 - Precision:", precision_lr)

print("逻辑回归模型 - Recall:", recall_lr)

print("逻辑回归模型 - F1 Score:", f1_lr)

运行上述代码后,会输出各个模型在鸢尾花数据集上的评估指标。通过对比可以发现,不同模型在相同数据集上的表现各有优劣,随机森林模型可能在准确率等指标上表现出色,但在其他场景下,其他模型也许会更具优势。这也进一步说明,在实际的机器学习分类任务中,需要根据数据特点和任务需求,综合评估并选择合适的模型。

八、实际应用拓展

在实际项目中,数据的复杂性和多样性远高于鸢尾花数据集。例如在电商领域的商品分类,数据可能包含商品名称、描述、价格、销量、用户评价等多种类型的特征;在图像分类中,需要处理图像像素数据等。除了使用上述基础的分类模型,还可以尝试集成学习中的 Stacking 等方法,将多个不同模型进行组合,进一步提升模型的性能。此外,结合深度学习模型与 Scikit-learn 进行数据预处理和模型评估,也是当下热门的研究和应用方向。

同时,在模型部署阶段,还需要考虑模型的性能优化、服务化接口的搭建等问题。例如,可以使用 Flask 或 Django 等 Web 框架将训练好的分类模型封装成 API,方便其他系统进行调用,实现机器学习模型在实际业务中的价值。

Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐