如何用XGBoost和Scikit-learn进行机器学习

679 阅读11分钟

用XGBoost和Scikit-learn进行机器学习

XGBoost是一个开源的Python库,提供了一个梯度提升的框架。它有助于产生一个高效、灵活和可移植的模型。

当涉及到预测时,XGBoost胜过其他算法或机器学习框架。

这是由于它的准确性和增强的性能。它将几个模型结合成一个单一的模型,以纠正现有模型的错误。

在本教程中,我们将使用Scikit-learn来建立我们的模型。然后我们将使用XGBoost来提高模型的准确性和性能。

前提条件

要想继续学习,你应该。

  • 安装[Python]。
  • 具备良好的[Python]知识。
  • 熟悉[机器学习建模]和[监督学习算法]。
  • 知道如何使用[Pandas]、[Numpy]和[Google Colab]来建立一个模型。

简介

XGBoost是建立在梯度提升框架之上的。

梯度提升是一种机器学习技术,用于分类、回归和聚类问题。它在进行预测时对模型进行优化。

在这种技术中,不同的模型被分组来执行相同的任务。

基础模型被称为弱学习者。它们的工作原理是:弱学习者在单独工作时预测效果不佳,但在团队中时产生最佳预测效果。

XGBoost在弱学习者的基础上创建一个强学习者。它按顺序添加模型。因此,弱的模型的错误会被链上的下一个模型纠正,以达到一个优化的解决方案。这就是所谓的集合。

使用XGBoost的原因

  • 高执行速度。
  • 提高了模型的性能。
  • 减少模型误差。

在本教程中,我们将建立一个分类模型,预测客户是否会认购银行的定期存款。

定期存款是一种固定的投资计划。定期存款可能有短期或长期的期限。

我们将使用一个包含客户信息的数据集来训练和建立我们的模型。

数据集

数据集包含了模型在训练过程中会用到的重要属性。

它使用这些信息来确定一个人是否会认购定期存款。该数据集还包含以下额外信息。

Bank dataset

在使用该数据集进行训练和预测分析之前,我们需要清理该数据集。

数据分析(EDA)包

让我们加载所有我们将用于数据分析和操作的包。

我们将使用Pandas来加载和清理我们的数据集。Numpy将被用于数学和科学计算。

import pandas as pd
import numpy as np

加载数据集

让我们使用Pandas加载数据集。

df = pd.read_csv("bank-additional-full.csv", sep=";")

我们将数据集中的字段分隔符指定为sep=";"

这是因为,我们的数据集中的字段是由; ,而不是默认的, 分隔符。

为了查看我们的数据集的结构,运行这段代码。

df.head()

输出结果如下所示。

Dataset

让我们看看我们的数据集中的可用数据点。

df.shape

输出结果如图所示。

(41188, 21)

输出显示,我们的数据集总共有41188 个数据点和21 列。

让我们看看这些列是什么。

df.columns

输出结果如下图所示。

Dataset columns

我们将使用age,job,marital,education, 和housing 等列来训练我们的模型。

在上面的输出中,y 列被用作目标变量。这就是我们试图预测的内容。

y 列被标记为yesno

yes 表示客户会订阅定期存款,而 表示此人不会订阅。no

让我们开始清理我们的数据集,我们首先要检查缺失值。

检查缺失值

我们使用下面的命令来检查缺失值。

df.isnull().sum()

输出结果如下图所示。

Missing values

结果显示,我们的数据集没有缺失值。

数据集清理还包括检查列中的数据类型,如下图所示。

Datatypes

在上图中,我们有不同的数据类型,如int64,object, 和float64 。请注意,object 数据类型中的数值是以类别的形式出现的。

例如,job 列包含一个object 数据类型。它的工作类别有:housemaid,services,blue-collar, 和technician

marital 列有诸如single,married, 和divorced 的类别。

机器学习对这些分类数据不起作用。因此,我们需要将这些分类值转换为数字值。

我们将把所有的数据类型转换为int64 。我们不需要转换float64 数据类型,因为它已经是数字值了。

