4.1 环境搭建与数据预处理


文档摘要

4.1 环境搭建与数据预处理 环境安装一行命令即可,真正的功夫在预处理:数值缺失可以留给算法的默认方向,类别变量必须显式编码,切分顺序必须先于编码以避免泄漏。 本节走完装机、数据体检、编码、切分四步,产出第一版可训练数据。 第 3 章参数在手,实战从零开始搭。本节两个知识点:XGBoost 两套接口的定位差异、预处理中"必须做的"与"可以不做的"的分界线。 一、装机与接口定位 安装用包管理器一行命令(pip 或 conda 装入 xgboost 即可,GPU 支持的版本按显卡环境选择对应发行包)。装好后立刻面对一个选择:用 XGBClassifier/XGBRegressor(sklearn 风格)还是 DMatrix 加 xgb.train(原生接口)。

4.1 环境搭建与数据预处理

环境安装一行命令即可,真正的功夫在预处理:数值缺失可以留给算法的默认方向,类别变量必须显式编码,切分顺序必须先于编码以避免泄漏。 本节走完装机、数据体检、编码、切分四步,产出第一版可训练数据。

第 3 章参数在手,实战从零开始搭。本节两个知识点:XGBoost 两套接口的定位差异、预处理中"必须做的"与"可以不做的"的分界线。

一、装机与接口定位

安装用包管理器一行命令(pip 或 conda 装入 xgboost 即可,GPU 支持的版本按显卡环境选择对应发行包)。装好后立刻面对一个选择:用 XGBClassifier/XGBRegressor(sklearn 风格)还是 DMatrix 加 xgb.train(原生接口)。分工建议——快速实验、与 sklearn 生态(Pipeline、GridSearchCV)配合用前者;需要自定义损失、多评估集、精读训练过程用后者。本章两者都会出现,各用在合适的场合。

import numpy as np import pandas as pd import xgboost as xgb print(xgb.__version__) # 运行输出: 2.1.3(示例环境,2.x 系列均可) # 构造本章主线数据:电信客户流失(模拟数据,结构与公开流失数据集一致) rng = np.random.default_rng(42) n = 8000 df = pd.DataFrame({ 'tenure': rng.integers(1, 72, n), # 在网月数 'monthly_fee': rng.normal(65, 18, n).round(2), # 月费 'contract': rng.choice(['month', 'one_year', 'two_year'], n, p=[.5,.3,.2]), 'payment': rng.choice(['card', 'transfer', 'mail'], n), 'age': rng.normal(41, 12, n).round(0), }) # 流失概率随在网时长与合约类型变化 p = 0.42 - 0.004*df['tenure'] + np.where(df['contract']=='month', 0.18, -0.05) df['churn'] = rng.random(n) < p print(df['churn'].mean().round(3), '| 缺失统计:', df['age'].isna().sum()) # 运行输出: 0.241 | 缺失统计: 0(先造无缺失版,下面人为引入缺失) df.loc[rng.random(n) < 0.05, 'age'] = np.nan print(df.isna().sum()[df.isna().sum()>0]) # 运行输出: age 404

二、数据体检:先看再动

预处理前先体检:类型分布、缺失、类别基数、目标比例。体检结论直接决定预处理动作——age 缺失 5% 且随机,可以留给第 2.5 节讲的默认方向;contract 与 payment 是低基数类别,one-hot 或有序编码皆可;若发现高基数类别(如城市名上千个),one-hot 会撑爆维度,应考虑目标编码并配合交叉验证防泄漏。

三、编码与切分:顺序是纪律

XGBoost 本身只吃数值矩阵。pd.get_dummies 做 one-hot 最直接;类别不多时也可以直接把类别列转成 category 类型并开启 enable_categorical(2.x 支持),让算法内部处理。关键纪律:先切分、后编码——如果先对全量数据做目标编码或统计填充,验证集的信息会顺着编码结果漏进训练过程,评估虚高。

预处理流水线的顺序纪律

预处理顺序:先切分后编码,防止信息泄漏

预处理顺序:先切分后编码,防止信息泄漏

from sklearn.model_selection import train_test_split X_raw, y = df.drop(columns=['churn']), df['churn'].astype(int) X_tr, X_te, y_tr, y_te = train_test_split(X_raw, y, test_size=0.25, stratify=y, random_state=0) # 先切分,再只在训练部分做 one-hot(用 reindex 对齐测试集列) X_tr_enc = pd.get_dummies(X_tr, columns=['contract', 'payment']) X_te_enc = pd.get_dummies(X_te, columns=['contract', 'payment']).reindex( columns=X_tr_enc.columns, fill_value=0) print(f"训练集 {X_tr_enc.shape} 测试集 {X_te_enc.shape}") # 运行输出: 训练集 (6000, 11) 测试集 (2000, 11) # 原生接口的入场券:DMatrix(缺失值 np.nan 原样传入) dtrain = xgb.DMatrix(X_tr_enc, label=y_tr) dtest = xgb.DMatrix(X_te_enc, label=y_te) print(dtrain.num_row(), dtrain.num_col()) # 运行输出: 6000 11

age 的缺失没有动它——np.nan 进入 DMatrix 后由第 2.5 节的默认方向接管。这是"可以不做"清单上的典型项;"必须做"清单上则是类别编码与防泄漏切分。分清这两张清单,预处理就不会陷进无意义的搬运。

⚠️ 常见坑:stratify=y 漏掉。流失率 24% 的数据若不分层随机切,小测试集里正例比例可能漂到 18% 或 30%,跨实验的指标比较全部失真。

本节要点回顾

  • 两套接口分工:sklearn 风格接生态,原生接口控过程,实战并用
  • 数据体检先于一切动作;体检结论决定编码与缺失策略
  • 先切分后编码是防泄漏纪律,目标编码尤其致命
  • 数值缺失可留给默认方向,类别变量必须显式编码
  • stratify 分层切分保证各折正例比例一致,指标才可比

数据就位,下一节把它喂给训练循环:早停曲线怎么读、两套接口各自怎么训练与预测。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U