XGBOOST + LR 模型融合 python 代码

本文介绍了一种常用的CTR预测方案——XGBoost+LR,通过XGBoost挖掘有效特征和特征组合,并利用LR进行最终预测。文章提供了完整的代码实现,包括如何自定义XGBoost的grid_search_cv函数以使用early_stop,以及如何根据训练好的XGBoost模型把数值特征转换为one-hot特征。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先留个广告,最近做一个数据挖掘的比赛,主要用的就是 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)
# 类别特
<think>好的,用户问为什么大数据处理中喜欢使用Python,我需要结合之前的对话来回答。之前用户问过Java爬虫的实现,现在转向Python在大数据中的应用。首先,用户可能对两种语言在不同场景下的优劣感兴趣,或者在做技术选型时需要参考。 我需要先分析Python在大数据中的优势。Python的简洁语法和丰富库可能是主要原因,比如Pandas、NumPy等。同时,生态系统的支持也很重要,比如PySpark、Dask这些框架。另外,Python在机器学习领域的广泛应用,可能也是大数据处理选择它的原因之一。 还要对比之前提到的Java,Java在性能和多线程上的优势,但Python在开发效率和易用性上更胜一筹。可能需要提到虽然Java性能好,但大数据处理中经常需要与机器学习结合,Python在这方面更有优势。此外,社区支持和工具链的成熟度也是因素。 用户可能还关心实际应用场景,比如数据清洗、分析、可视化等,Python有哪些具体工具。可能需要提到Jupyter Notebook在交互式分析中的作用,以及如何与Hadoop、Spark集成。 需要注意用户可能的背景,可能是开发者或数据分析师,想了解技术选型的原因。需要确保回答结构清晰,分点说明,同时对比Java,帮助用户全面理解。 另外,用户之前得到过Java爬虫的详细代码,可能对代码示例有期待,但这个问题更偏向于解释原因,所以可能需要更多理论解释,辅以库和框架的例子。 最后,确保回答符合系统级指令,使用中文,结构清晰,LaTeX格式正确,特别是行内公式用$...$,独立公式用$$...$$,但这个问题可能不需要太多公式,不过如果有涉及算法或数学的地方需要注意。</think>以下是关于大数据处理普遍采用Python的技术解析,结合其核心优势与典型应用场景进行说明: --- ### 一、Python数据处理核心优势 1. **语法生产力** - 动态类型系统与简洁语法提升开发效率 ```python # 列表推导式 vs Java循环 squares = [x**2 for x in range(10)] ``` - 交互式编程环境(Jupyter Notebook)加速数据探索 ![Jupyter界面示例](https://example.com/jupyter_screenshot.jpg) 2. **数学计算生态** | 库名称 | 功能定位 | 性能优化机制 | |------------|-------------------------|---------------------| | NumPy | 多维数组运算 | C语言核心+向量化操作 | | Pandas | 结构化数据分析 | 列式存储优化 | | SciPy | 科学计算算法 | Fortran/C扩展库 | 3. **分布式计算支持** - **PySpark**:通过DataFrame API操作Spark集群 ```python df = spark.read.json("hdfs://data/logs") df.groupBy("category").count().show() ``` - **Dask**:实现单机伪分布式计算 $$ \text{处理速度} \propto \frac{\text{数据量}}{\text{CPU核心数}} $$ --- ### 二、与Java的对比分析 | 对比维度 | Python优势领域 | Java适用场景 | |---------------|---------------------------------------|-----------------------------| | 开发效率 | 快速原型开发(REPL环境) | 需要严格类型检查的生产系统 | | 学习曲线 | 初学者友好(直观语法) | 需掌握OOP复杂概念 | | 计算性能 | 依赖C扩展(如NumPy) | 原生JVM性能优势 | | 机器学习整合 | TensorFlow/PyTorch直接支持 | 需通过DL4J等桥接框架 | | 可视化能力 | Matplotlib/Seaborn丰富图表类型 | 依赖第三方库(JFreeChart等) | --- ### 三、典型大数据处理链路 ```mermaid graph LR A[数据采集] --> B{Python预处理} B -->|Pandas清洗| C[特征工程] C --> D[Spark集群计算] D --> E[ML模型训练] E --> F[Tableau可视化] ``` 1. **数据清洗阶段** ```python # 处理缺失值示例 df.fillna({ 'age': df['age'].median(), 'income': df['income'].mode()[0] }, inplace=True) ``` 2. **特征工程阶段** - 使用Scikit-learn管道: ```python from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler pipe = Pipeline([ ('scaler', StandardScaler()), ('dim_reduction', PCA(n_components=2)) ]) ``` 3. **分布式计算场景** - 在PySpark中实现MapReduce: ```python rdd = sc.parallelize(range(1,1000)) sum_rdd = rdd.map(lambda x: x*2).reduce(lambda a,b: a+b) ``` --- ### 四、性能优化策略 1. **混合编程方案** - 关键路径代码用Cython编译: ```cython # 计算素数Cython实现 def primes(int kmax): cdef int n, k, i cdef int p[1000] result = [] if kmax > 1000: kmax = 1000 # ...C语言级循环计算... return result ``` 2. **内存管理技巧** - 使用Pandas分类类型节省内存: ```python df['category'] = df['category'].astype('category') ``` - 分块处理大型文件: ```python chunk_iter = pd.read_csv('bigfile.csv', chunksize=100000) for chunk in chunk_iter: process(chunk) ``` --- ### 五、行业应用案例 1. **金融风控系统** - 使用PySpark处理TB级交易日志 - 通过XGBoost实时检测异常交易模式 $$ P(\text{欺诈}|X) = \frac{1}{1+e^{-(\beta_0 + \sum \beta_i x_i)}} $$ 2. **物联网数据分析** - 用Dask处理传感器时序数据 - 实现实时温度异常预警: ```python if (current_temp > μ + 3σ) & (rising_rate > threshold): trigger_alarm() ``` --- ### 六、发展趋势 1. **新兴技术融合** - 基于Python的GPU加速库(CuPy, RAPIDS) - 与Web框架整合(Dash构建数据分析面板) 2. **性能瓶颈突破** - 通过PyPy提升解释器速度(JIT编译) - 使用Numba加速数值计算: ```python @numba.jit(nopython=True) def monte_carlo_pi(nsamples): acc = 0 for _ in range(nsamples): x = random.random() y = random.random() if (x**2 + y**2) < 1.0: acc += 1 return 4.0 * acc / nsamples ``` --- **总结建议**: 当处理流程包含大量探索性分析、需要快速迭代算法原型,或需深度整合机器学习时,Python是更优选择。而对于需要极致性能、强类型安全的底层数据处理系统,可考虑采用Java/C++实现核心模块,再通过Python进行上层集成。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值