XGBOOST + LR (XGBOOST grid search)
先留个广告,最近做一个数据挖掘的比赛,主要用的就是 xgboost,等比赛完后年前好好整理代码开源,到时候代码会比下面整份完整。
XGBOOST + LR 是 CTR 常用的一种方式。下面是实现 XGBOOST + LR 的代码,具体的原理不做细说。有了下面的代码框架,你可以对 xgboost 进行参数优化搜索,同时可以利用 xgboost 把数值型特征转为 one-hot 特征给 LR 进行训练。
在 xgboost 直接调用 sklearn 的 grid search 函数时,没有办法使用 early stop。使用 early stop 很有帮助,一方面能够避免过拟合,另一方面能够节省不少时间,所以可以直接写个函数替代 grid search。下面代码中实现是逐个参数搜寻,逐个找到最优参数,实际上没有 grid search, 但是效果一般不会太差,而且省下很多时间。后面的代码将按照下面的4个部分进行展开。
- 1.分开数值特征与类别特征
- 2.自定义 xgb_grid_search 函数
- 3.利用最优的 xgb 模型把数值特征转为类别特征
- 4.将新特征和原始的类别特征一块训练 LR 模型进行最后的预测
最重要的有几个点:
- 怎样自定义 xgboost 的 grid_search_cv 函数,使得能够使用 early_stop
- 怎样根据训练好的 xgboost 模型,把数值特征转为 one-hot 特征(就是得到叶子结点的 one-hot 编码)
# -*- coding:utf-8 -*-
from __future__ import print_function
from __future__ import division
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import GridSearchCV
import xgboost as xgb
from xgboost.sklearn import XGBClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.datasets import load_svmlight_file
from sklearn.preprocessing import OneHotEncoder
import sys
sys.path.append('../..')
import time
import my_utils
1.导入数据
我的数据格式是 libsvm 格式的,如果其他格式的数据需要自己修改一下就行了。
# 特征名
column_names = ['0', '1', '2', '3', '4',
'5', '6', '7','8', '9',
'10', '11', '12', '13',
'14', '15', '16', '17',
]
data = load_svmlight_file('your_libsvm_data')
features = data[0].toarray()
labels = data[1]
print('features.shape=%s' % str(features.shape))
print('labels.shape=%s' % str(labels.shape))
features.shape=(73600, 18)
labels.shape=(73600,)
分开类别特征和数值特征
首先把数值特征和类别特征分开,我只把数值特征输入 xgboost 中进行训练,当然也可以把类别特征一块输进去训练。
df_data = pd.DataFrame(features, columns=column_names)
# 类别特