最近准备研究一下信贷风控中机器学习模型评分卡的制作。信贷评分卡分为两种,一种是用逻辑回归,称为评分卡;一种是用集成学习算法,称为机器学习模型。逻辑回归算法相对简单,但是解释性要求高;机器学习模型理论上效果要更好一点,但是无法解释,而且模型容易不稳定。于是找了一下网上能找到的关于机器学习模型做评分卡的案例,主要有拍拍贷比赛实例、金融风控实战、kaggle上的Home Credit Default Risk比赛,附上相应的课程或比赛链接。

  1. 拍拍贷比赛案例
    https://www.bilibili.com/video/BV1NE41157Ag?p=29
  2. 金融风控实战
    https://www.bilibili.com/video/BV18J411R7ei?p=11
  3. Kaggle案例
    https://www.kaggle.com/fanzzz/understand-variables-in-chinese

  本篇文章是一篇简单的xgboost快速上手的教程,不涉及算法推导,帮助自己回顾一下xgboost的基本用法,后续会再复习一下算法的推导过程以及优缺点。

一、读取数据并指定参数建模

xgboost读取数据有两种方式:

  1. 使用xgboost自带的数据集格式 + xgboost自带的建模方式
  • 把数据读取成xgb.DMatrix格式(libsvm/dataframe.values给定X和Y)
  • 准备好一个watch_list(观测和评估的数据集)
  • xgb.train(dtrain)
  • xgb.predict(dtest)
  1. 使用pandas的DataFrame格式 + xgboost的sklearn接口
  • estimator = xgb.XGBClassifier()/xgb.XGBRegressor()
  • estimator.fit(df_train.values, df_target.values)
    先看一下第一种方式读取数据和建模的方法。
import numpy as np
import pandas as pd
import pickle
import xgboost as xgb
from sklearn.model_selection import train_test_splitdata = pd.read_csv('./data/Pima-Indians-Diabetes.csv')train, test = train_test_split(data)# 转换成Dmatrix格式
feature_columns = ['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI', 'DiabetesPedigreeFunction', 'Age']
target_column = 'Outcome'
# 需要将dataframe格式的数据转化为矩阵形式
xgtrain = xgb.DMatrix(train[feature_columns].values, train[target_column].values)
xgtest = xgb.DMatrix(test[feature_columns].values, test[target_column].values)#参数设定
param = {'max_depth':5, 'eta':0.1, 'silent':1, 'subsample':0.7, 'colsample_bytree':0.7, 'objective':'binary:logistic' }# 设定watchlist用于查看模型状态
watchlist  = [(xgtest,'eval'), (xgtrain,'train')]
num_round = 10
bst = xgb.train(param, xgtrain, num_round, watchlist)# 使用模型预测
preds = bst.predict(xgtest)# 判断准确率
labels = xgtest.get_label()
print ('错误类为%f' % \(sum(1 for i in range(len(preds)) if int(preds[i]>0.5)!=labels[i]) /float(len(preds))))# 模型存储
bst.save_model('./model/0002.model')

  第一点就是输入数据形式要转化成矩阵的形式,第二点就是watchlist参数用于查看模型的状态,也就是为了输出eval-error和train-error。然后再解释下几个参数的含义:

‘max_depth’:设置树的最大深度。默认为6。
‘eta’:学习率。默认为0.3。
‘silent’:0表示输出信息, 1表示安静模式。默认为0。
‘subsample’:观测的子样本的比率,即对总体进行随机抽样的比例。默认为1。
'colsample_bytree ':用于构造每棵树时变量的子样本比率.即特征抽样。默认为1。
‘objective’:最小化的损失函数。

  xgboost的参数可以分为三类,通用参数/general parameters, 集成(增强)参数/booster parameters 和 任务参数/task parameters。
以上silent是通用参数,objective是任务参数,其它的都是集成参数。

  再来看一下使用sklearn接口进行建模的例子。

#!/usr/bin/python
import warnings
warnings.filterwarnings("ignore")
import numpy as np
import pandas as pd
import pickle
import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn.externals import joblibdata = pd.read_csv('./data/Pima-Indians-Diabetes.csv')train, test = train_test_split(data)# 取出特征X和目标y的部分
feature_columns = ['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI', 'DiabetesPedigreeFunction', 'Age']
target_column = 'Outcome'
train_X = train[feature_columns].values
train_y = train[target_column].values
test_X = test[feature_columns].values
test_y = test[target_column].values# 初始化模型
xgb_classifier = xgb.XGBClassifier(n_estimators=20,max_depth=4,learning_rate=0.1, subsample=0.7, colsample_bytree=0.7)# 拟合模型
xgb_classifier.fit(train_X, train_y)# 使用模型预测
preds = xgb_classifier.predict(test_X)# 判断准确率
print ('错误类为%f' %((preds!=test_y).sum()/float(test_y.shape[0])))# 模型存储
joblib.dump(xgb_classifier, './model/0003.model')

  读取数据和建模的大致流程就这么两种,下面结合xgb建模的方式进行深入地了解。
  利用xgb进行交叉验证。

