基于xgboost的分类预测

一、xgboost的介绍

xgboost以及后续的lightGBM等在我的认知中算是目前数据挖掘中最常用的预测算法,在各种数据挖掘比赛中获得了Top的名次。如果想从事数据挖掘相关的岗位,该算法是一定要好好掌握的。

xgboost其实可以认为是GBDT算法的工程实现,GBDT的全名是Gradient Boosting Decision Tree,就是梯度提升树。该算法的逻辑是:首先训练一颗树,然后计算出每个样本的误差(也叫梯度),通过去拟合误差训练下一颗树,一直拟合直到训练结果符合要求。下图是GBDT算法的步骤图。

xgboost虽然大家都说是GBDT的工程实现,但是在很多地方都是做了不少优化的:

1、目标函数的二阶泰勒展开

xgboost与GBDT都是每一步都只优化当前模型,然后将所有模型加起来:

F_m(x_i)=F_{m-1}(x_i)+f_m(x_i)

目标函数为:

Obj=\sum_{i=1}^n L[F_m(x_i),y_i]+\sum_{j=1}^m {\Omega} (f_j)

其中𝐿为损失函数,  $F_m(x_i)$  是所有树的累加结果。  ${\Omega} (f_j)$  是每棵树的正则项(xgb引入了正则项,因此目标函数加上了结构化风险)。


与GBDT的一阶不同,xgboost采用了二阶展开,这其实就是优化算法的改进,同时拟合一阶误差和二阶误差有利于提升精度。
二阶展开:


$f(x_0+\Delta x)\approx f(x_0)+f'(x_0)\Delta x+\frac{f''(x_0)}{2}\Delta(\Delta x)^2$

其中可以将  $F_{m-1}(x_i)$  的结果视为 $x_0$$f_m(x_i)$  视为  $\Delta x$, $L(\widehat y_i,y_i)$ 为 $\widehat y_i$ 的函数。我们将 $F_m$   展开,重新得到我们的目标函数:

Obj=\sum_{i=1}^N[L[F_{m-1}(x_i),y_i]+\frac{\partial L}{\partial F_{m-1}(x_i )}f_m(x_i)]+\frac{1}{2}\frac{\partial^2 L}{\partial^2 F_{m-1}(x_i )}f^2_m(x_i)]+\sum_{j=1}^m {\Omega} (f_j)

在每次更新的时候,前𝑚−1个模型已经是确定了的,因此上面的式子中只有  $f_m(x_i)$  是未知的(其实也就是我们即将生成的𝑚棵树)。我们将常数部分稍微处理以下:

$Obj=\sum_{i=1}^N[g_if_m(x_i)+\frac{1}{2}h_if_m^2(x_i)]+\Omega (f_m)$

其中:


g_i=\frac{\partial L}{\partial F_m-1(x_i)},h_i=\frac{\partial^2 L}{\partial^2 F_m-1(x_i)}

也就是每个样本的前𝑚−1棵树与最终结果之间的一阶导数和二阶导数。在第𝑚−1树已经确定了的情况下,是很容易计算出来的。


### 使用 XGBoost 构建薪资预测模型 #### 数据预处理 在构建任何机器学习模型之前,数据预处理是一个至关重要的环节。对于薪资预测问题,通常涉及数值特征和类别特征的转换、缺失值填充以及标准化/归一化等操作。 以下是常见的数据预处理步骤: 1. **处理缺失值**:可以使用均值、中位数或众数填补数值型特征中的缺失值;而对于分类特征,则可以选择模式(mode)或其他策略。 2. **编码类别变量**:将字符串类型的类别变量转化为数值形式,常用的方法有 `LabelEncoder` 和 `OneHotEncoder`。 3. **特征缩放**:虽然树模型对特征尺度不敏感,但在某些情况下仍可能受益于特征缩放,尤其是当目标函数依赖梯度时。 ```python import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import LabelEncoder, StandardScaler # 假设 df 是原始数据框 df = pd.read_csv('salary_data.csv') # 处理缺失值 df.fillna(df.median(), inplace=True) # 编码类别变量 label_encoders = {} for column in ['category_feature_1', 'category_feature_2']: le = LabelEncoder() df[column] = le.fit_transform(df[column]) label_encoders[column] = le # 特征缩放 scaler = StandardScaler() numerical_features = ['numeric_feature_1', 'numeric_feature_2'] df[numerical_features] = scaler.fit_transform(df[numerical_features]) # 划分训练集与测试集 X = df.drop(columns=['Salary']) y = df['Salary'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) ``` #### 模型构建与训练 XGBoost 是一种高效的提升算法框架,支持多种优化技术以提高性能。下面展示如何通过 XGBoost 训练一个回归模型用于薪资预测。 ```python import xgboost as xgb from sklearn.metrics import mean_squared_error # 将 Pandas DataFrame 转换为 DMatrix 格式 dtrain = xgb.DMatrix(X_train, label=y_train) dtest = xgb.DMatrix(X_test, label=y_test) # 设置参数 params = { 'objective': 'reg:squarederror', 'eval_metric': 'rmse', 'eta': 0.1, 'max_depth': 6, 'subsample': 0.8, 'colsample_bytree': 0.8, } num_rounds = 100 bst = xgb.train(params, dtrain, num_boost_round=num_rounds) # 预测并评估 preds = bst.predict(dtest) rmse = mean_squared_error(y_test, preds, squared=False) print(f'RMSE on Test Set: {rmse}') ``` #### 参数调优技巧 为了获得更好的泛化能力,可以通过调整超参数进一步改进模型表现。常用的调参方法包括网格搜索 (Grid Search) 和贝叶斯优化 (Bayesian Optimization),这里列举几个重要参数及其作用范围: - **learning_rate (`eta`)**: 控制每棵树的学习速率,默认值为 0.3。较小的学习率有助于减少过拟合风险,但会增加计算时间[^4]。 - **max_depth**: 单棵决策树的最大深度,取值一般介于 3 至 10 之间。较大的深度能够捕捉更复杂的交互关系,但也容易引发过拟合现象[^5]。 - **min_child_weight**: 子节点分裂所需的最小样本权重总和,增大该值可抑制过度细分的情况发生。 - **gamma**: 正则化项系数,用来惩罚复杂结构,防止模型过分适应噪声部分的数据点。 - **subsample & colsample_bytree**: 这两个参数分别表示每次迭代随机采样的比例以及列子样本来生成一棵新树的比例,适当降低它们可以帮助缓解过拟合倾向。 #### 模型持久化 完成模型训练之后,将其序列化以便后续部署是非常必要的。借助 `joblib` 可轻松实现这一功能。 ```python from sklearn.externals import joblib # 保存模型至文件 joblib.dump(bst, 'xgboost_salary_model.pkl') # 加载已存储的模型 loaded_model = joblib.load('xgboost_salary_model.pkl') predictions = loaded_model.predict(dtest) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值