XGBoost在各种Kaggle比赛中表现出色,在准确性和分数方面与深度学习算法有着良好的竞争,已经非常出名。

尽管XGBoost是机器学习问题的众多解决方案之一,要将XGBoost主模块用于多类分类问题,需要更改两个参数的值:objective和num_class。让我们在wine数据集(https://archive.ics.uci.edu/ml/datasets/wine)的实践中看看它。

我们首先从Scikit Learn dataset API读取数据。

import pandas as pd
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
X, y = load_wine(return_X_y=True)

然后添加列名,以获得外观正确的机器学习数据集。

features = [
 'alcohol', 'malic_acid', 'ash', 'alcalinity_of_ash','magnesium',
 'total_phenols', 'flavanoids', 'nonflavanoid_phenols',
 'proanthocyanins', 'color_intensity', 'hue',
 'od280/od315_of_diluted_wines', 'proline'
]
X = pd.DataFrame(data=X, columns=features)
y = pd.DataFrame(data=y, columns=['classes'])

为训练集和测试集分割数据并得到我们的dmatrices。

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42, stratify=y)
dtrain = xgb.DMatrix(data=X_train, label=y_train)
dtest = xgb.DMatrix(data=X_test)

如果您不熟悉DMatrix,它是XGBoost模型中常用的输入数据接口,可以很好地与panda dataframes、Numpy数组、SciPy数组、CSV文件等配合使用。

是时候设置我们的XGBoost参数来执行多类预测了!

params = {
 'max_depth': 6,
 'objective': 'multi:softmax',
 'num_class': 3
}

参数表示:

max_depth:树的最大深度。增加这个值会使模型更复杂,更容易过度拟合。只有当tree_方法被设为histand时,0才被接受,它的深度没有限制。注意,在训练深度树时,XGBoost会大量消耗内存。

objective :: multi:softmax设置XGBoost 使用softmax目标进行 多类分类,还需要设置num_class(类数)

num_class在XGBoost的文档中没有更深入的介绍,但它意味着您应该预测类的数量(在我们的例子中是3)。

现在是时候训练我们的机器学习模型。

from sklearn.metrics import classification_report
bst = xgb.train(params, dtrain)
pred = bst.predict(dtest)
print(classification_report(y_test, pred))

整个步骤中取得的成果是:

请输入图片描述

然后我们有了一个可以正常工作的多类XGBoost模型。还有另一种方法可以实现这一点,它不是相同的技术,我们可以使用One vs Rest方法通过组合一组二元分类器来实现多类分类器。

Last modification:June 7, 2020
如果觉得我的文章对你有用,请随意赞赏