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

一、引言
在当今数据驱动的时代,机器学习技术广泛应用于各个领域,从金融风险预测到医疗疾病诊断,从图像识别到自然语言处理,都离不开机器学习的强大支持。而分类任务作为机器学习中的重要组成部分,旨在将数据对象划分到不同的类别中。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 库主要包含以下几个常用模块:
- sklearn.datasets:该模块提供了一些用于测试和学习的数据集,包括鸢尾花数据集、手写数字数据集等。用户可以方便地加载这些数据集进行模型训练和测试。
- sklearn.preprocessing:数据预处理模块,用于对原始数据进行清洗、转换和标准化等操作,以提高模型的性能和稳定性。例如,对数值型数据进行归一化、对类别型数据进行编码等。
- sklearn.model_selection:模型选择和评估模块,提供了各种用于划分数据集、交叉验证、网格搜索等功能的工具。通过这些工具,用户可以选择最优的模型参数,评估模型的泛化能力。
- sklearn.metrics:模型评估指标模块,包含了各种用于评估分类模型和回归模型性能的指标,如准确率、精确率、召回率、F1 值、均方误差等。
- sklearn.neighbors:K 近邻算法模块,实现了 K 近邻分类和回归算法。
- sklearn.tree:决策树算法模块,提供了决策树分类和回归模型的实现。
- sklearn.ensemble:集成学习模块,包含了随机森林、梯度提升树等集成学习算法。
- sklearn.svm:支持向量机算法模块,实现了支持向量机分类和回归模型。
- sklearn.linear_model:线性模型模块,包含了逻辑回归、线性回归等线性模型的实现。
三、分类模型基础
在深入学习使用 Scikit-learn 构建分类模型之前,有必要先了解一些分类模型的基础知识。
3.1 分类任务的定义
分类任务是指根据输入数据的特征,将其划分到预先定义好的不同类别中的任务。输入数据通常表示为一个特征向量,而输出则是对应的类别标签。例如,在垃圾邮件分类任务中,输入数据可以是邮件的文本内容、发件人信息、邮件主题等特征,输出则是 “垃圾邮件” 或 “正常邮件” 这两个类别标签之一。
3.2 常见的分类算法
- K 近邻算法(K-Nearest Neighbors,KNN):KNN 算法是一种简单直观的分类算法。其基本思想是:对于一个待分类的数据点,找到训练数据集中与其距离最近的 K 个数据点,根据这 K 个数据点中出现次数最多的类别来确定待分类数据点的类别。KNN 算法的优点是简单易懂、易于实现,不需要进行复杂的模型训练;缺点是计算量较大,尤其是当数据集较大时,需要计算待分类数据点与所有训练数据点的距离。
- 决策树(Decision Tree):决策树是一种基于树结构的分类算法。它通过对特征进行递归划分,将数据集逐步划分成不同的子集,直到满足一定的停止条件。每个内部节点表示一个特征的测试,每个分支表示测试的结果,每个叶节点表示一个类别标签。决策树的优点是可解释性强,能够直观地展示分类的决策过程;缺点是容易过拟合,尤其是在数据量较小或特征较多的情况下。
- 随机森林(Random Forest):随机森林是一种集成学习算法,它由多个决策树组成。在构建随机森林时,通过随机采样的方式从原始数据集中抽取多个子集,然后在每个子集上独立地构建决策树。最终的分类结果通过对所有决策树的预测结果进行投票或平均得到。随机森林能够有效地降低决策树的过拟合问题,提高模型的泛化能力和稳定性。
- 支持向量机(Support Vector Machine,SVM):SVM 是一种基于统计学习理论的分类算法。它的目标是在特征空间中找到一个最优的超平面,将不同类别的数据点尽可能地分开。对于线性可分的数据,SVM 可以直接找到最优超平面;对于线性不可分的数据,SVM 可以通过核函数将数据映射到高维空间,使得数据在高维空间中变得线性可分。SVM 的优点是在小样本数据集上表现出色,能够处理高维数据;缺点是计算复杂度较高,对大规模数据集的训练效率较低。
- 逻辑回归(Logistic Regression):逻辑回归虽然名字中包含 “回归”,但它实际上是一种分类算法。它通过构建逻辑函数,将线性回归的输出映射到 0 到 1 之间的概率值,然后根据概率值来判断数据点属于某个类别的可能性。逻辑回归模型简单、计算效率高,并且具有较好的可解释性,常用于二分类和多分类任务。
3.3 分类模型的评估指标
- 准确率(Accuracy):准确率是最常用的分类模型评估指标之一,它表示分类正确的样本数占总样本数的比例。计算公式为:\(Accuracy = \frac{TP + TN}{TP + TN + FP + FN}\),其中 TP(True Positive)表示真正例,即实际为正类且被正确预测为正类的样本数;TN(True Negative)表示真负例,即实际为负类且被正确预测为负类的样本数;FP(False Positive)表示假正例,即实际为负类但被错误预测为正类的样本数;FN(False Negative)表示假负例,即实际为正类但被错误预测为负类的样本数。
- 精确率(Precision):精确率表示预测为正类的样本中真正为正类的比例。计算公式为:\(Precision = \frac{TP}{TP + FP}\)。精确率在一些对误判为正类后果较为严重的场景中非常重要,例如垃圾邮件过滤,如果误将正常邮件判断为垃圾邮件,会给用户带来不便。
- 召回率(Recall):召回率也称为灵敏度或真正例率,它表示实际为正类的样本中被正确预测为正类的比例。计算公式为:\(Recall = \frac{TP}{TP + FN}\)。召回率在一些需要尽可能找出所有正类样本的场景中很关键,例如疾病诊断,需要尽可能地检测出所有患病的病例。
- 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 数据预处理
原始数据往往存在各种问题,如缺失值、异常值、数据格式不一致等,需要进行预处理操作,以提高模型的性能。常见的数据预处理操作包括:
- 数据清洗:处理缺失值和异常值。对于缺失值,可以采用删除含有缺失值的样本、使用均值、中位数或众数填充等方法;对于异常值,可以通过统计分析或可视化方法识别并处理。
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,方便其他系统进行调用,实现机器学习模型在实际业务中的价值。
更多推荐



所有评论(0)