开发预测模型的目标是开发一个对不可见数据准确预测的模型。
这可以通过使用统计技术来实现,其中训练数据集被仔细地用于评估模型对新数据和不可见数据的性能。
在本教程中,您将了解如何使用Python中的XGBoost评估梯度增强模型的性能。
完成本教程之后,您就会知道了。
如何使用训练和测试数据集评估XGBoost模型的性能。
如何使用k-fold交叉验证评估XGBoost模型的性能。
让我们开始吧。
使用训练集和测试集评估XGBoost模型
评估机器学习算法性能的最简单方法是使用不同的训练和测试数据集。
我们可以将原始数据集分成两部分。在第一部分对算法进行训练,然后在第二部分进行预测,并根据预期结果对模型进行评估。
分割的大小取决于数据集的大小和具体情况,不过通常使用67%的数据用于培训,其余33%用于测试。
该算法计算速度快。它非常适合大型数据集(数百万条记录),其中有强有力的证据表明,这两种数据分割都代表了潜在的问题。由于速度的原因,当您正在研究的算法训练速度较慢时,使用这种方法是很有用的。
这种技术的缺点是它可能有很高的方差。这意味着训练数据集和测试数据集的差异可能导致模型精度估计值的显著差异。
我们可以使用来自scikit-learn库的train_test_split()函数将数据集分割成一个训练和测试集。例如,我们可以将数据集分为67%和33%,分别用于训练和测试集:
# split data into train and test sets
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=7)
下面使用Pima Indians onset of diabetes数据集提供了完整的代码清单,该数据集假设位于当前工作目录中(更新:从这里下载)。在训练数据集上拟合具有缺省配置的XGBoost模型,并在测试数据集上进行评估
# train-test split evaluation of xgboost model
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
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=7)
# 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))
运行这个例子显示了模型在测试集中的性能。
Accuracy: 77.95%
使用k-Fold交叉验证评估XGBoost模型
交叉验证是一种方法,您可以使用它来估计机器学习算法的性能,其方差小于单个训练测试集分割的方差。
它的工作原理是将数据集分成k个部分(例如k=5或k=10)。数据的每个分割称为折叠。该算法在k-1折叠上进行训练,并在最后一折叠上进行测试。这是重复的,因此数据集的每个折叠都有机会成为保留的测试集。
在运行交叉验证之后,您将得到k个不同的性能分数,您可以使用平均值和标准差来总结这些分数。
结果是对给定测试数据的新数据的算法性能的更可靠的估计。由于算法对不同的数据进行了多次训练和评估,因此更加准确。
k的选择必须允许每个测试分区的大小足够大,可以作为问题的合理样本,同时允许对算法进行足够多的训练测试评估,从而对算法在不可见数据上的性能提供一个公平的估计。对于成千上万个观测值中的中等大小的数据集,k值为3、5和10是常见的。
我们可以使用scikit-learn提供的k-fold交叉验证支持。首先,我们必须创建KFold对象,指定折叠的数量和数据集的大小。然后,我们可以对特定的数据集使用此方案。scikit-learn中的cross_val_score()函数允许我们使用交叉验证方案评估一个模型,并返回在每个折叠上训练的每个模型的得分列表。
kfold = KFold(n_splits=10, random_state=7)
results = cross_val_score(model, X, Y, cv=kfold)
为了完整起见,下面提供了使用k-fold交叉验证评估XGBoost模型的完整代码清单。
# k-fold cross validation evaluation of xgboost model
from numpy import loadtxt
import xgboost
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
# load data
dataset = loadtxt('pima-indians-diabetes.csv', delimiter=",")
# split data into X and y
X = dataset[:,0:8]
Y = dataset[:,8]
# CV model
model = xgboost.XGBClassifier()
kfold = KFold(n_splits=10, random_state=7)
results = cross_val_score(model, X, Y, cv=kfold)
print("Accuracy: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))
运行这个例子总结了默认模型配置在数据集上的性能,包括平均值和标准差。
Accuracy: 76.69% (7.11%)
如果您有许多类用于分类类型预测建模问题,或者这些类是不平衡的(一个类的实例比另一个多很多),那么在执行交叉验证时创建分层折叠可能是一个好主意。
这样做的效果是,在执行交叉验证评估时,在每个折叠中强制执行与整个培训数据集中相同的类分布。scikit-learn库在分层kfold类中提供了这种功能。
下面是修改后的相同示例,使用分层交叉验证来评估XGBoost模型。
# stratified k-fold cross validation evaluation of xgboost model
from numpy import loadtxt
import xgboost
from sklearn.model_selection import StratifiedKFold
from sklearn.model_selection import cross_val_score
# load data
dataset = loadtxt('pima-indians-diabetes.csv', delimiter=",")
# split data into X and y
X = dataset[:,0:8]
Y = dataset[:,8]
# CV model
model = xgboost.XGBClassifier()
kfold = StratifiedKFold(n_splits=10, random_state=7)
results = cross_val_score(model, X, Y, cv=kfold)
print("Accuracy: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))
运行此示例将生成以下输出
Accuracy: 76.95% (5.88%)
什么时候使用此技术
通常,k-fold交叉验证是评价机器学习算法在k值为3、5或10时对未知数据的性能的标准。
当存在大量类或每个类的实例不平衡时,使用分层交叉验证来强制类分布。
在使用慢速算法时,使用训练/测试分割有利于提高速度,在使用大型数据集时,使用低偏差的性能估计。
最好的建议是进行试验,为您的问题找到一种快速、合理的性能评估技术,您可以使用该技术来做出决策。
如果有疑问,对回归问题使用10倍交叉验证,对分类问题使用分层10倍交叉验证。
总结
在本教程中,您了解了如何通过评估XGBoost模型在不可见数据上的执行情况来评估它们。
具体来说,你学会了:
如何将数据集分割为训练和测试子集,用于训练和评估模型的性能。
如何在数据集的不同子集上创建k个XGBoost模型,并对得分进行平均,从而获得对模型性能的更可靠的估计。
希望在数据分割和k折叠交叉验证中为您的问题提供一点启发。