集成算法Xgboost实战(详细代码+数据集)

本文介绍了XGBoost的原理,通过实战演示如何进行数据预处理、特征转换,以及如何调节参数以优化XGBoost模型,包括使用DMatrix、交叉验证和特征重要性的评估。
摘要由CSDN通过智能技术生成

上期我们讲过了Xgboost的原理和目标函数推导,今天我们来进行实战练习,首先简单回顾下Xgboost原理:

Xgboost是一个集成模型,将K个树的结果进行求和,作为最终的预测值,Xgboost的目的就是通过不断加入树模型来使得预测结果比之前的效果好,使目标函数最小,即预测值无限接近真实值。

接下来进行实战训练:

1. 首先引入

import xgboost as xgb
import pandas as pd
import numpy as np
import pickle
import sys
import matplotlib.pyplot as plt
from sklearn.metrics import mean_absolute_error, make_scorer
from sklearn.preprocessing import StandardScaler
from sklearn.grid_search import GridSearchCV
from scipy.sparse import csr_matrix, hstack
from sklearn.cross_validation import KFold, train_test_split
from xgboost import XGBRegressor
import warnings
warnings.filterwarnings('ignore')
2. 数据预处理和对数转换

train = pd.read_csv('train.csv')

train['log_loss'] = np.log(train['loss'])

3.数据分成连续和离散的特征

features = [x for x in train.columns if x not in ['id','loss', 'log_loss']]
cat_features = [x for x in train.select_dtypes(
       include=['object']).columns if x not in ['id','loss', 'log_loss']] #选择dtype类型是object的且不在id/loss/log_loss的行
num_features = [x for x in train.select_dtypes(
       exclude=['object']).columns if x not in ['id','loss', 'log_loss']]#选择dtype类型不是object的且不在id/loss/log_loss的行

4. 将离散数据转换为分类数据(即A/B/C类对应0/1/2,以此类推)

ntrain = train.shape[0]
train_x = train[features]
train_y = train['log_loss']
for c in range(len(cat_features)):
train_x[cat_features[c]]=train_x[cat_features[c]].astype('category').cat.codes

5. xgboost 自定义了一个数据矩阵类 DMatrix,会在训练开始时进行一遍预处理,从而提高之后每次迭代的效率

dtrain = xgb.DMatrix(train_x, train['log_loss'])

6. 接着我们需要对以下这些参数进行调节

- 'booster':'gbtree',
- 'objective': 'multi:softmax', 多分类的问题
- 'num_class':10, 类别数,与 multisoftmax 并用
- 'gamma':损失下降多少才进行分裂
- 'max_depth':12, 构建树的深度,越大越容易过拟合
- 'lambda':2,  控制模型复杂度的权重值的L2正则化项参数,参数越大,模型越不容易过拟合。
- 'subsample':0.7, 随机采样训练样本
- 'colsample_bytree':0.7, 生成树时进行的列采样
- 'min_child_weight':3, 孩子节点中最小的样本权重和。如果一个叶子节点的样本权重和小于min_child_weight则拆分过程结束
- 'silent':0 ,设置成1则没有运行信息输出,最好是设置为0.
- 'eta': 0.007, 如同学习率
- 'seed':1000,
- 'nthread':7, cpu 线程数
xgb_params = {
   'seed': 0,
   'eta': 0.1,
   'colsample_bytree': 0.5,
   'silent': 1,
   'subsample': 0.5,
   'objective': 'reg:linear',
   'max_depth': 5,
   'min_child_weight': 3
}

7. 交叉验证(num_boost_round树模型个数;early_stopping_rounds若超过10次迭代没有优化则停止)

bst_cv1 = xgb.cv(xgb_params, dtrain, num_boost_round=50, nfold=3, seed=0, 
               feval=xg_eval_mae, maximize=False, early_stopping_rounds=10)

8. 参数调节

Step 1: 选择一组初始参数

Step 2: 改变 max_depth 和 min_child_weight.

max_depth: 树的最大深度。增加这个值会使模型更加复杂,也容易出现过拟合,深度3-10是合理的。

