用5个步骤开始使用Scikit-learn

使用Scikit-learn的5个步骤

介绍Scikit-learn

 

在学习如何使用Scikit-learn时,我们必须明确了解机器学习的基本概念,因为Scikit-learn只是一个实现机器学习原理和相关任务的实用工具。机器学习是人工智能的一个子集,它使计算机能够在没有明确编程的情况下从经验中学习和改进。这些算法使用训练数据通过发现模式和见解来进行预测或决策。机器学习主要有三种类型:

  • 监督学习 – 模型通过对标记数据进行训练,学习将输入映射到输出
  • 无监督学习 – 模型通过发现未标记数据中的隐藏模式和分组进行工作
  • 强化学习 – 模型通过与环境交互,接收奖励和惩罚以促进最优行为的学习

正如您无疑所知,机器学习驱动着现代社会的许多方面,生成了大量的数据。随着数据的可用性不断增长,机器学习的重要性也越来越大。

Scikit-learn是一个流行的开源Python机器学习库。它被广泛使用的一些关键原因包括:

  • 简单高效的数据分析和建模工具
  • 对Python程序员友好,注重清晰性
  • 基于NumPy、SciPy和matplotlib,更容易集成
  • 提供广泛的算法,用于分类、回归、聚类、降维等任务

本教程旨在逐步介绍如何使用Scikit-learn(主要针对常见的监督学习任务),重点是通过大量实例进行实践。

 

第一步:开始使用Scikit-learn

 

安装和设置

 

要安装和使用Scikit-learn,您的系统必须具有可用的Python安装。我们将不在此处介绍具体步骤,但将假设您在此时已经具备了可用的安装。

可以使用pip,Python的软件包管理器,来安装Scikit-learn:

pip install scikit-learn

 

这将同时安装NumPy和SciPy等所需的依赖项。安装完成后,可以在Python脚本中导入Scikit-learn,如下所示:

import sklearn

 

测试安装

 

安装完成后,您可以启动Python解释器并运行上述导入命令。

