第一章:小试牛刀

1.1 xgboost为什么好

XGBoost全称是Extreme Gradient Boosting,中文表达为极速梯度提升方法,在近几年因其优良的效果和性能得到了广泛的传播,它的作者是上海交大的博士陈天奇。
引用‘python深度学习’一书的作者Francois Chollet的一段话:在2016年和2017年,Kaggle上主要有两大主要方法:梯度提升机和深度学习。具体而言,梯度提升机用于处理结构数据的问题,而深度学习则用于图像分类等感知问题。使用前一种方法的人几乎都命名用优秀的XGBoost库,它同时支持数据科学最流行的两种语言:Python和R。使用深度学习的Kaggle参赛者则大多使用Keras库,因为它易于使用,非常灵活,并且支持Python。要想在如今的应用机器学习中取得成功,你应该熟悉这两种技术:梯度提升机,用于浅层学习问题;深度学习,用于感知问题。用术语来说,你需要熟悉XGBoost和Keras,它们是止前主宰Kaggle竞赛的两个库。
相信读完这一段话,大家对掌握它们充满期待,本系列文章将主力介绍xgoost算法,您只需要稍懂计算基础便可以读取本系列的文章,如果您是行业的资深工作者,那么便可以迅速的将技术转化为成果。

1.2 第一次接触

下面我们通过一个简单的案例,来跟XGBoost做第一次接触。癌症乃是人类健康的第一大杀手,下面我们从一份乳腺癌的数据集来做分析一下患乳腺癌的概率,数据集有30个属性,y为{1, 0}, 分别代表患乳腺癌和没有患乳腺癌。分三个部分进行代码编写,首先数据生成,其次数据导入,最后建模主体,当然也可以直接从数据生成部分调到建模主体,但是我们这么做是为了给大家展示一下强大的数据处理工具pandas,实际建模一般从本地导入数据。
首先编写数据生成函数

import sklearn.datasets as ds
import numpy as np
def make_data():
    dst = './data/breast_cancer/breast_cancer.csv'
    fw = open(dst, 'w')
    cancer = ds.load_breast_cancer()
    X = cancer.data.astype(np.str)
    y = cancer.target.astype(np.str)
    data = np.column_stack((X, y))
    feature_names = cancer.feature_names
    feature_names_str = ','.join(feature_names)
    fw.write(feature_names_str + ',y\n')
    for i in range(len(data)):
        fw.write(','.join(data[i]) + '\n')

数据来源于sklearn的api,经过读取后保存到本地,本地目录为当前代码的相对目录,’./data/breast_cancer/breast_cancer.csv’,其次编写导入数据函数,采用常用的pandas库来实现。

import pandas as pd
import sklearn.model_selection as ms
def get_train_valid(data_path):
    data = pd.read_csv(data_path)
    data_x = data[['mean radius',	'mean texture',	'mean perimeter',	'mean area',	'mean smoothness',	'mean compactness',	'mean concavity',	'mean concave points',	'mean symmetry',	'mean fractal dimension',	'radius error',	'texture error',	'perimeter error',	'area error',	'smoothness error',	'compactness error',	'concavity error',	'concave points error',	'symmetry error',	'fractal dimension error',	'worst radius',	'worst texture',	'worst perimeter',	'worst area',	'worst smoothness',	'worst compactness',	'worst concavity',	'worst concave points',	'worst symmetry',	'worst fractal dimension']]
    data_y = data['y']
    train_x, valid_x, train_y, valid_y = ms.train_test_split(data_x, data_y, test_size=0.3, random_state=1)
    return train_x, train_y, valid_x, valid_y

pandas将我们日常处理数据的很多细节都考虑到了,非常实用的工具,这里首先通过read_csv读取本地数据,默认同时将列名和数据读取进来,然后通过列名进行分拆预测属性x和目标标签y,最后将数据划分训练和测试集并返回,一切都是函数api调用动作。下面我们来编写,建模主体部分

def common_use(train_x, train_y, valid_x, valid_y):
    print('the train process....................................')
    model = XGBClassifier()
    model.fit(train_x, train_y, eval_set=[(train_x, train_y), (valid_x, valid_y)])
    print('the importance of features....................................')
    fea_imp_sorted = sorted(model.get_booster().get_score().items(), key=itemgetter(1), reverse=True)
    for item in fea_imp_sorted:
        print(item[0] + ": " + str(item[1]))
    print('predict the new data....................................')
    pre_y = model.predict_proba(valid_x)
    auc = mt.roc_auc_score(valid_y, pre_y[:, 1])
    print('the auc is:', auc)

分为三部分,分别是构造模型部分,输出变量重要性部分,预测部分。先创建分类对象,代码为model = XGBClassifier(),我们传入相关的参数,实际上有很多参数,这里不传入的话会以默认值的形式运行,其次调用fit()函数,这个函数代表执行建模动作的意思,参数train_x,train_y代表训练数据,eval_set为list类型,每一个元素为一个元组,元组包括x,和y,如果想要打印每一次模型迭代后的效果,就用这个参数,这里有两个元组(train_x, train_y), (valid_x, valid_y),也就意味着建模过程中会评估训练和验证的效果,这个是模型好坏的重要参考依据。然后打印模型的重要性,重要性按照降序排列。最后为预测功能,并评估auc,这时选用了验证数据进行评估。接下来我们看调用过程,如下为代码:

def main():
    data_path = './data/breast_cancer/breast_cancer.csv'
    train_x, train_y, valid_x, valid_y = get_train_valid_cancer(data_path)
    common_use(train_x, train_y, valid_x, valid_y)

if __name__ == '__main__':
    main()

运行结果如下,训练过程输出了每一步的迭代的auc,总共为100步,这里为了阅读方便,只显示前两五个迭代和后五个迭代,这里的error为评估集的损失。模型重要性中最重要的变量是worst texture,值为61;预测数据的auc为0.9858,我们几乎没有做什么,就得到了这么好的效果,这说明了一个重要的数据建模本质,良好的指标和标签乃是成功的关键。

the train process....................................
[0]	validation_0-error:0.025126	validation_1-error:0.087719
[1]	validation_0-error:0.022613	validation_1-error:0.099415
[2]	validation_0-error:0.022613	validation_1-error:0.099415
[3]	validation_0-error:0.022613	validation_1-error:0.099415
[4]	validation_0-error:0.020101	validation_1-error:0.099415
.
.
.
[96]	validation_0-error:0	validation_1-error:0.046784
[97]	validation_0-error:0	validation_1-error:0.046784
[98]	validation_0-error:0	validation_1-error:0.046784
[99]	validation_0-error:0	validation_1-error:0.046784
the importance of features....................................
worst texture: 61
worst concave points: 38
area error: 37
worst area: 37
mean texture: 28
mean concave points: 26
worst perimeter: 24
worst radius: 22
worst concavity: 21
mean smoothness: 19
worst symmetry: 14
worst smoothness: 11
radius error: 7
worst compactness: 6
symmetry error: 6
compactness error: 6
worst fractal dimension: 5
mean radius: 5
mean symmetry: 4
smoothness error: 4
texture error: 4
perimeter error: 3
mean perimeter: 2
mean fractal dimension: 2
mean concavity: 2
fractal dimension error: 1
concavity error: 1
predict the new data....................................
the auc is: 0.9858171663727219

好了,在学习完本章之后,大家应该了解到xgboost的重要性,并学会使用xgboost进行基本的建模和评估。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值