min_child_weight: 正则化参数. 如果树分区中的实例权重小于定义的总和,则停止树构建过程。

Step 3: 调节 gamma 降低模型过拟合风险.

我们选择使用偏小一些的 gamma.

Step 4: 调节 subsample 和 colsample_bytree 改变数据采样策略.

Step 5: 调节学习率 eta.

减小学习率并增大树个数

参数优化的最后一步是降低学习速度,同时增加更多的估计量


class XGBoostRegressor(object):
   def __init__(self, **kwargs):
       self.params = kwargs
       if 'num_boost_round' in self.params:
           self.num_boost_round = self.params['num_boost_round']
       self.params.update({'silent': 1, 'objective': 'reg:linear', 'seed': 0})
       
   def fit(self, x_train, y_train):
       dtrain = xgb.DMatrix(x_train, y_train)
       self.bst = xgb.train(params=self.params, dtrain=dtrain, num_boost_round=self.num_boost_round,
                            feval=xg_eval_mae, maximize=False)
       
   def predict(self, x_pred):
       dpred = xgb.DMatrix(x_pred)
       return self.bst.predict(dpred)
   
   def kfold(self, x_train, y_train, nfold=5):
       dtrain = xgb.DMatrix(x_train, y_train)
       cv_rounds = xgb.cv(params=self.params, dtrain=dtrain, num_boost_round=self.num_boost_round,
                          nfold=nfold, feval=xg_eval_mae, maximize=False, early_stopping_rounds=10)
       return cv_rounds.iloc[-1,:]
   
   def plot_feature_importances(self):
       feat_imp = pd.Series(self.bst.get_fscore()).sort_values(ascending=False)
       feat_imp.plot(title='Feature Importances')
       plt.ylabel('Feature Importance Score')
       
   def get_params(self, deep=True):
       return self.params

   def set_params(self, **params):
       self.params.update(params)
       return self
接下来就是不断调节,直到模型拥有最好的预测效果。后台回复集成可获得Xgboost数据集和代码,大家动手连起来呀~

喜欢的话点个关注哦~ 会每天分享人工智能机器学习内容,回复关键字可获取相关算法数据及代码~

  • 17
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 gpso_xgboost 集成算法代码示例: ```python import numpy as np import pandas as pd import xgboost as xgb from sklearn.model_selection import GridSearchCV, train_test_split from sklearn.metrics import accuracy_score # 加载数据集 data = pd.read_csv('data.csv') X = data.drop('label', axis=1) y = data['label'] # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 定义基模型参数 xgb_params = { 'n_estimators': 100, 'max_depth': 5, 'learning_rate': 0.01, 'subsample': 0.8, 'colsample_bytree': 0.8, 'objective': 'binary:logistic', 'random_state': 42 } # 定义 GP 参数 gp_params = { 'n_gen': 10, 'pop_size': 100, 'elite_size': 20, 'mut_prob': 0.1, 'n_jobs': -1, 'verbose': 1 } # 定义 XGBoost 模型 xgb_model = xgb.XGBClassifier(**xgb_params) # 定义 GPXGBoost 模型 gpxgb_model = GPXGBoost(xgb_model, **gp_params) # 训练 GPXGBoost 模型 gpxgb_model.fit(X_train, y_train) # 预测测试集 y_pred = gpxgb_model.predict(X_test) # 计算准确率 accuracy = accuracy_score(y_test, y_pred) print('Accuracy:', accuracy) ``` 这个代码示例假设你已经有一个名为 `data.csv` 的数据集,其中包含特征和标签。首先,代码通过 Pandas 加载数据集并将其拆分为训练集和测试集。然后,定义了 XGBoost模型的参数,并为 GPXGBoost 模型定义了 GP 参数。 接下来,使用 XGBoost 建立基模型,并将其传递给 GPXGBoost 模型。使用 GPXGBoost 模型拟合训练集,并使用测试集进行预测。最后,计算准确率并打印结果。 请注意,这只是一个简单的示例,你可能需要根据自己的数据集和问题进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值