📜  机器学习:使用scikit-learn训练第一个XGBoost模型

📅  最后修改于: 2020-09-23 02:59:57             🧑  作者: Mango

1.安装XGBoost

一个运行良好的SciPy环境,则可以使用pip轻松安装XGBoost。

sudo pip install xgboost

要更新XGBoost的安装

sudo pip install --upgrade xgboost

如果您无法使用pip或要从GitHub运行最新代码,则安装XGBoost的另一种方法要求您克隆XGBoost项目并执行手动构建和安装。

例如,要在Mac OS X上构建不带多线程功能的XGBoost(已经通过macports或自制软件安装了GCC),则可以尝试以下方式:

git clone --recursive https://github.com/dmlc/xgboost
cd xgboost
cp make/minimum.mk ./config.mk
make -j4
cd python-package
sudo python setup.py install

您可以在XGBoost安装指南中了解有关如何为不同平台安装XGBoost的更多信息。有关为Python安装XGBoost的最新说明,请参见XGBoost Python软件包

作为参考,您可以查看XGBoost Python API参考

2. 预测糖尿病的发作

我们将使用Pima Indians糖尿病发病数据集。

该数据集由描述患者医疗细节的8个输入变量和一个指示患者在5年内是否患有糖尿病的输出变量组成。

您可以在UCI机器学习存储库网站上了解有关此数据集的更多信息。

对于所有第一个XGBoost模型来说,这都是一个很好的数据集,因为所有输入变量都是数字,并且该问题是一个简单的二进制分类问题。对于XGBoost算法,这不一定是一个好问题,因为它是一个相对较小的数据集,并且建模起来很容易。

下载此数据集,并将其放入文件名为“ pima-indians-diabetes.csv ” 的当前工作目录中(更新:从此处下载)。

3.加载和准备数据

我们将从文件中加载数据,并准备将其用于训练和评估XGBoost模型。

我们将首先导入要在本教程中使用的类和函数。

from numpy import loadtxt
from xgboost import XGBClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

我们可以使用NumPy函数loadtext()将CSV文件作为NumPy数组加载。

# load data
dataset = loadtxt('pima-indians-diabetes.csv', delimiter=",")

将数据集的列(属性或特征)分为输入模式(X)和输出模式(Y)。我们可以通过以NumPy数组格式指定列索引来轻松地做到这一点。

# split data into X and y
X = dataset[:,0:8]
Y = dataset[:,8]

最后,我们必须将X和Y数据分成训练和测试数据集。训练集将用于准备XGBoost模型,测试集将用于做出新的预测,从中我们可以评估模型的性能。

为此,我们将使用scikit-learn库中的train_test_split()函数。我们还为随机数生成器指定了种子,因此每次执行此示例时,我们总是得到相同的数据分割。

# split data into train and test sets
seed = 7
test_size = 0.33
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=test_size, random_state=seed)

现在我们准备训练模型。

4.训练XGBoost模型

XGBoost提供了一个包装器类,以允许在scikit-learn框架中将模型视为分类器或回归器。

这意味着我们可以将完整的scikit-learn库与XGBoost模型一起使用。

用于分类的XGBoost模型称为XGBClassifier。我们可以创建它并使其适合我们的训练数据集。使用scikit-learn API和model.fit()函数拟合模型。

可以在构造函数中将用于训练模型的参数传递给模型。在这里,我们使用明智的默认值。

# fit model no training data
model = XGBClassifier()
model.fit(X_train, y_train)

您可以通过打印模型来查看已训练模型中使用的参数,例如:

print(model) 

您可以在XGBoost Python scikit-learn API中了解有关XGBClassifierXGBRegressor类的默认值的更多信息。

您可以在XGBoost参数页面上了解有关每个参数的含义以及如何配置它们的更多信息

5.使用XGBoost模型进行预测

可以使用测试数据集上的拟合模型进行预测。

为了进行预测,我们使用scikit-learn函数model.predict()

默认情况下,XGBoost做出的预测是概率。因为这是一个二进制分类问题,所以每个预测都是输入模式属于第一类的概率。通过将它们四舍五入为0或1,我们可以轻松地将它们转换为二进制类值。

# make predictions for test data
y_pred = model.predict(X_test)
predictions = [round(value) for value in y_pred]

我们已经使用拟合模型对新数据进行了预测,我们可以通过将预测值与期望值进行比较来评估预测的性能。为此,我们将在scikit-learn中使用内置的precision_score ()函数。

# evaluate predictions
accuracy = accuracy_score(y_test, predictions)
print("Accuracy: %.2f%%" % (accuracy * 100.0))

完整代码清单:

# First XGBoost model for Pima Indians dataset
from numpy import loadtxt
from xgboost import XGBClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# load data
dataset = loadtxt('pima-indians-diabetes.csv', delimiter=",")
# split data into X and y
X = dataset[:,0:8]
Y = dataset[:,8]
# split data into train and test sets
seed = 7
test_size = 0.33
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=test_size, random_state=seed)
# fit model no training data
model = XGBClassifier()
model.fit(X_train, y_train)
# make predictions for test data
y_pred = model.predict(X_test)
predictions = [round(value) for value in y_pred]
# evaluate predictions
accuracy = accuracy_score(y_test, predictions)
print("Accuracy: %.2f%%" % (accuracy * 100.0))

注意:由于算法或评估程序的随机性,或者数值精度不同,您的结果可能会有所不同。考虑运行该示例几次并比较平均结果。