深入了解Scikit-learn:5步学习之旅

图片[1]-深入了解Scikit-learn:5步学习之旅-山海云端论坛

在学习如何使用 Scikit-learn 时,我们显然必须对机器学习的底层概念有一定的了解,因为 Scikit-learn 无非是实现机器学习原理和相关任务的实用工具。机器学习主要分为三种类型:

  • 监督学习:模型根据标记数据进行训练,学习将输入映射到输出。
  • 无监督学习:模型致力于发现未标记数据中隐藏的模式和分组。
  • 强化学习:模型通过与环境交互、接受奖励和惩罚来鼓励最佳行为来学习。

随着数据可用性的不断增长,机器学习的重要性也在不断增加。Scikit-learn 是一个流行的机器学习开源 Python 库。它具有如下优点:

  • 简单高效的数据分析和建模工具
  • 基于 NumPy、SciPy 和 matplotlib 构建,更易于集成
  • 适用于分类、回归、聚类、降维等任务的多种算法

1、Scikit-learn 入门

安装

Scikit-learn 可以使用 Python 的包管理器 pip 进行安装。

<code>pip install scikit-learn</code>

加载示例数据集

Scikit-learn 提供了各种示例数据集,我们可以使用它们来进行测试和实验。

<code>from sklearn import datasets iris = datasets.load_iris() digits = datasets.load_digits()</code>

2、数据预处理

数据预处理的重要性

现实世界的数据通常不完整、不一致并且包含错误。数据预处理将原始数据转换为机器学习可用的格式,是影响下游模型性能的重要步骤。许多新手从业者经常忽视正确的数据预处理,而是直接进入模型训练。然而,无论所使用的算法有多复杂,低质量的数据输入都会导致低质量的模型输出。正确处理缺失数据、检测和删除异常值、特征编码和特征缩放等步骤有助于提高模型的准确性。高质量的数据输入是高性能机器学习的先决条件。数据预处理步骤将原始数据转换为精炼的训练集,使机器学习算法能够有效地揭示预测模式和见解。总而言之,正确地预处理数据是任何机器学习工作流程中不可或缺的步骤,应该得到大量的关注和努力。

加载和理解数据

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

<code>from sklearn.datasets import load_iris iris_data = load_iris()</code>

我们可以探讨一下特征和目标值。

<code>print(iris_data.data[0]) # Feature values for first sample print(iris_data.target[0]) # Target value for first sample</code>

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

数据清理

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

<code>from sklearn.impute import SimpleImputer imputer = SimpleImputer(strategy='mean') imputed_data = imputer.fit_transform(iris_data.data)</code>

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

特征缩放

支持向量机 (SVM) 和神经网络等算法对输入特征的规模很敏感。不一致的特征尺度可能会导致这些算法过分重视尺度较大的特征,从而影响模型的性能。因此,在训练这些算法之前,必须对特征进行归一化或标准化,以使它们达到相似的规模。

<code>from sklearn.preprocessing import StandardScaler scaler = StandardScaler() scaled_data = scaler.fit_transform(iris_data.data)</code>

StandardScaler 将特征标准化为均值 0 和方差 1。还可以使用其他缩放器。

可视化数据

我们还可以使用 matplotlib 可视化数据以获得进一步的见解。

<code>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()</code>

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

3、模型选择和训练

Scikit-learn 算法概述

Scikit-learn 提供了多种有监督和无监督算法。

  • 分类:逻辑回归、SVM、朴素贝叶斯、决策树、随机森林
  • 回归:线性回归、SVR、决策树、随机森林
  • 聚类:k-Means、DBSCAN、凝聚聚类

选择算法

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

  • 可用于训练的数据的大小和类型。
  • 可用的计算资源。
  • 我们要解决的具体问题。
  • 任何特殊要求,例如可解释性的需要。
  • 所需的精度/性能。

对于我们「对鸢尾花进行分类」的特定示例问题,逻辑回归或支持向量机等分类算法是最合适的。这些可以根据提供的特征测量有效地对花朵进行分类。其他更简单的算法可能无法提供足够的准确性。