将分类值转换为数字值的过程被称为categorical encoding

开始使用分类编码

在我们开始之前,让我们检索所有具有object 数据类型的列。

df.columns[df.dtypes == 'object']

输出结果如图所示。

Columns

为了将所有列转换为数值,我们使用get_dummies() 方法。

get_dummies() 是一种Pandas方法,用于将分类数据转换为编码的数值,这些数值是机器可读的格式。

pd.get_dummies(df,df.columns[df.dtypes == 'object'])

这将输出一个带有编码数值的新数据集,如下图所示。

Categorical encoding

上面的输出显示了第一个17 列的编码数字值。

让我们检查一下列的数据类型是否有变化。

df.dtypes

输出结果如下图所示。

Converted data types

这表明列中的所有objects 都被转换为int 。我们现在可以开始建立我们的模型了。

在本节中,我们将使用基本的Scikit-learn算法建立我们的模型。然后我们将使用XGBoost来提高模型的性能。

安装XGBoost

让我们用下面的命令来安装XGBoost。

!pip install xgboost

让我们导入这个包。

import xgboost as xgb

现在我们已经导入了XGBoost,让我们把数据集分成测试集和训练集。

数据集的分割

我们需要导入train_test_split ,进行数据集拆分。

import train_test_split from sklearn.model_selection

数据集被分割成两组:一个训练集和一个测试集。数据集的80% ,将被用作训练集,20% ,将被用于测试。

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

为了了解XGBoost的力量,我们需要将它与另一种算法进行比较。

我们首先使用决策树分类器算法来建立模型。

之后,我们用XGBoost建立同样的模型,并比较结果,看看XGBoost是否提高了模型的性能。

让我们从决策树分类器开始。

决策树分类器

决策树分类器是一种用于解决分类问题的机器学习算法。它是从Scikit-learn库中导入的。

决策树是由分支组成的,在制定决策规则时用于战略分析。

决策树创建了一个模型,将根据输入数据来预测标记的变量。

在建立模型时,树的内部节点被用来代表特定数据集的独特特征。

树枝代表决策规则,每个叶子节点代表预测结果。

这在下面的图片中显示。

Decision tree classifier

from sklearn.tree import DecisionTreeClassifier

让我们初始化一下DecisionTreeClassifier

dTree_clf = DecisionTreeClassifier()

在初始化DecisionTreeClassifier ,我们现在可以用它来建立我们的模型。

使用决策树分类器建立模型

我们将我们的模型装入训练集。这使得模型能够理解和学习模式。这对预测性分析很重要。

dTree_clf.fit(X_train,y_train)

训练结束后,这就是输出。

Decision tree classifier

输出强调了模型在进行预测时用于实现最佳解决方案的参数。

这些参数如下。

  • class_weight - 这是给算法的类别分配权重。
  • criterion - 它用于衡量节点的分割方式。
  • max_depth - 决策树分类器的最大深度。
  • max_features - 数据集中独特特征的总数。
  • max_leaf_nodes - 决策树中叶子结点的总数。
  • min_impurity_decrease - 这可以减少分割节点时的杂质。
  • min_impurity_split - 这可以确保在分割节点时满足最佳标准。
  • min_samples_leaf - 创建叶子节点时的最小样本。
  • min_samples_split - 分割一个节点时的最小样本。
  • min_weight_fraction_leaf - 一个叶子的最小权重。
  • random_state - 这些数字在进行每次分割时都会被使用。
  • splitter - 这就是用于分割每个节点的最佳策略。

让我们测试一下这个模型。

测试模型

我们使用测试数据集来测试该模型。它允许我们在训练阶段后检查模型的性能。

y_pred2 = dTree_clf.predict(X_test)

要查看预测结果,使用这个命令。

y_pred2

输出结果是,如下图所示。

array([1, 0, 0, ..., 1, 0, 0], dtype=int8)

对于数组中的第一个值,模型做了一个积极的预测(1)。这表明一个人将在银行认购一笔定期存款。

