Bootstrap

XGBoost ——机器学习竞赛平台(介绍及代码实现)

XGBoost简介

        XGBoost号称“比赛夺冠的必备大杀器”,横扫机器学习竞赛罕逢敌手,堪称机器学习算法中的新女王!

        在涉及非结构化数据(图像、文本等)的预测问题中,人工神经网络显著优于所有其他算法或框架。但当涉及到中小型结构/表格数据时,基于决策树的算法现在被认为是最佳方法。而基于决策树算法中最惊艳的,非XGBoost莫属了。

        打过Kaggle、天池、DataCastle、Kesci等国内外数据竞赛平台之后,一定对XGBoost的威力印象深刻。XGBoost号称“比赛夺冠的必备大杀器”,横扫机器学习竞赛罕逢敌手。最近甚至有一位大数据/机器学习主管被XGBoost在项目中的表现惊艳到,盛赞其为“机器学习算法中的新女王”!

        XGBoost最初由陈天奇开发。陈天奇是华盛顿大学计算机系博士生,研究方向为大规模机器学习。他曾获得KDD CUP 2012 Track 1第一名,并开发了SVDFeature,XGBoost,cxxnet等著名机器学习工具,是Distributed (Deep) Machine Learning Common的发起人之一。

        XGBoost实现了高效、跨平台、分布式gradient boosting (GBDT, GBRT or GBM) 算法的一个库,可以下载安装并应用于C++,Python,R,Julia,Java,Scala,Hadoop等。目前Github上超过15700星、6500个fork。

安装XGBoost

pip install xgboost - i https://pypi.douban.com/simple

使用豆瓣云 速度超快的

代码

原始

导入xgboost

import xgboost

导入相关库及数据,数据后面附地址

# 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=",")
dataset

在这里插入图片描述
分割数据集,安装属性和标签分别分割

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

在这里插入图片描述
训练,预测,评估

# 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))

在这里插入图片描述

查看训练过程

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()
eval_set = [(X_test, y_test)]
model.fit(X_train, y_train, early_stopping_rounds=10, eval_metric="logloss", eval_set=eval_set, verbose=True)
# 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))

在这里插入图片描述

查看特征重要性

from numpy import loadtxt
from xgboost import XGBClassifier
from xgboost import plot_importance
from matplotlib import pyplot
# load data
dataset = loadtxt('pima-indians-diabetes.csv', delimiter=",")
# split data into X and y
X = dataset[:,0:8]
y = dataset[:,8]
# fit model no training data
model = XGBClassifier()
model.fit(X, y)
# plot feature importance
plot_importance(model)
pyplot.show()

在这里插入图片描述

调参 查找最好的学习率

# Tune learning_rate
from numpy import loadtxt
from xgboost import XGBClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import StratifiedKFold
# load data
dataset = loadtxt('pima-indians-diabetes.csv', delimiter=",")
# split data into X and y
X = dataset[:,0:8]
Y = dataset[:,8]
# grid search
model = XGBClassifier()
learning_rate = [0.0001, 0.001, 0.01, 0.1, 0.2, 0.3]
param_grid = dict(learning_rate=learning_rate)
kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=7)
grid_search = GridSearchCV(model, param_grid, scoring="neg_log_loss", n_jobs=-1, cv=kfold)
grid_result = grid_search.fit(X, Y)
# summarize results
print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))
means = grid_result.cv_results_['mean_test_score']
params = grid_result.cv_results_['params']
for mean, param in zip(means, params):
    print("%f  with: %r" % (mean, param))

在这里插入图片描述

对XGBoost主要参数进行解释,方括号内是对应scikit-learn中XGBoost算法模块的叫法。

提升参数

        虽然有两种类型的booster,但是我们这里只介绍tree。因为tree的性能比线性回归好得多,因此我们很少用线性回归。

1. eta [default=0.3, alias: learning_rate]

学习率,可以缩减每一步的权重值,使得模型更加健壮: 典型值一般设置为:0.01-0.2

2. min_child_weight [default=1]

        一个子集的所有观察值的最小权重和。如果新分裂的节点的样本权重和小于min_child_weight则停止分裂 。这个可以用来减少过拟合,但是也不能太高,会导致欠拟合。

3. max_depth [default=6]

        树的最大深度,值越大,树越大,模型越复杂 可以用来防止过拟合,典型值是3-10。

4. gamma [default=0, alias: min_split_loss]

        分裂节点时,损失函数减小值只有大于等于gamma节点才分裂,gamma值越大,算法越保守,越不容易过拟合,但性能就不一定能保证,需要平衡。

5. subsample [default=1]

        构建每棵树对样本的采样率,如果设置成0.5,XGBoost会随机选择一半的样本作为训练集。

6. colsample_bytree [default=1]

        列采样率,也就是特征采样率。

7. colsample_bylevel [default=1]

        构建每一层时,列采样率。

8. lambda [default=1, alias: reg_lambda]

        L2正则化,这个参数是用来控制XGBoost的正则化部分的。虽然大部分数据科学家很少用到这个参数,但是这个参数在减少过拟合上还是可以挖掘出更多用处的。

9. alpha [default=0, alias: reg_alpha]

        L1正则化,增加该值会让模型更加收敛

10. scale_pos_weight, [default=1]

        在类别高度不平衡的情况下,将参数设置大于0,可以加快收敛。

        学习目标参数:

        这个参数用来控制理想的优化目标和每一步结果的度量方法。

        1、objective[默认reg:linear]

        这个参数定义需要被最小化的损失函数。常用的值有:

        · reg:linear:线性回归

        · reg:logistic:逻辑回归

        · binary:logistic 二分类的逻辑回归,返回预测的概率

        · binary:logitraw:二分类逻辑回归,输出是逻辑为0/1的前一步的分数

        · multi:softmax:用于Xgboost 做多分类问题,需要设置num_class(分类的个数)

        · multi:softprob:和softmax一样,但是返回的是每个数据属于各个类别的概率。

        · rank:pairwise:让Xgboost 做排名任务,通过最小化(Learn to rank的一种方法)

        2、eval_metric( 默认值取决于objective参数的取值)

        · 对于有效数据的度量方法。

        · 对于回归问题,默认值是rmse,对于分类问题,默认值是error。

        · 典型值有:

        rmse 均方根误差

        mae 平均绝对误差

        logloss 负对数似然函数值

        error 二分类错误率(阈值为0.5)

        merror 多分类错误率

        mlogloss 多分类logloss损失函数

        auc 曲线下面积

        参数调优的一般步骤

        1. 确定学习速率和提升参数调优的初始值

        2. max_depth 和 min_child_weight 参数调优

        3. gamma参数调优

        4. subsample 和 colsample_bytree 参数优

        5. 正则化参数alpha调优

        6. 降低学习速率和使用更多的决策树
在这里插入图片描述

在这里插入图片描述
个人微信公众号,专注于学习资源、笔记分享,欢迎关注。我们一起成长,一起学习。一直纯真着,善良着,温情地热爱生活,,如果觉得有点用的话,请不要吝啬你手中点赞的权力,谢谢我亲爱的读者朋友
五角钱的程序员,专注于学习资源、笔记分享。

Doing what you love is the cornerstone of having abundance in your life.— Wayne Dyer
「做你爱做的事是拥有富足人生的基石。」– 韦恩 戴尔

参考:https://www.cnblogs.com/LHWorldBlog/p/9195623.html

代码数据链接:https://pan.baidu.com/s/1otk7l8Z90TfNIj6EYnDiAA
提取码:40zb

XiangLin
2020年3月14日于重庆城口
好好学习,天天向上,终有所获

;