训练一个简单的模型

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

<code>from sklearn.linear_model import LogisticRegression model = LogisticRegression() model.fit(scaled_data, iris_data.target)</code>

就是这样!该模型经过训练并准备好进行评估和使用。

训练更复杂的模型

虽然逻辑回归等简单的线性模型通常可以提供不错的性能,但对于更复杂的数据集,我们可能需要利用更复杂的算法。例如,集成方法使用 bagging 和 boosting 等技术将多个模型组合在一起,以提高整体预测准确性。

举例来说,我们可以训练一个随机森林分类器,它聚合了许多决策树。

<code>from sklearn.ensemble import RandomForestClassifier rf_model = RandomForestClassifier(n_estimators=100) rf_model.fit(scaled_data, iris_data.target)</code>

随机森林可以捕获特征之间的非线性关系和复杂的相互作用,使其能够比任何单个决策树产生更准确的预测。

4、模型评估

评估的重要性

在最终部署到生产环境之前,评估机器学习模型的性能绝对是至关重要的一步。全面评估模型可以建立必要的信任,相信系统一旦部署即可可靠运行。它还确定了需要改进的潜在领域,以提高模型的预测准确性和泛化能力。模型可能在其所拟合的训练数据上显得非常准确,但在现实数据上仍然严重失败。这凸显了在保留的测试集和新数据上测试模型的迫切需要,而不仅仅是训练数据。我们必须模拟模型部署后的执行情况。严格评估模型还可以深入了解可能的过度拟合,即模型记住训练数据中的模式,但无法学习对样本外预测有用的概括关系。检测过度拟合会提示采取适当的对策,例如正则化和交叉验证。评估还允许比较多个候选模型以选择性能最佳的选项。与简单基准模型相比无法提供足够提升的模型可能需要重新设计或完全替换。总之,全面评估机器学习模型对于确保其可靠性和附加值是必不可少的。

因此,在考虑部署之前,机器学习从业者应该投入大量精力,在代表性测试集的相关性能指标上正确评估他们的模型。

训练/测试分开

我们分割数据以评估新数据上的模型性能。

<code>from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(scaled_data, iris_data.target)</code>

按照惯例,X 指的是特征,y 指的是目标变量。

评估指标

对于分类,关键指标包括准确性、精度和召回率。这些可以通过 Scikit-learn 的分类报告来计算。

<code>from sklearn.metrics import classification_report print(classification_report(y_test, model.predict(X_test)))</code>

这使我们能够深入了解模型的性能。

5、提高性能

超参数调优

调整超参数可以提高模型的性能。

<code>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)</code>

该网格通过不同的正则化强度来优化模型的准确性。

交叉验证

交叉验证提供了更可靠的超参数评估。

<code>from sklearn.model_selection import cross_val_score cross_val_scores = cross_val_score(model, scaled_data, iris_data.target, cv=5)</code>

它将数据分为 5 部分,并评估每部分的性能。

集成方法

组合多个模型可以提高性能。

为了证明这一点,我们首先训练一个随机森林模型。

<code>from sklearn.ensemble import RandomForestClassifier random_forest = RandomForestClassifier(n_estimators=100) random_forest.fit(scaled_data, iris_data.target)</code>

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

<code>from sklearn.ensemble import VotingClassifier voting_clf = VotingClassifier(estimators=[('lr', model), ('rf', random_forest)]) voting_clf.fit(scaled_data, iris_data.target)</code>

该集成模型将我们之前训练的逻辑回归模型 lr 与新定义的随机森林模型 rf 相结合。

模型堆叠和混合

更先进的集成技术(例如堆叠和混合)构建元模型来组合多个基本模型。

<code># 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)</code>

它分别训练随机森林和 SVM 模型,然后根据其预测训练梯度提升树以产生最终输出。关键步骤是从测试集上的基本模型生成预测,然后使用这些预测作为输入特征来训练元模型。

在本文中,我们介绍了使用 Scikit-learn 的完整机器学习工作流程,从安装库和了解其功能,到加载数据、训练模型、评估模型性能、调整超参数等。

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容