Scikit-learn入门
要学习如何使用Scikit-learn,我们必须先对机器学习的基本概念有一定的了解,因为Scikit-learn只不过是一个实现机器学习原理和相关任务的实用工具。机器学习是人工智能的一个子集,它使计算机能够从经验中学习和改进,而不需要显式编程。算法利用训练数据来通过发现模式和洞察力进行预测或决策。
机器学习有三种主要类型:
毫无疑问,机器学习推动了现代社会的许多方面,产生了大量的数据。随着数据可用性的增长,机器学习的重要性也随之增加。
Scikit-learn是一个流行的开源Python库,用于机器学习。它广泛使用的一些关键原因包括:
本教程旨在提供一个使用Scikit-learn(主要针对常见的监督学习任务)的逐步指南,重点是通过大量的实践示例来入门。
第一步:开始使用Scikit-learn
安装和设置
要安装和使用Scikit-learn,你的系统必须有一个正常运行的Python安装。我们不会在这里介绍这个,但会假设你在这一点上已经有了一个正常运行的安装。
Scikit-learn可以使用pip,Python的包管理器来安装:
pip install scikit-learn
这也会安装必要的依赖项,如NumPy和SciPy。安装完成后,Scikit-learn可以在你的Python脚本中如下导入:
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()
数字数据集包含了手写数字的图像及其标签。在使用真实世界的数据之前,我们可以先使用这些样本数据集来熟悉Scikit-learn。
第二步:数据预处理
数据预处理的重要性
真实世界的数据往往是不完整、不一致并且包含错误的。数据预处理将原始数据转换为适合机器学习的格式,这是一个必不可少的步骤,它会影响下游模型的性能。
许多初学者往往忽视了适当的数据预处理,而是直接跳到模型训练。然而,低质量的数据输入将导致低质量的模型输出,无论使用的算法有多复杂。像正确处理缺失数据、检测和移除异常值、特征编码和特征缩放等步骤有助于提高模型准确性。
数据预处理占据了机器学习项目中大部分的时间和精力。计算机科学中的老话“垃圾进,垃圾出”在这里非常适用。高质量的数据输入是高性能机器学习的先决条件。数据预处理步骤将原始数据转换为一个精炼的训练集,使得机器学习算法能够有效地发现预测模式和洞察力。
总而言之,正确地预处理数据是任何机器学习工作流程中不可或缺的一步,应该受到充分的关注和鼓励。
加载和理解数据
让我们使用Scikit-learn加载一个样本数据集来进行演示:
from sklearn.datasets import load_iris
iris_data = load_iris()
我们可以探讨一下特征和目标值:
print(iris_data.data[0]) # Feature values for first sample
print(iris_data.target[0]) # Target value for first sample
在继续之前,我们应该了解特征和目标的含义。
数据清理
真实数据通常包含缺失、损坏或异常值。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('Sepal Length')
plt.ylabel('Sepal Width')
plt.show()
数据可视化在机器学习工作流程中起着多个重要的作用。它可以让你发现数据中的潜在模式和趋势,识别可能影响模型性能的异常值,以及深入了解变量之间的关系。通过事先可视化数据,你可以在特征选择和模型训练阶段做出更明智的决策。
第三步:模型选择和训练
Scikit-learn算法概述
Scikit-learn提供了多种监督和无监督的算法:
选择一个算法
选择最合适的机器学习算法对于构建高质量的模型至关重要。最佳算法取决于以下几个关键因素:
对于我们对鸢尾花进行分类的特定示例问题,逻辑回归或支持向量机等分类算法是最合适的。这些可以根据提供的特征测量有效地对花朵进行分类。其他更简单的算法可能无法提供足够的准确性。与此同时,对于这个相对简单的数据集来说,像深度神经网络这样非常复杂的方法就显得有些过分了。
当我们进行模型训练时,根据上述等方面考虑,始终选择最适合我们手头具体问题的算法是至关重要的。可靠地选择合适的算法将确保我们开发出高质量的机器学习系统。
训练一个简单的模型
让我们训练一个逻辑回归模型:
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(scaled_data, iris_data.target)
就是这样!该模型经过训练并准备好进行评估和使用。
训练更复杂的模型
虽然逻辑回归等简单的线性模型通常可以提供不错的性能,但对于更复杂的数据集,我们可能需要利用更复杂的算法。例如,集成方法使用bagging和boosting等技术将多个模型组合在一起,以提高整体预测准确性。举例来说,我们可以训练一个随机森林分类器,它聚合了许多决策树:
from sklearn.ensemble import RandomForestClassifier
rf_model = RandomForestClassifier(n_estimators=100)
rf_model.fit(scaled_data, iris_data.target)
随机森林可以捕捉特征之间的非线性关系和复杂的交互,使它能够比任何单个决策树产生更准确的预测。我们也可以使用像SVM、梯度提升树和神经网络这样的算法来在具有挑战性的数据集上进一步提高性能。关键是要尝试不同的算法,超越简单的线性模型,利用它们的优势。
然而,无论是使用简单还是更复杂的算法进行模型训练,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)))
这可以让我们了解模型的表现。
第五步:提高性能
超参数调优
超参数是模型配置设置。调整它们可以提高性能:
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)组合起来。
模型堆叠和混合
更高级的集成技术,如堆叠和混合,构建一个元模型来组合多个基模型。在分别训练基模型后,元模型学习如何最好地组合它们以获得最佳性能。这比简单的平均或投票集成提供了更大的灵活性。元学习器可以学习哪些模型在不同的数据段上表现最好。使用多样化的基模型进行堆叠和混合的集成,通常可以在许多机器学习任务上达到最先进的结果。
# Train base models
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)
# Make predictions to train meta-model
rf_predictions = rf.predict(X_test)
svc_predictions = svc.predict(X_test)
# Create dataset for meta-model
blender = np.vstack((rf_predictions, svc_predictions)).T
blender_target = y_test
# Fit meta-model on predictions
from sklearn.ensemble import GradientBoostingClassifier
gb = GradientBoostingClassifier()
gb.fit(blender, blender_target)
# Make final predictions
final_predictions = gb.predict(blender)
这个过程分别训练了一个随机森林和一个SVM模型,然后在它们的预测上训练了一个梯度提升树,产生最终的输出。关键步骤是从基模型在测试集上生成预测,然后使用这些预测作为输入特征来训练元模型。
Scikit-learn为Python机器学习提供了一个广泛的工具包。在本教程中,我们使用Scikit-learn覆盖了完整的机器学习工作流程——从安装库和了解其功能,到加载数据、训练模型、评估模型性能、调整超参数和编译集成。这个库因为其设计良好的API、广泛的算法和与PyData栈的集成而受到广泛的欢迎。Sklearn使用户能够快速高效地构建模型和生成预测,而不会陷入实现细节。有了这个坚实的基础,你现在可以使用Scikit-learn将机器学习应用到实际问题中。下一步就是找出适合使用机器学习技术的问题,并利用本教程中的技能来提取价值。
当然,关于Scikit-learn特别是机器学习总是有更多的东西可以学习。这个库使用它的估计器API实现了最先进的算法,如神经网络、流形学习和深度学习。你可以通过研究这些方法的理论原理来扩展你的能力。Scikit-learn还与其他Python库如Pandas集成,以增加数据处理能力。此外,像SageMaker这样的产品提供了一个生产平台,用于在大规模上运行Scikit-learn模型。
本教程只是一个起点——Scikit-learn是一个多功能的工具包,它将继续满足你在面对更高级挑战时的建模需求。关键是要通过实践项目继续练习和提高你的技能。对完整建模生命周期的实践经验是最好的老师。只要有勤奋和创造力,Scikit-learn就提供了从各种数据中发掘深刻洞察力的工具。