param = {'max_depth':5, 'eta':0.1, 'silent':0, 'subsample':0.7, 'colsample_bytree':0.7, 'objective':'binary:logistic' }
num_round = 10
dtrain = xgb.DMatrix(train[feature_columns].values, train[target_column].values)xgb.cv(param, dtrain, num_round, nfold=5,metrics={'error'}, seed = 0)

xgb.cv的参数的含义如下:

‘num_round’:最大迭代次数。
‘metric’:评价指标,一般用AUC。

  除了xgb自带的验证方法以外还有GridSearchCV交叉验证方法,后面会提到。然后进行添加预处理的交叉验证,即通过计算正负样本比调整样本的权重。

# 计算正负样本比,调整样本权重
def fpreproc(dtrain, dtest, param):label = dtrain.get_label()ratio = float(np.sum(label == 0)) / np.sum(label==1)param['scale_pos_weight'] = ratioreturn (dtrain, dtest, param)# 先做预处理,计算样本权重,再做交叉验证
xgb.cv(param, dtrain, num_round, nfold=5,metrics={'auc'}, seed = 0, fpreproc = fpreproc)

  在参数里面加了一个’scale_pos_weight’,可以在样本类别不平衡的时候加速收敛。
  下面再进行自定义损失函数与评估准则,这也是xgb的优势所在。

print ('running cross validation, with cutomsized loss function')
# 自定义损失函数,需要提供损失函数的一阶导和二阶导
def logregobj(preds, dtrain):labels = dtrain.get_label()preds = 1.0 / (1.0 + np.exp(-preds))grad = preds - labelshess = preds * (1.0-preds)return grad, hess# 自定义评估准则,评估预估值和标准答案之间的差距
def evalerror(preds, dtrain):labels = dtrain.get_label()return 'error', float(sum(labels != (preds > 0.0))) / len(labels)watchlist  = [(dtest,'eval'), (dtrain,'train')]
param = {'max_depth':3, 'eta':0.1, 'silent':1}
num_round = 5
# 自定义损失函数训练
bst = xgb.train(param, dtrain, num_round, watchlist, logregobj, evalerror)
# 交叉验证
xgb.cv(param, dtrain, num_round, nfold = 5, seed = 0,obj = logregobj, feval=evalerror)

  针对业务改写评价函数,这里的要求是要保证损失函数二阶可导,原因只要推导一遍xgboost公式就理解了,因为其中有一步用到泰勒展开的二阶项。
  此外,xgb还可以只用前n棵树进行预测,用到的参数是ntree_limit,不再赘述。

  了解完xgb进行建模之后,再看一下使用sklearn进行xgb建模的实例。这里使用了鸢尾花数据集合波士顿房价预测数据集分别进行分类和回归的学习。

import pickle
import xgboost as xgbimport numpy as np
from sklearn.model_selection import KFold, train_test_split, GridSearchCV
from sklearn.metrics import confusion_matrix, mean_squared_error
from sklearn.datasets import load_iris, load_digits, load_bostonrng = np.random.RandomState(31337)

分类:

#二分类:混淆矩阵
print("数字0和1的二分类问题")
digits = load_digits(2)
y = digits['target']
X = digits['data']
kf = KFold(n_splits=2, shuffle=True, random_state=rng)
print("在2折数据上的交叉验证")
for train_index, test_index in kf.split(X):xgb_model = xgb.XGBClassifier().fit(X[train_index],y[train_index])predictions = xgb_model.predict(X[test_index])actuals = y[test_index]print("混淆矩阵:")print(confusion_matrix(actuals, predictions))#多分类:混淆矩阵
print("\nIris: 多分类")
iris = load_iris()
y = iris['target']
X = iris['data']
kf = KFold(n_splits=2, shuffle=True, random_state=rng)
print("在2折数据上的交叉验证")
for train_index, test_index in kf.split(X):xgb_model = xgb.XGBClassifier().fit(X[train_index],y[train_index])predictions = xgb_model.predict(X[test_index])actuals = y[test_index]print("混淆矩阵:")print(confusion_matrix(actuals, predictions))

