参考代码来自:Explore and run machine learning code with Kaggle Notebooks | Using data from Two Sigma Connect: Rental Listing Inquirieshttps://www.kaggle.com/code/sudalairajkumar/xgb-starter-in-python/notebook

第一次接触xgboost,在前人的肩膀上开始自己的探索~文中代码是参考代码上略作调整,不一定正确,因为设备原因无法把自己的完整代码拷贝过来,只做一个自己的学习记录(是总结,没什么代码)

1.项目背景

大学生借贷款这个情景下,会有按时还款(好帐)或者拖欠不还(坏账)两种情况。要对贷款人进行判断,预测是否会出现赖账情况。

2.数据获取

已有两份数据,train与predict。数据集train是训练集,predict是测试集,也是最后用来预测评分的数据集。

3.探索性数据分析

这篇参考文档十分有用:

Exploratory analysis of Two Sigma Connect: Rental Listing Inquiries — pydata

value_counts / data.describe() 统计数据。发现部分数据缺失值过大【查看缺失值:df.isnull().sum()】/分布异常。

数据集中有数值型数据与categories类别型数据。

4.数据清洗

1)客户id中并不包含有效信息,于是删去。有的场景下数据集客户id是包含有效特征的,但这个场景下的id只是编号,并无用处;

2)对数据进行shuffle,消除潜在的连续数值影响。

3)数据缺失处理,fillna 或 sklearn.impute.SimpleImputer方法进行填充。部分特征数值缺失值超过70%,删除这个特征。

4)数值特征不需要处理。进行strip等操作删除数值前后的空格或字符。

5)类别特征转为数值特征,可采用one-hot独热编码或labelencoder方法。xgboost分类并不适用于onehot编码(之后填充),我这里采用labelencoder编码。

5.特征工程

#读取数据为DataFrame格式train_df = pd.read_csv(train_file)
predict_df = pd.read_csv(predict_file)
print(train_df.shape)
print(predict_df.shape)

数值特征的保留与非数值特征的转换:有额外信息的非数值变量转化为对应的数值。删除稀疏特征:空值/同一值占绝大比例的列。使用中位数填充空值,通常数据分布不对称时,中位数比平均数更能保持排序关系。

#feature_to_use中是在特征处理后将要用到的特征
features_to_use  = ["feature_name", "feature_name", "feature_name", "feature_name"]

建立特征数据和标签数据,进行数据集拆分。在数据集中,客户编号在训练集和测试集中没有重合部分,也不涉及分行编号,意义不大,遂删除之。

xgb不能够处理分类特征,labelencoder编码将特征编码为数值。因为xgb对缺失值不敏感,删除了缺失值处理。注意有的特征虽然看起来是数值,但因为前后包含字符,是string类型,注意辨别处理。

#转换成数值特征
categorical = ["feature1", "feature2", "feature3"]
for f in categorical:if train_df[f].dtype=='object':#print(f)lbl = preprocessing.LabelEncoder()lbl.fit(list(train_df[f].values) + list(prdict_df[f].values))train_df[f] = lbl.transform(list(train_df[f].values))test_df[f] = lbl.transform(list(predict_df[f].values))features_to_use.append(f)

有部分类别特征是string格式,但是其中包含类别编号特征(如4_8~9万,5_9-10万),split分割出编号作为特征,取名加入feature_to_use列表中,删除剩余部分。

features_to_use = ["feature1","feature2","feature3","feature4","feature5",......]

(事实上我建立baseline模型之后先全量数据跑了一遍)

将train和predict数据集的 特征feature  与 标签label 分离,获得train_X(训练集特征), train_y(数据集标签), test_X(测试集特征), test_y(测试集标签).

6.构建xgboost分类模型