Python 3.10.11 (main, May 2 2023, 00:28:57) [GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sklearn

 

只要您没有看到任何错误消息,您现在就可以开始使用Scikit-learn了!

 

加载示例数据集

 

Scikit-learn提供了各种示例数据集,我们可以用于测试和实验:

from sklearn import datasets

iris = datasets.load_iris()
digits = datasets.load_digits()

 

digits数据集包含手写数字的图像及其标签。我们可以使用这些示例数据集来熟悉Scikit-learn,然后再转向真实世界的数据。

 

第二步:数据预处理

 

数据预处理的重要性

 

真实世界的数据通常是不完整、不一致且包含错误的。数据预处理将原始数据转换为机器学习可用的格式,是一个对下游模型性能有重要影响的必要步骤。

许多初学者常常忽视正确的数据预处理,直接跳入模型训练。然而,低质量的数据输入将导致低质量的模型输出,无论所使用的算法的复杂性如何。适当处理缺失数据、检测和删除异常值、特征编码和特征缩放等步骤有助于提高模型准确性。

数据预处理占据了机器学习项目中大部分的时间和精力。计算机科学中的老话”垃圾进,垃圾出”在这里非常适用。高质量的数据输入是高性能机器学习的先决条件。数据预处理步骤将原始数据转化为经过优化的训练集,使机器学习算法能够有效地发现预测模式和洞见。

因此,总结起来,正确地预处理数据是任何机器学习工作流中不可或缺的一步,应该得到重视和努力。

 

加载和理解数据

 

让我们使用Scikit-learn加载一个示例数据集进行演示:

from sklearn.datasets import load_iris
iris_data = load_iris()

 

我们可以探索特征和目标值:

print(iris_data.data[0]) # 第一个样本的特征值
print(iris_data.target[0]) # 第一个样本的目标值

 

在继续之前,我们应该理解特征和目标的含义。

 

数据清洗

 

真实数据通常包含缺失、损坏或异常值。Scikit-learn提供了处理这些问题的工具:

from sklearn.impute import SimpleImputer

imputer = SimpleImputer(strategy='mean')  
imputed_data = imputer.fit_transform(iris_data.data)

 

填充器用均值替换缺失值,这是一种常见但不是唯一的策略。这只是数据清洗的一种方法。

 

特征缩放

 

像支持向量机(SVM)和神经网络这样的算法对输入特征的尺度敏感。不一致的特征尺度可能导致这些算法对具有较大尺度的特征给予过度重视,从而影响模型的性能。因此,在训练这些算法之前,将特征归一化或标准化到相似的尺度上是至关重要的。

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
scaled_data = scaler.fit_transform(iris_data.data)

 

StandardScaler使特征的均值为0,方差为1。还有其他的缩放器可用。

 

可视化数据

 

我们还可以使用matplotlib对数据进行可视化以获取更多的洞见:

import matplotlib.pyplot as plt
plt.scatter(iris_data.data[:, 0], iris_data.data[:, 1], c=iris_data.target)
plt.xlabel('花萼长度')
plt.ylabel('花萼宽度')
plt.show()

 

数据可视化在机器学习工作流中具有多个关键功能。它使您能够发现数据中的潜在模式和趋势,识别可能影响模型性能的异常值,并深入了解变量之间的关系。通过事先可视化数据,您可以在特征选择和模型训练阶段做出更加明智的决策。

 

第三步:模型选择和训练

 

Scikit-learn算法概述

 

Scikit-learn提供了各种监督和无监督的算法:

  • 分类:逻辑回归、支持向量机、朴素贝叶斯、决策树、随机森林
  • 回归:线性回归、支持向量回归、决策树、随机森林
  • 聚类:k均值、DBSCAN、层次聚类

还有其他很多。

 

选择算法

 

选择最合适的机器学习算法对于构建高质量的模型至关重要。最佳算法取决于一些关键因素:

  • 用于训练的数据的大小和类型。它是一个小数据集还是大数据集?它包含什么样的特征 – 图像、文本、数值?
  • 可用的计算资源。算法在计算复杂性上有所不同。简单的线性模型比深度神经网络训练速度更快。
  • 我们想要解决的具体问题。我们是在做分类、回归、聚类还是更复杂的任务?
  • 任何特殊要求,比如解释性的需求。线性模型比黑盒方法更易解释。
  • 期望的准确性/性能。某些算法在特定任务上的表现比其他算法更好。

对于我们特定的鸢尾花分类问题,逻辑回归或支持向量机等分类算法最合适。这些算法可以根据提供的特征测量有效地对花进行分类。其他简单的算法可能无法提供足够的准确性。同时,对于这个相对简单的数据集来说,深度神经网络等非常复杂的方法则过于复杂。

随着我们继续训练模型,根据上述考虑因素,始终选择最合适的算法非常重要。可靠地选择适合的算法将确保我们开发出高质量的机器学习系统。

 

训练一个简单模型

 

让我们训练一个逻辑回归模型:

from sklearn.linear_model import LogisticRegression

model = LogisticRegression()
model.fit(scaled_data, iris_data.target)

 

就是这样!模型已经训练好了,可以进行评估和使用。

 

训练一个更复杂的模型

 

虽然简单的线性模型如逻辑回归通常可以提供不错的性能,但对于更复杂的数据集,我们可能需要利用更复杂的算法。例如,集成方法将多个模型组合在一起,使用装袋和提升等技术来提高整体预测准确性。作为示例,我们可以训练一个随机森林分类器,它聚合了许多决策树:

from sklearn.ensemble import RandomForestClassifier

rf_model = RandomForestClassifier(n_estimators=100) 
rf_model.fit(scaled_data, iris_data.target)

 

随机森林可以捕捉特征之间的非线性关系和复杂交互,使其能够产生比单个决策树更准确的预测。我们还可以在具有挑战性的数据集上使用支持向量机、梯度提升树和神经网络等算法进一步提高性能。关键是尝试不同的算法,超越简单的线性模型,利用它们的优势。

然而,无论是使用简单还是更复杂的算法进行模型训练,Scikit-learn的语法都允许采用相同的方法,大大降低了学习曲线。实际上,几乎可以用fit/transform/predict范式来表达库中的每个任务。

 

第四步:模型评估

 

评估的重要性

 

在最终部署到生产环境之前,评估机器学习模型的性能是一个绝对关键的步骤。全面评估模型建立了对系统在部署后可靠运行的必要信任。它还确定了需要改进以提高模型预测准确性和泛化能力的潜在领域。一个模型在其拟合的训练数据上可能看起来非常准确,但在现实世界的数据上可能表现糟糕。这强调了在保留的测试集和新数据上测试模型的重要性,而不仅仅是训练数据。

我们必须模拟模型在部署后的性能。严格评估模型还可以提供关于可能的过拟合的见解,过拟合指的是模型记住训练数据中的模式,但无法学习适用于样本外预测的可泛化关系。检测到过拟合后,可以采取适当的措施,如正则化和交叉验证。评估还允许比较多个候选模型,选择性能最好的选项。对于没有提供足够提升的简单基准模型的模型,可能需要重新设计或完全替换。

总之,全面评估机器学习模型对于确保它们的可靠性和增加价值是不可或缺的。它不仅仅是一种可选的分析练习,而是模型开发工作流程的一部分,使我们能够部署真正有效的系统。因此,机器学习从业者在考虑部署之前应该在代表性测试集上,通过相关性能指标,充分努力地评估他们的模型。

 

训练/测试分割

 

我们将数据分割为训练集和测试集,以评估模型在新数据上的性能:

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(scaled_data, iris_data.target)

 

按照惯例,X表示特征,y表示目标变量。请注意,y_test和iris_data.target是引用同一数据的不同方式。

 

评估指标

 

对于分类问题,关键指标包括:

  • 准确率:正确预测的比例
  • 精确率:实际为正例的预测中正确预测的比例
  • 召回率:实际为正例的样本中被正确预测为正例的比例

这些指标可以通过Scikit-learn的分类报告来计算:

from sklearn.metrics import classification_report

print(classification_report(y_test, model.predict(X_test)))

 

这将为我们提供模型性能的见解。

 

步骤 5:提高性能

 

超参数调优

 

超参数是模型的配置设置。调优可以提高性能:

from sklearn.model_selection import GridSearchCV

params = {'C': [0.1, 1, 10]}
grid_search = GridSearchCV(model, params, cv=5)
grid_search.fit(scaled_data, iris_data.target)

 

这将对不同的正则化强度进行网格搜索,以优化模型的准确率。

 

交叉验证

 

交叉验证可以提供对超参数更可靠的评估:

from sklearn.model_selection import cross_val_score

cross_val_scores = cross_val_score(model, scaled_data, iris_data.target, cv=5)

 

它将数据分成5个折叠,并在每个折叠上评估性能。

 

集成方法

 

组合多个模型可以提高性能。为了演示这一点,让我们首先训练一个随机森林模型:

from sklearn.ensemble import RandomForestClassifier

random_forest = RandomForestClassifier(n_estimators=100)
random_forest.fit(scaled_data, iris_data.target)

 

现在我们可以使用逻辑回归模型和随机森林模型来创建一个集成模型:

from sklearn.ensemble import VotingClassifier

voting_clf = VotingClassifier(estimators=[('lr', model), ('rf', random_forest)])
voting_clf.fit(scaled_data, iris_data.target)

 

这个集成模型将我们之前训练的逻辑回归模型(以lr表示)与新定义的随机森林模型(以rf表示)相结合。

 

模型堆叠和混合

 

更高级的集成技术如堆叠和混合可以构建一个元模型来组合多个基础模型。在单独训练基础模型之后,元模型学习如何最佳地组合它们以获得最佳性能。这比简单的平均或投票集成更灵活。元学习器可以学习哪些模型在不同的数据段上效果最好。具有多样的基础模型的堆叠和混合集成通常在许多机器学习任务上取得最先进的结果。

# 训练基础模型
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC

rf = RandomForestClassifier()
svc = SVC()

rf.fit(X_train, y_train)
svc.fit(X_train, y_train)

# 用基础模型进行预测来训练元模型
rf_predictions = rf.predict(X_test)
svc_predictions = svc.predict(X_test)

# 为元模型创建数据集
blender = np.vstack((rf_predictions, svc_predictions)).T
blender_target = y_test

# 在预测结果上训练元模型
from sklearn.ensemble import GradientBoostingClassifier

gb = GradientBoostingClassifier()
gb.fit(blender, blender_target)

# 进行最终预测
final_predictions = gb.predict(blender)

 

这个示例分别训练了一个随机森林模型和一个支持向量机模型,然后在它们的预测结果上训练了一个梯度提升树模型来生成最终输出。关键步骤是生成基础模型对测试集的预测,然后将这些预测作为输入特征来训练元模型。

 

前进

 

Scikit-learn提供了一个广泛的Python机器学习工具包。在本教程中,我们涵盖了使用Scikit-learn进行完整的机器学习工作流程——从安装库和了解其能力,到加载数据、训练模型、评估模型性能、调优超参数和编译集成模型。由于其设计良好的API、广泛的算法和与PyData堆栈的集成,该库变得非常流行。Sklearn使用户能够快速高效地构建模型并生成预测,而不会陷入实现细节中。凭借这个坚实的基础,您现在可以利用Scikit-learn将机器学习实际应用于实际问题。下一步是确定适合机器学习技术的问题,并利用本教程中的技能提取价值。

当然,关于Scikit-learn具体和机器学习总体来说,总是有更多的东西需要学习的。该库使用其估计器API实现了尖端的算法,如神经网络、流形学习和深度学习。您可以通过研究这些方法的理论工作来扩展自己的能力。Scikit-learn还与其他Python库(如Pandas)集成,以提供额外的数据操作能力。此外,像SageMaker这样的产品为大规模运营Scikit-learn模型提供了生产平台。

本教程只是一个起点 – Scikit-learn是一个多功能的工具包,将继续满足您在面对更高级挑战时的建模需求。关键是通过实践和手头项目不断练习和提升自己的技能。全面的建模生命周期的实践经验是最好的教师。通过勤奋和创造力,Scikit-learn为从各种数据中解锁深刻洞察提供了工具。

    Matthew Mayo@mattmayo13)拥有计算机科学硕士学位和数据挖掘研究生文凭。作为VoAGI的主编,Matthew的目标是使复杂的数据科学概念易于理解。他的专业兴趣包括自然语言处理、机器学习算法和探索新兴的人工智能。他的使命是在数据科学界普及知识。Matthew从6岁起就开始编程。