回归:


#回归问题:MSE
print("\n波士顿房价回归预测问题")
boston = load_boston()
y = boston['target']
X = boston['data']
kf = KFold(n_splits=2, shuffle=True, random_state=rng)
print("在2折数据上的交叉验证")
for train_index, test_index in kf.split(X):xgb_model = xgb.XGBRegressor().fit(X[train_index],y[train_index])predictions = xgb_model.predict(X[test_index])actuals = y[test_index]print("MSE:",mean_squared_error(actuals, predictions))

  接下来看一下如何利用网格搜索查找最优超参数。这种方法仅适用于使用sklearn接口建模,采用GridSearchCV方法。

#调参方法:使用sklearn接口的regressor + GridSearchCV
print("参数最优化:")
y = boston['target']
X = boston['data']
xgb_model = xgb.XGBRegressor()
param_dict = {'max_depth': [2,4,6],'n_estimators': [50,100,200]}clf = GridSearchCV(xgb_model, param_dict, verbose=1)
clf.fit(X,y)
print(clf.best_score_)
print(clf.best_params_)

  可以看到网格搜索结果,最大深度为2,100个估计器。网格调参的方法就是将参数及参数的取值放入一个字典中,然后作为GridSearchCV这个方法的参数。
  再看一下xgboost如何采用早停的参数停止树的增长。早停参数的调整适用于两种xgb建模方法。

# 第1/2种训练方法的 调参方法:early stopping
X = digits['data']
y = digits['target']
X_train, X_val, y_train, y_val = train_test_split(X, y, random_state=0)
clf = xgb.XGBClassifier()
clf.fit(X_train, y_train, early_stopping_rounds=20, eval_metric="auc",eval_set=[(X_val, y_val)])

  该方法在训练集上学习模型,一颗一颗树添加,在验证集上看效果,当验证集效果不再提升,停止树的添加与生长。可以看到第10棵树时就不再提高,所以early_stopping_rounds的最佳值为10。关于xgboost调参的方法可以网上找一篇教程看一下,方法都是一样的,看一遍就懂了,附上很久之前整理的调参的基本思路。

  最后再画图看一下特征的重要性。

iris = load_iris()
y = iris['target']
X = iris['data']
xgb_model = xgb.XGBClassifier().fit(X,y)print('特征排序:')
feature_names=['sepal_length', 'sepal_width', 'petal_length', 'petal_width']
feature_importances = xgb_model.feature_importances_
indices = np.argsort(feature_importances)[::-1]for index in indices:print("特征 %s 重要度为 %f" %(feature_names[index], feature_importances[index]))%matplotlib inline
import matplotlib.pyplot as plt
plt.figure(figsize=(16,8))
plt.title("feature importances")
plt.bar(range(len(feature_importances)), feature_importances[indices], color='b')
plt.xticks(range(len(feature_importances)), np.array(feature_names)[indices], color='b')

  xgboost特征重要性指标: weight, gain, cover,可以通过xgb_model.get_booster().get_score(importance_type=importance_type))中的importance进行设置。
  最后附上一个并行训练加速的代码,需要用到的时候再来看。

import osif __name__ == "__main__":try:from multiprocessing import set_start_methodexcept ImportError:raise ImportError("Unable to import multiprocessing.set_start_method."" This example only runs on Python 3.4")# set_start_method("forkserver")import numpy as npfrom sklearn.model_selection import GridSearchCVfrom sklearn.datasets import load_bostonimport xgboost as xgbrng = np.random.RandomState(31337)print("Parallel Parameter optimization")boston = load_boston()os.environ["OMP_NUM_THREADS"] = "2"  # or to whatever you wanty = boston['target']X = boston['data']xgb_model = xgb.XGBRegressor()clf = GridSearchCV(xgb_model, {'max_depth': [2, 4, 6],'n_estimators': [50, 100, 200]}, verbose=1,n_jobs=2)clf.fit(X, y)print(clf.best_score_)print(clf.best_params_)

【作者】:Labryant
【原创公众号】:风控猎人
【简介】:某创业公司策略分析师,积极上进,努力提升。乾坤未定,你我都是黑马。
【转载说明】:转载请说明出处,谢谢合作!~