这个输出只显示了几个数据点的预测情况。

让我们来计算一下这些预测的准确度得分。

print("Accuracy of Model::",accuracy_score(y_test,y_pred2))

输出结果如图所示。

Accuracy of Model:: 0.8929351784413693

这表明,该模型在进行预测时的准确率为89.29%

让我们来看看XGBoost是否能改善这个模型的性能,提高准确率得分。

XGBoost

我们首先需要初始化XGBoost。正如所讨论的,XGBoost在其他弱小模型的基础上创建了最佳模型。

当不同的模型结合在一起时,它们会提升在进行预测时的纠错过程。

XGBoost可以通过在预测过程中使用最好的参数来提高模型的准确度得分。

xgb_classifier = xgb.XGBClassifier()

在初始化XGBoost之后,我们可以用它来训练我们的模型。

xgb_classifier.fit(X_train,y_train)

再一次,我们使用训练集。该模型从这个数据集中学习,将获得的知识存储在内存中,并在进行预测时使用这些知识。

xgb_classifier.fit(X_train,y_train)

其输出结果如图所示。

XGBoost classifier

XGBoost给模型添加了更多的参数。增加的参数用于消除训练中的错误,以及提高模型的性能。

模型的参数如下。

  • base_score - 这是对初始模型的预测。它的默认得分是 。0.5
  • booster - 这是用于提高模型性能的算法类型。
  • colsample_bylevel - 这显示了不同分支层次在树上是如何分开的。
  • colsample_bynode - 它显示了不同的节点是如何被分割的。
  • colsample_bytree - 它显示了XGBoost中不同的树是如何被分开的。
  • gamma - 这被用来减少纠正模型错误时的损失。
  • learning_rate - XGBoost模型在训练阶段的学习速率
  • max_delta_step - 这是用来在训练期间更新模型类别的。
  • max_depth - 这是XGBoost分类器的最大深度。
  • min_child_weight - 这是我们被允许划分树的叶子节点的最小尺寸。
  • n_estimators - 这是模型训练期间增加的估计器的总数。
  • n_jobs - 这是该模型处理的作业总数。
  • objective - 它指定了用于建立模型的算法类型,在这种情况下,它使用逻辑回归。
  • random_state - 这个播种数是由模型使用的。
  • reg_alpha - 这是用于减少模型权重的参数。
  • reg_lambda - 这是用于增加模型权重的参数。
  • seed - 模型所使用的种子。
  • subsample - 我们用来对模型的训练阶段进行采样的比率。
  • verbosity - 它可以衡量数据集中的单词的繁杂程度。

让我们来测试这个模型并进行预测。

这将测试我们的模型,这样我们就可以知道它在训练阶段的学习效果如何。

使用XGBoost进行预测

predictions = xgb_classifier.predict(X_test)

要查看预测结果,请使用这个命令。

predictions

输出如图所示。

array([0, 0, 0, ..., 1, 0, 0], dtype=int8)

在这个预测中,数组中的第一个值被预测为0 。这与决策树分类器的预测结果不同。

这表明XGBoost已经纠正了预测错误,从而做出了准确的预测。

让我们看看它是否提高了准确率。

print("Accuracy of Model::",accuracy_score(y_test,predictions))

准确率得分如图所示。

Accuracy of Model:: 0.9225540179655256

这表明该模型的准确率为92.255% 。与决策树分类器所做的89.29% 相比,这个准确率提高了。

这说明XGBoost在预测过程中减少了模型的错误,提高了模型的性能。

总结

在本教程中,我们已经学会了如何用XGBoost和Scikit-learn制作一个机器学习模型。我们首先说明了XGBoost的好处。

为了了解XGBoost是如何成为一个伟大的机器学习库,我们将它与决策树分类器算法进行了比较,以建立模型。之后,我们用XGBoost建立了同样的模型。

从结果来看,XGBoost比决策树分类器更好。它的准确率从89.29% 提高到了92.255%

因此,你可以利用本教程中获得的知识,用XGBoost和Scikit-learn建立更好的机器学习模型。