用XGBoost和Scikit-learn进行机器学习
XGBoost是一个开源的Python库,提供了一个梯度提升的框架。它有助于产生一个高效、灵活和可移植的模型。
当涉及到预测时,XGBoost胜过其他算法或机器学习框架。
这是由于它的准确性和增强的性能。它将几个模型结合成一个单一的模型,以纠正现有模型的错误。
在本教程中,我们将使用Scikit-learn来建立我们的模型。然后我们将使用XGBoost来提高模型的准确性和性能。
前提条件
要想继续学习,你应该。
- 安装[Python]。
- 具备良好的[Python]知识。
- 熟悉[机器学习建模]和[监督学习算法]。
- 知道如何使用[Pandas]、[Numpy]和[Google Colab]来建立一个模型。
简介
XGBoost是建立在梯度提升框架之上的。
梯度提升是一种机器学习技术,用于分类、回归和聚类问题。它在进行预测时对模型进行优化。
在这种技术中,不同的模型被分组来执行相同的任务。
基础模型被称为弱学习者。它们的工作原理是:弱学习者在单独工作时预测效果不佳,但在团队中时产生最佳预测效果。
XGBoost在弱学习者的基础上创建一个强学习者。它按顺序添加模型。因此,弱的模型的错误会被链上的下一个模型纠正,以达到一个优化的解决方案。这就是所谓的集合。
使用XGBoost的原因
- 高执行速度。
- 提高了模型的性能。
- 减少模型误差。
在本教程中,我们将建立一个分类模型,预测客户是否会认购银行的定期存款。
定期存款是一种固定的投资计划。定期存款可能有短期或长期的期限。
我们将使用一个包含客户信息的数据集来训练和建立我们的模型。
数据集
数据集包含了模型在训练过程中会用到的重要属性。
它使用这些信息来确定一个人是否会认购定期存款。该数据集还包含以下额外信息。

在使用该数据集进行训练和预测分析之前,我们需要清理该数据集。
数据分析(EDA)包
让我们加载所有我们将用于数据分析和操作的包。
我们将使用Pandas来加载和清理我们的数据集。Numpy将被用于数学和科学计算。
import pandas as pd
import numpy as np
加载数据集
让我们使用Pandas加载数据集。
df = pd.read_csv("bank-additional-full.csv", sep=";")
我们将数据集中的字段分隔符指定为sep=";" 。
这是因为,我们的数据集中的字段是由; ,而不是默认的, 分隔符。
为了查看我们的数据集的结构,运行这段代码。
df.head()
输出结果如下所示。

让我们看看我们的数据集中的可用数据点。
df.shape
输出结果如图所示。
(41188, 21)
输出显示,我们的数据集总共有41188 个数据点和21 列。
让我们看看这些列是什么。
df.columns
输出结果如下图所示。

我们将使用age,job,marital,education, 和housing 等列来训练我们的模型。
在上面的输出中,y 列被用作目标变量。这就是我们试图预测的内容。
y 列被标记为yes 或no 。
yes 表示客户会订阅定期存款,而 表示此人不会订阅。no
让我们开始清理我们的数据集,我们首先要检查缺失值。
检查缺失值
我们使用下面的命令来检查缺失值。
df.isnull().sum()
输出结果如下图所示。

结果显示,我们的数据集没有缺失值。
数据集清理还包括检查列中的数据类型,如下图所示。

在上图中,我们有不同的数据类型,如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']
输出结果如图所示。

为了将所有列转换为数值,我们使用get_dummies() 方法。
get_dummies() 是一种Pandas方法,用于将分类数据转换为编码的数值,这些数值是机器可读的格式。
pd.get_dummies(df,df.columns[df.dtypes == 'object'])
这将输出一个带有编码数值的新数据集,如下图所示。

上面的输出显示了第一个17 列的编码数字值。
让我们检查一下列的数据类型是否有变化。
df.dtypes
输出结果如下图所示。

这表明列中的所有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库中导入的。
决策树是由分支组成的,在制定决策规则时用于战略分析。
决策树创建了一个模型,将根据输入数据来预测标记的变量。
在建立模型时,树的内部节点被用来代表特定数据集的独特特征。
树枝代表决策规则,每个叶子节点代表预测结果。
这在下面的图片中显示。

from sklearn.tree import DecisionTreeClassifier
让我们初始化一下DecisionTreeClassifier 。
dTree_clf = DecisionTreeClassifier()
在初始化DecisionTreeClassifier ,我们现在可以用它来建立我们的模型。
使用决策树分类器建立模型
我们将我们的模型装入训练集。这使得模型能够理解和学习模式。这对预测性分析很重要。
dTree_clf.fit(X_train,y_train)
训练结束后,这就是输出。

输出强调了模型在进行预测时用于实现最佳解决方案的参数。
这些参数如下。
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给模型添加了更多的参数。增加的参数用于消除训练中的错误,以及提高模型的性能。
模型的参数如下。
base_score- 这是对初始模型的预测。它的默认得分是 。0.5booster- 这是用于提高模型性能的算法类型。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建立更好的机器学习模型。