Xgboost简易入门教程相关推荐

  1. layui个人中心html,Layui的简易入门教程

    layui是一款采用自身模块规范编写的前端UI框架,非常适合界面的快速开发.本篇文章给大家分享一下Layui的简易入门教程,介绍一下layui如何在你的项目中使用. 获得 layui 后,将其完整地部 ...

  2. Markdown 简易入门教程

    自己整理的 Markdown 简介.编辑器推荐.语法.特征等,是 Markdown 的简易入门教程 目录 概述 简介 官方文档 Markdown编辑器 初级语法 标题 粗体和斜体 段落和换行 分隔线 ...

  3. FL studio 20简易入门教程 -- 第四篇 -- 钢琴卷帘窗口与单轨乐器编辑界面

    钢琴卷帘窗口与单轨乐器编辑界面 本文经验主要来自于B站爱编曲网官方正版快速入门教程,链接如下: 爱编曲网官方正版快速入门教程 文章目录 钢琴卷帘窗口与单轨乐器编辑界面 前言 单轨乐器编辑界面 上方菜单 ...

  4. FL studio 20简易入门教程 -- 第九篇 -- 完整编曲流程

    技巧合集 本文经验主要来自于B站爱编曲网官方正版快速入门教程,链接如下: 爱编曲网官方正版快速入门教程 文章目录 技巧合集 前言 完整编曲流程 1.设置速度 2.内容录制 3.钢琴卷帘窗口编辑 4.设 ...

  5. mac os x使用Git简易入门教程

    该入门教程的流程是这样的: 什么是Git----------------->为什么选择Git----------------->如何安装Git到MAC OS X-------------- ...

  6. Gradle 简易入门教程

    作者: Yann 来源:原力注入 Gradle 是一种构建工具,它抛弃了基于XML的构建脚本,取而代之的是采用一种基于 Groovy(现在也支持 Kotlin)的内部领域特定语言. Gradle特点 ...

  7. 最新翻译的官方PyTorch简易入门教程(PyTorch1.0版本)

    "PyTorch 深度学习:60分钟快速入门"为PyTorch官网教程,网上已经有部分翻译作品,随着PyTorch1.0版本的公布,这个教程有较大的代码改动,本人对教程进行重新翻译 ...

  8. 【Magicavoxel简易入门教程】(二) 第二章 · 自制一个NPC导出模型优化工具使用(附下载)

    本文由@唐三十胖子出品,转载请注明出处.   文章链接:https://blog.csdn.net/iceSony/article/details/83793754 这篇文章由唐三胖ヾ(•ω•`)o网 ...

  9. 给萌新的Flexbox简易入门教程

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. [年末促销]葡萄城 2018 岁末福利火热放送中 原文出处:https://www.sitepoint.co ...

最新文章

  1. 虚拟机中的黑苹果系统经常卡死_程序员吐槽macOS 10.15系统:破坏SSH默认规则
  2. 如何基于 Notadd 构建 API (Laravel 写 API)
  3. Vue源码分析 - mvvm.js
  4. 【java笔记】类与对象(定义,创建,使用,标准的类,对象数组)
  5. C++编程学到什么程度可以面试工作?
  6. sqlserver 登录失败——孤立用户
  7. FoxBarcode(一维码生成库)使用教程
  8. synchronized实现原理之---Moniter的实现原理
  9. rsh服务配置主机无密码访问
  10. CVTE嵌入式应用开发长期实习生线上笔试+线上面试(一面)
  11. BT网站关了,正版电影数字发行在线收费下载 的机会?
  12. 子域名收集 -- Esd
  13. 《Python机器学习》基础代码
  14. p光圈和dc光圈的区别_什么是光圈?
  15. 基本运维及协同开发 :Linux基本使用
  16. 【C语言练习】1.1弹跳小球
  17. (转)Unity3D手游开发实践
  18. PM如何整合资源——来自项目管理群的讨论
  19. python主动抛出异常_主动抛异常
  20. 分分钟带你读懂 ButterKnife 的源码

热门文章

  1. 逆向链表c语言 abcdef,6-6 求单链表元素序号 (5 分)
  2. 电信机房服务器维修,数据中心机房,你不可不知的6大服务保障
  3. linux 内核 死锁 检查,一种linux内核自旋锁死锁检测报告系统和方法与流程
  4. java 中gui的作用_java学习中最应该注意的Java GUI用户界面以何为基础
  5. 计算机视觉编程——照相机模型
  6. android 获取其他布局,android listview onItemClick中获取其他item的布局
  7. python获取当前服务器ip_Python实现获取域名所用服务器的真实IP
  8. Leetcode 120. 三角形最小路径和 (每日一题 20210927)
  9. 重温强化学习之强化学习简介
  10. LeetCode面试刷题技巧-二分查找算法(下):通过 LeetCode 学习二分查找算法-销售价值减少的颜色球