python:利用xgboost对美国成人收入进行分类

xgboost模型+实例

本文讲述的是xgboost在分类方面的应用,并通过实例进行演示。

1. XGBoost模型简介

XGBoost(eXtreme Gradient Boosting)通过回归树的分裂结点对于平方损失函数拟合残差;或者对于一般损失函数(梯度下降),拟合残差的近似值,按照分裂结点划分时枚举所有特征的值,选取划分点,根据一阶导数g_i和二阶导数h_i,迭代生成基学习器,相加更新学习器,最后预测的结果是每棵树的预测结果相加。简而言之,通过机器学习,划分训练集和测试集,通过模型训练以及测试集检验得到最优结果。

2. XGBoost模型的参数与数学形式

(1)Python中XGBoost模型的参数

这里的参数指python xgboost库中所含的部分我认为重要的参数

① nthread: 计算机进行并行运算时所调用的cpu 总线程数,
② gamma: XGBoost模型用于控制后剪枝的参数, γ的取值越大则对模型的优化越保守,一般情况下γ=0.1或γ=0.2,
③ max_depth:构建树的深度,深度越大越容易过拟合,
④ lambda: 控制XGBoost模型复杂度的权重值的L_2的正则化项参数,当λ越大时模型就越不容易出现过拟合的情况,
⑤ eta: 学习率,

(2)XGBoost模型的数学形式

对于f_t (x)把决策树拆分成结构部分q和叶子权重部分w。结构函数q将输入映射到叶子的索引号上面去,而w给定了每个索引号对应的叶子分数是什么。
f_t (x)=w_q (x)
Ω(f_t )函数定义复杂度包含了一棵树节点的个数,以及每个树叶子节点上面输出分数的L_2模平方。
Ω(f_t )=γT+1/2 λΣ_(j=1)^T w_j^2
γ:叶子的个数 λ:w的L_2模平方
在这种新的定义下,我们可以把目标函数进行如下改写,其中I被定义为每个叶子上面样本集合 ,g是一阶导数,h是二阶导数。
I_j={├ ⅈ┤|q(x_i )=j}
这时,目标函数可以改写为:
Obj(T)= Σ_(j=1)^TT[Gjwj+(Hj+1/2 λ) w_j^2]+γT

3. XGBoost模型建立的基本步骤

(1).通过Python把数据集拆分成训练集和测试集;
(2). 利用XGBoost模型拟合数据,并对测试集做预测;
(3). 通过计算解释方差、拟合优度R^2、均方误差MSE等指标评估预测结果;

4.实例分析

(1)分析思路

首先利用get_dummies()函数将文本类型的特征转换为数值型用于拟合模型,然后剔除掉fnlwgt项。利用crosstab()函数分析受教育程度和年收入的关系,并通过决策树方法和XGboost算法对数据进行分类,并计算其测试集分类准确率、召回率以及将决策树可视化。

US Adult Income是非常经典的数据集,相较于传统的分类方式,xgboost具有更高的分类精度,接下来我们依靠US Adult Income.csv数据集来实现xgboost模型。

(2)代码实现

import os
import pandas as pd
import numpy as np
from sklearn import tree
from sklearn.metrics import accuracy_score,classification_report
import pydotplus
from xgboost import plot_importance
from xgboost.sklearn import XGBClassifier
from matplotlib import pyplot as plt
os.chdir('d:\\workpath')
income=pd.read_csv('adult-income.csv')
#查看受教育程度和年收入的关系
income_education=pd.crosstab(income['Y'],income['education'])
income=income.drop('fnlwgt',axis=1)
#将文本转换为数值型用于拟合模型
income_=pd.get_dummies(income,columns=['relationship','sex','martital','workclass',
                        'education','native_country','occupation','race'])
income_['Y'].replace(' <=50K','0',inplace=True)
income_['Y'].replace(' >50K','1',inplace=True)
#抽取75%的数据作为训练集,剩余的25%作为测试集
train=income_.sample(frac=0.75)
test=income_[~income_ .index.isin(train.index)]
xtrain,ytrain=train.drop('Y',axis=1),train['Y']
xtest,ytest=test.drop('Y',axis=1),test['Y']
#利用决策树进行分类
for i in range(3,16):
    mdl_tree=tree.DecisionTreeClassifier(max_depth=i)
    mdl_tree.fit(xtrain,ytrain)
    yhat=mdl_tree.predict(xtrain)
    ypred=mdl_tree.predict(xtest)
    print('max_depth={}'.format(i))
    print(accuracy_score(ytrain,yhat))
    print(accuracy_score(ytest,ypred))
    print(classification_report(ytest,ypred))
mdl_tree=tree.DecisionTreeClassifier(max_depth=3)
mdl_tree.fit(xtrain,ytrain)

#利用xgboost 分类
#算法参数
model= XGBClassifier(
learning_rate= 0.1, #学习率
max_depth=10, # 构建树的深度,越大越容易过拟合
gamma=0.1,  # 树的叶子节点上作进一步分区所需的最小损失减少,越大越保守,一般0.1、0.2这样子。
seed=24 #随机种子
)
model.fit(xtrain, ytrain)
# 对测试集进行预测
ypred= model.predict(xtest)
#计算准确率
score =accuracy_score(ytest,ypred)
print(score)
print(classification_report(ytest,ypred))
#显示重要特征
plot_importance(model,max_num_features=6)
plt.show()

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值