赞
踩
XGBoost属于Boosting集成学习模型,由华盛顿大学陈天齐博士提出,因在机器学习挑战赛中大放异彩而被业界所熟知。相比越来越流行的深度神经网络,XGBoost能更好的处理表格数据,并具有更强的可解释性,还具有易于调参、输入数据不变性等优势。本文只做XGBoost分类任务的脚本实现,更多XGBoost内容请查看文末 附加——深入学习XGBoost
❤️ 本文完整脚本点此链接 百度网盘链接 获取 ❤️
结论先行:
当使用 from xgboost import XGBClassifier
的模型进行训练时,使用的是sklearn中的XGBClassifier类,该方法中无需特意指定分类类别,方法自带类别数量n_classes_
的计算,并根据数量指定了objective
参数,简而言之:该方法会自动判别是多分类还是二分类任务,无需特殊说明。
之所以特殊强调from xgboost import XGBClassifier
是要区别于import xgboost as xgb
的调用,本人更建议使用前者。
下方代码取自 sklearn.py 的 class XGBClassifier(XGBModel, XGBClassifierBase)…
# 计算类别数量 import cupy as cp # pylint: disable=E0401 self.classes_ = cp.unique(y.values) self.n_classes_ = len(self.classes_) ...... # objective参数的选择 if callable(self.objective): obj: Optional[ Callable[[np.ndarray, DMatrix], Tuple[np.ndarray, np.ndarray]] ] = _objective_decorator(self.objective) # Use default value. Is it really not used ? params["objective"] = "binary:logistic" else: obj = None if self.n_classes_ > 2: # Switch to using a multiclass objective in the underlying XGB instance if params.get("objective", None) != "multi:softmax": params["objective"] = "multi:softprob" params["num_class"] = self.n_classes_
# 导入第三方库,包括分类模型、数据集、数据集分割方法、评估方法
from xgboost import XGBClassifier # 分类模型
from sklearn import datasets # 数据集
from sklearn.model_selection import train_test_split # 数据集分割方法
from sklearn.metrics import accuracy_score, roc_auc_score, precision_score, recall_score, f1_score, \
classification_report # 评估方法
import xgboost as xgb
# 导入sklearn的鸢尾花卉数据集,作为模型的训练和验证数据
data = datasets.load_iris()
# 数据划分,按照7 3分切割数据集为训练集和验证集,其中最终4个结果依次为训练数据、验证数据、训练数据的标签、验证数据的标签
X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.3,random_state=123)
sklearn的鸢尾花卉数据集共150个数据样本,73切分后,训练集105个数据样本,验证集45个数据样本。数据集中包括 样本特征data(4个特征)、样本标签target(3类标签)、标签名称target_names([‘setosa’, ‘versicolor’, ‘virginica’])、特征名称feature_names([‘sepal length (cm)’, ‘sepal width (cm)’, ‘petal length (cm)’, ‘petal width (cm)’])、以及数据集位置filename(~~~\anaconda\lib\site-packages\sklearn\datasets\data\iris.csv)
数据集的 部分特征数据 如下:
数据集的 标签数据 及 标签名称 如下:
数据集文件所在本地地址,其他波士顿房价等数据也在此文件夹下
# 默认参数的模型 model = XGBClassifier() # 调参见 附加1 的文章内容 # model = XGBClassifier(booster='gbtree', # n_estimators=20, # 迭代次数 # learning_rate=0.1, # 步长 # max_depth=5, # 树的最大深度 # min_child_weight=1, # 决定最小叶子节点样本权重和 # subsample=0.8, # 每个决策树所用的子样本占总样本的比例(作用于样本) # colsample_bytree=0.8, # 建立树时对特征随机采样的比例(作用于特征)典型值:0.5-1 # nthread=4, # 线程数 # seed=27, # 指定随机种子,为了复现结果 # # num_class=4, # 标签类别数 # # objective='multi:softmax', # 多分类 # ) # 模型训练 model.fit(X_train, y_train, verbose=True) # 模型对验证数据做预测 y_pred 预测结果,y_proba 预测各类别概率,y_pred 是softmax(y_proba) 的结果 y_pred = model.predict(X_test) y_proba = model.predict_proba(X_test) # 为了便于观察验证数据的预测结果,写个循环传个参 for m, n, p in zip(y_proba, y_pred, y_test): if n == p: q = '预测正确' else: q = '预测错误' print('预测概率为{0}, 预测概率为{1}, 真是结果为{2}, {3}'.format(m, n, p, q)) # 准确率 accuracy = accuracy_score(y_test, y_pred) print('Accuracy:%.2f%%' % (accuracy * 100))
打印运行结果如下
导入数据集、训练、验证 与多分类完全一样,唯一需要改变的是将数据标签由n_classes>2
转为n_classes=2
# 数据划分 X_train, X_test, y_train, y_test = ...... # 接 # 训练集和验证集的标签都改成0和1 y_train = [1 if y > 0 else 0 for y in y_train] y_test = [1 if y > 0 else 0 for y in y_test] # 计算训练数据类别 n_classes = len(set(y_train)) # 接 # 默认参数的模型 model = XGBClassifier() ......
内容与1.2完全一致,不再赘述,直接看结果
二分类任务预测概率有两个,预测概率通过sigmoid
做出预测结果。多分类预测概率有多个,预测概率通过softmax
做出预测结果。
"""模型参数打印""" bst = xgb.Booster(model_file='xgb_classifier_model.model') # print(bst.attributes()) print('模型参数值-开始'.center(20, '=')) for attr_name, attr_value in bst.attributes().items(): # scikit_learn 的参数逐一解析 if attr_name == 'scikit_learn': import json dict_attr = json.loads(attr_value) # 打印 模型 scikit_learn 参数 for sl_name, sl_value in dict_attr.items(): if sl_value is not None: print(f"{sl_name}:{sl_value}") else: print(f"{attr_name}:{attr_value}") print('模型参数值-结束'.center(20, '='))
下图展示model = XGBClassifier()
未指定参数情况下,模型的参数情况打印,其中objective
和classes_
参数映证了最前面的结论。
评估方法更详细解释,见附加3的文章内容
def metrics_sklearn(class_num, y_valid, y_pred_, y_prob): """模型效果评估""" # 准确率 # 准确度 accuracy_score:分类正确率分数,函数返回一个分数,这个分数或是正确的比例,或是正确的个数,不考虑正例负例的问题,区别于 precision_score # 一般不直接使用准确率,主要是因为类别不平衡问题,如果大部分是negative的 而且大部分模型都很容易判别出来,那准确率都很高, 没有区分度,也没有实际意义(因为negative不是我们感兴趣的) accuracy = accuracy_score(y_valid, y_pred_) print('Accuracy:%.2f%%' % (accuracy * 100)) # 精准率 if class_num == 2: precision = precision_score(y_valid, y_pred_) else: precision = precision_score(y_valid, y_pred_, average='macro') print('Precision:%.2f%%' % (precision * 100)) # 召回率 # 召回率/查全率R recall_score:预测正确的正样本占预测正样本的比例, TPR 真正率 # 在二分类任务中,召回率表示被分为正例的个数占所有正例个数的比例;如果是多分类的话,就是每一类的平均召回率 if class_num == 2: recall = recall_score(y_valid, y_pred_) else: recall = recall_score(y_valid, y_pred_, average='macro') print('Recall:%.2f%%' % (recall * 100)) # F1值 if class_num == 2: f1 = f1_score(y_valid, y_pred_) else: f1 = f1_score(y_valid, y_pred_, average='macro') print('F1:%.2f%%' % (f1 * 100)) # auc曲线下面积 # 曲线下面积 roc_auc_score 计算AUC的值,即输出的AUC(二分类任务中 auc 和 roc_auc_score 数值相等) # 计算auc,auc就是曲线roc下面积,这个数值越高,则分类器越优秀。这个曲线roc所在坐标轴的横轴是FPR,纵轴是TPR。 # 真正率:TPR = TP/P = TP/(TP+FN)、假正率:FPR = FP/N = FP/(FP+TN) # auc:不支持多分类任务 计算ROC曲线下的面积 # 二分类问题直接用预测值与标签值计算:auc = roc_auc_score(Y_test, Y_pred) # 多分类问题概率分数 y_prob:auc = roc_auc_score(Y_test, Y_pred_prob, multi_class='ovo') 其中multi_class必选 if class_num == 2: auc = roc_auc_score(y_valid, y_pred_) else: auc = roc_auc_score(y_valid, y_prob, multi_class='ovo') # auc = roc_auc_score(y_valid, y_prob, multi_class='ovr') print('AUC:%.2f%%' % (auc * 100)) # 评估效果报告 print(classification_report(y_test, y_pred, target_names=['0:setosa', '1:versicolor', '2:virginica'])) """模型效果评估""" n_classes = len(set(y_train)) metrics_sklearn(n_classes, y_test, y_pred, y_proba)
多分类模型效果评估结果入下图所示
本文完整脚本可通过百度网盘链接 获取
见《XGBoost模型调参、训练、评估、保存和预测》 ,包含模型脚本文件
见《XGBoost算法原理及基础知识》 ,包括集成学习方法,XGBoost模型、目标函数、算法,公式推导等
见《分类任务评估1——推导sklearn分类任务评估指标》,其中包含了详细的推理过程;
见《分类任务评估2——推导ROC曲线、P-R曲线和K-S曲线》,其中包含ROC曲线、P-R曲线和K-S曲线的推导与绘制;
见《Graphviz绘制模型树1——软件配置与XGBoost树的绘制》,包含Graphviz软件的安装和配置,以及to_graphviz()和plot_trees()两个画图函数的部分使用细节;
见《Graphviz绘制模型树2——XGBoost模型的可解释性》,从模型中的树着手解释XGBoost模型,并用EXCEL构建出模型。
见机器学习实践(1.2)XGBoost回归任务,包含回归任务模型训练、评估(R2、MSE)
❤️ 机器学习内容持续更新中… ❤️
声明:本文所载信息不保证准确性和完整性。文中所述内容和意见仅供参考,不构成实际商业建议,可收藏可转发但请勿转载,如有雷同纯属巧合。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。