几个要素:param参数设置,二分类objective目标函数设置为‘multi:softprob'(输出分类概率)或'multi:softmax’(输出分类结果)。一般来说输出分类默认阈值0.5,但是这当然可以改(uhuh

eta:学习率,每一步迭代的步长

max_depth:树的最大深度(tomark),越大,模型学习的更加具体

num_class:分类数量,这里设置为3但是没问题,xgb自己会调成2

eval_metric:评估函数,应用evals进行评估操作,不参与训练,只输出模型评估效果

多分类和二分类的参数区别是损失函数和评价函数,多分类更换为'multiclass''multi_logloss',必须还要指定类别数:'num_class'

xgboost有自己特别的数据格式DMatrix,在原生接口风格下会采用这种数据格式,速度更快。训练过程中如果要查看评估指标可以使用watchlist。

还有sklearn接口风格:

机器学习之XGBoost分类器XGBClassifier-- xgb使用sklearn接口_木里先森的博客-CSDN博客_xgb分类

model=XGBClassifier(**params)

sklearn接口风格采用fit()方法,打印训练过程中输出评估数值可以使用eval_set = [(X,y)].

runXGB函数。定义参数、训练。

#设置xgboost运行函数,输入训练集、测试集
#设置参数,评估函数为mlogloss,目标函数为multi:softprob
def runXGB(train_X, train_y, test_X, test_y=None, feature_names=None, seed_val=0, num_rounds=1000):param = {}#multi:softprob与multi:softmax的区别是,#前者输出每一类别的概率,后者输出分类标签结果,两者在概率阈值为50%时结果相同param['objective'] = 'multi:softprob'param['eta'] = 0.1param['max_depth'] = 6param['silent'] = 1param['num_class'] = 3param['eval_metric'] = "mlogloss"param['min_child_weight'] = 1param['subsample'] = 0.7param['colsample_bytree'] = 0.7param['seed'] = seed_valnum_rounds = num_roundsplst = list(param.items())xgtrain = xgb.DMatrix(train_X, label=train_y)if test_y is not None:xgtest = xgb.DMatrix(test_X, label=test_y)watchlist = [ (xgtrain,'train'), (xgtest, 'test') ]model = xgb.train(plst, xgtrain, num_rounds, watchlist, early_stopping_rounds=20)else:xgtest = xgb.DMatrix(test_X)model = xgb.train(plst, xgtrain, num_rounds)pred_test_y = model.predict(xgtest)return pred_test_y, model

k折交叉验证。在训练集中取出五折的索引,分别构建训练、验证集小样本

#进行k折交叉验证,不平衡样本集进行5折多次训练cv_scores = []
kf = model_selection.KFold(n_splits=5, shuffle=True, random_state=2016)
for dev_index, val_index in kf.split(range(train_X.shape[0])):dev_X, val_X = train_X.iloc[dev_index], train_X.iloc[val_index]dev_y, val_y = train_y.iloc[dev_index], train_y.iloc[val_index]preds, model = runXGB(dev_X, dev_y, val_X, val_y)cv_scores.append(log_loss(val_y, preds))
print(cv_scores)

预测,保存结果

preds, model = runXGB(train_X, train_y, test_X, num_rounds=400)
out_df = pd.DataFrame(preds)
out_df.columns = ["class1","class2"]
out_df["listing_id"] = test_df.listing_id.values
out_df.to_csv("xgb_starter2.csv", index=False)

7.模型评估

xgboost 多分类:objective参数(reg:linear,multi:softmax,multi:softprob)对比分析_phyllisyuell的博客-CSDN博客_reg:linear

由于样本数据集不平衡,标签Y与标签N比例是1:10. auc在Y标签分类都错误时也高达90%,所以采用混淆矩阵及相关指标(TN/TP/FN/FP/recall/……)作为评估方法,并输出特征重要度(feature_importances_去查看特征的重要度)。在实际情况中,需要①分类尽量准确,②将坏人预测为好人的情况相对尽可能少。

8.模型优化

GridSearchCV.grid_scores_和mean_validation_score报错_allein_STR的博客-CSDN博客

对不平衡数据集进行处理。

数据重采样:欠采样、过采样,scale_pos_weight(调整小比例样本权重,相当于过采样)

straightkfold - k折交叉验证。分成k-1的训练集和1份测试集,训练模型。

xgb.cv与sklearn中的交叉验证:对比XGBoost.cv和sklearn中的交叉验证_schdut的博客-CSDN博客写在前面:已经很久很久很久没有发博客了,有点愧疚还有点难过,哎。。。XGBoost有两种接口:原生接口,比如xgboost.train,xgboost.cvsklearn接口,比如xgboost.XGBClassifier,xgboost.XGBRegressor两种接口有些许不同,比如原生接口的学习率参数是eta,sklearn接口的是learning_rate,原生接口要在tr...https://blog.csdn.net/shengchaohua163/article/details/105100151

cv_scores = []
kf = model_selection.KFold(n_splits=5, shuffle=True, random_state=2016)
for dev_index, val_index in kf.split(range(train_X.shape[0])):dev_X, val_X = train_X[dev_index,:], train_X[val_index,:]dev_y, val_y = train_y[dev_index], train_y[val_index]preds, model = runXGB(dev_X, dev_y, val_X, val_y)cv_scores.append(log_loss(val_y, preds))print(cv_scores)break

参数调整:网格搜索/随机搜索/贝叶斯优化/

调参的通用方法:

Xgboost参数调优的完整指南及实战_吐泡泡的璐璐的博客-CSDN博客_xgboost参数调优

Xgboost建模,sklearn评估,分类问题用混淆矩阵,回归问题用MSE_缘 源 园的博客-CSDN博客

1.选择一个相对较高的学习率,设定调参估计量。通常来说学习率设置为0.1。但是对于不同的问题可以讲学习率设置在0.05-0.3。
2.当确定好学习率,调整树的某些特定参数。比如:max_depth, min_child_weight, gamma, subsample, colsample_bytree
3.调整正则化参数 ,比如: lambda, alpha。这个主要是为了减少模型复杂度和提高运行速度的。适当地减少过拟合。
4.降低学习速率,选择最优参数

param_test1 = {'max_depth':list(range(3,10,2)),'min_child_weight':list(range(1,6,2))
}
gsearch1 = GridSearchCV(estimator = XGBClassifier( learning_rate =0.1, n_estimators=20, max_depth=5,min_child_weight=1, gamma=0, subsample=0.8, colsample_bytree=0.8,objective= 'binary:logistic', nthread=4, scale_pos_weight=1, seed=27), param_grid = param_test1, scoring='roc_auc',n_jobs=4,iid=False, cv=5)
gsearch1.fit(train[predictors],train[target])
scores = gsearch1.cv_results_['mean_test_score']
best_param = gsearch1.best_params_
best_score = gsearch1.best_score_

输出调参结果和最优参数,参考这个:

GridSearchCV.grid_scores_和mean_validation_score报错_allein_STR的博客-程序员秘密 - 程序员秘密
最终的结果,在F1上上升了0.01,召回率上升了,精确度有所下降。

调优只能说是锦上添花,还是要看特征工程等因素。

9.其他:

同时我尝试了lightGBM。

大体和XGB相差不多,在部分参数和数据格式(Dataset格式)上有所区别。

LightGBM参数介绍_一路前行1的博客-CSDN博客_lightgbm参数

Feature Engineering & LightGBM | Kaggle

【lightgbm, xgboost, nn代码整理一】lightgbm做二分类,多分类以及回归任务(含python源码)_QLMX的博客-CSDN博客_lightgbm回归代码机器学习:lightgbm(实战:分类&&回归) - 掘金

lightgbm 进行二分类 - MiQing4in - 博客园

lgb小结 - 知乎

顺便这是一个kaggle赛题xgb代码复现,写得很好,可以作为阅读材料:kaggle支付反欺诈:IEEE-CIS Fraud Detection第一名方案复现过程(有代码) - 知乎

踩过的坑:

数据没有shuffee,连续变量影响太大

填充和替换特征之后,没有更新到dataframe上

特征不平衡评估函数不能看auc

imputer填充缺失值

labelencoder不处理NAN值方法

lgb数据格式不同于xgb

不同接口风格

xgboost坏账预测(二分类问题)相关推荐

  1. xgboost处理二分类问题原理

    博主最近为了准备校招猛看有关gbdt的算法细节,有一个百思不得其解的疑惑,就是xgboost在处理二分类问题时,返回的预测值是0~1之间的概率值,莫非和logistic function有关? 最终, ...

  2. ML之xgboost:利用xgboost算法对breast_cancer数据集实现二分类预测并进行graphviz二叉树节点图可视化

    ML之xgboost:利用xgboost算法对breast_cancer数据集实现二分类预测并进行graphviz二叉树节点图可视化 目录 实现结果 实现代码 实现结果

  3. ML之xgboost:基于xgboost(5f-CrVa)算法对HiggsBoson数据集(Kaggle竞赛)训练实现二分类预测(基于训练好的模型进行新数据预测)

    ML之xgboost:基于xgboost(5f-CrVa)算法对HiggsBoson数据集(Kaggle竞赛)训练实现二分类预测(基于训练好的模型进行新数据预测) 目录 输出结果 设计思路 核心代码 ...

  4. ML之xgboost:基于xgboost(5f-CrVa)算法对HiggsBoson数据集(Kaggle竞赛)训练(模型保存+可视化)实现二分类预测

    ML之xgboost:基于xgboost(5f-CrVa)算法对HiggsBoson数据集(Kaggle竞赛)训练(模型保存+可视化)实现二分类预测 目录 数据集简介 输出结果 设计思路 核心代码 数 ...

  5. ML之xgboost:利用xgboost算法(自带,特征重要性可视化+且作为阈值训练模型)训练mushroom蘑菇数据集(22+1,6513+1611)来预测蘑菇是否毒性(二分类预测)

    ML之xgboost:利用xgboost算法(自带,特征重要性可视化+且作为阈值训练模型)训练mushroom蘑菇数据集(22+1,6513+1611)来预测蘑菇是否毒性(二分类预测) 目录 输出结果 ...

  6. ML之xgboost:利用xgboost算法(sklearn+GridSearchCV)训练mushroom蘑菇数据集(22+1,6513+1611)来预测蘑菇是否毒性(二分类预测)

    ML之xgboost:利用xgboost算法(sklearn+GridSearchCV)训练mushroom蘑菇数据集(22+1,6513+1611)来预测蘑菇是否毒性(二分类预测) 目录 输出结果 ...

  7. ML之xgboost:利用xgboost算法(sklearn+7CrVa)训练mushroom蘑菇数据集(22+1,6513+1611)来预测蘑菇是否毒性(二分类预测)

    ML之xgboost:利用xgboost算法(sklearn+7CrVa)训练mushroom蘑菇数据集(22+1,6513+1611)来预测蘑菇是否毒性(二分类预测) 目录 输出结果 设计思路 核心 ...

  8. ML之xgboost:利用xgboost算法(sklearn+3Split+调参曲线+EarlyStop)训练mushroom蘑菇数据集(22+1,6513+1611)来预测蘑菇是否毒性(二分类预测)

    ML之xgboost:利用xgboost算法(sklearn+3Spli+调参曲线+EarlyStop)训练mushroom蘑菇数据集(22+1,6513+1611)来预测蘑菇是否毒性(二分类预测) ...

  9. ML之xgboost:利用xgboost算法(sklearn+3Split+调参曲线)训练mushroom蘑菇数据集(22+1,6513+1611)来预测蘑菇是否毒性(二分类预测)

    ML之xgboost:利用xgboost算法(sklearn+3Split+调参曲线)训练mushroom蘑菇数据集(22+1,6513+1611)来预测蘑菇是否毒性(二分类预测) 目录 输出结果 设 ...

最新文章

  1. 做了个第三方NTFS软RAID
  2. HBase的安装与使用
  3. python智能识别_Python人工智能识别文字内容(OCR)
  4. Java面试题40道
  5. python控制其它软件_从另一个脚本控制python脚本
  6. Eratosthenes筛
  7. Python爬取Boss直聘,帮你获取全国各类职业薪酬榜
  8. android sp缓存,Android sharedPreference设置缓存时间
  9. python与office结合可以干什么-python与office(一)
  10. 10)-MySQL数据库基础练习(答案版)
  11. EditPlus 3设置字体大小
  12. 苹果手机还原网络设置会怎样_如果你的苹果手机信号不好!要记得这样设置,让你信号轻松满格...
  13. WPS中用mathtype插入公式的方法
  14. 薪酬管理系统功能描述文档
  15. 使用certbot-auto脚本安装Certbot 生成https证书
  16. IE中自动安装根证书
  17. 三种方法打印九九乘法表
  18. Cross Site Tracing (XST) Attacks
  19. AndroidO SystemUI-QuickSettings
  20. 如何让Echarts地图只显示某个省、市、区

热门文章

  1. 热爱生活,热爱学习!
  2. 以太网交换机的自学习
  3. Unity Shader之几何着色器(Geometry Shader)实现面片飞散的爆炸效果
  4. Nodejs 环境配置
  5. php qq对话,PHP WEB版QQ多人聊天
  6. 超长docker笔记
  7. 轻卡板簧设计(论文+CAD图纸+CATIA三维图+SW图纸)
  8. 米哈游新游正式公测!还没上线就已经“爆了”!
  9. 微信小程序--页面传值
  10. 如何理解准确率(accuracy)和查准率(Precision)和召回率(Recall)