超参数调整实战:scikit-learn配合XGBoost的竞赛top20策略

简介: 超参数调整实战:scikit-learn配合XGBoost的竞赛top20策略

快速学习如何为XGboost优化超参数!

在过去的几年中,XGBoost被广泛用于表格数据推断,并且赢得了数百个挑战。但是,仅仅通过XGBoost并不能完成完成整的解决方案,同样的模型为什么有些人能获得更好的准确性呢?除了经验方面的差异,还有一个事实,那就是他们优化了超参数!

image.png

因此,我们今天将告诉您如何获取特定数据集的最佳超参数。

我们将在Hacker Earth挑战(https://www.hackerearth.com/en-us/challenges/competitive/hackerearth-machine-learning-challenge-predict-defcon-level/problems/)的数据集上使用scikit-learn配合XGBoost。


以下我使用的全部代码。我排除了分析部分和数据处理部分,因为这不是本文的目标。

#imported libs
import numpy as np
import pandas as pd
from xgboost import XGBClassifier
import matplotlib.pyplot as plt
from scipy import stats
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.model_selection import RandomizedSearchCV, GridSearchCV
import sys
train = pd.read_csv("train.csv")
X = train.drop(['DEFCON_Level','ID'],axis=1)
y = train['DEFCON_Level']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
#For classification
#Random Search
xgb_pipeline = Pipeline([('scaler', StandardScaler()), ('classifier',XGBClassifier())])
params = {
        'min_child_weight': [1, 5, 10],
        'gamma': [0.5, 1, 1.5, 2, 5],
        'subsample': [0.6, 0.8, 1.0],
        'colsample_bytree': [0.6, 0.8, 1.0],
        'max_depth': [3, 4, 5]
        }
random_search = RandomizedSearchCV(xgb_pipeline, param_distributions=params, n_iter=100,
                                   scoring='f1_weighted', n_jobs=4, verbose=3, random_state=1001 )
random_search.fit(X_train,y_train)
#OR
#Grid Search
xgb_pipeline = Pipeline([('scaler', StandardScaler()), ('classifier',XGBClassifier())])
gbm_param_grid = {
    'classifier__learning_rate': np.array([0.01,0.001]),
    'classifier__n_estimators': np.array([100,200,300,400]),
    'classifier__subsample': np.array([0.7,0.8,0.9]),
    'classifier__max_depth': np.array([10,11,12,13,14,15,16,17]),
    'classifier__lambda': np.array([1]),
    'classifier__gamma': np.array([0])
    #'classifier__colsample_bytree': np.arange(0,1.1,.2)
}
grid_search = GridSearchCV(estimator=xgb_pipeline, param_grid=gbm_param_grid, n_jobs= -1,
                         scoring='f1_weighted', verbose=10)
grid_search.fit(X_train,y_train)
#Print out best parameters
print(random_search.best_params_)
print(grid_search.best_params_)
#Print out scores on validation set
print(random_search.score(X_test,y_test))
print(grid_search.score(X_test,y_test))

随机搜索优化

随机搜索优化

让我们分析一下随机搜索的区块:

#Random Search
xgb_pipeline = Pipeline([('scaler', StandardScaler()),
('classifier',XGBClassifier())])
params = {'min_child_weight': [1, 5, 10],
        'gamma': [0.5, 1, 1.5, 2, 5],
        'subsample': [0.6, 0.8, 1.0],
        'colsample_bytree': [0.6, 0.8, 1.0],
        'max_depth': [3, 4, 5]}random_search = RandomizedSearchCV(xgb_pipeline, param_distributions=params, n_iter=100,                                   scoring='f1_weighted', n_jobs=4, verbose=3, random_state=1001 )random_search.fit(X_train,y_train)

当我们使用XGBClassifier时,XGBRegressor的工作原理相同。您想搜索的参数在params中,可以简单地添加要尝试的值。

我们将f1_weighted作为指标,因为这是比赛中的要求。作业数量(n_jobs)基本上取决于是否要并行化计算。(如果有多个核心)

如前所述,这是一个随机搜索,因此并不是所有的参数组合都将被试用,这有助于节省计算时间,并具有超参数的初步建议。

网格搜索优化

#Grid Search
xgb_pipeline = Pipeline([('scaler', StandardScaler()), ('classifier',XGBClassifier())])gbm_param_grid = {
    'classifier__learning_rate': np.array([0.01,0.001]),
    'classifier__n_estimators': np.array([100,200,300,400]),        'classifier__subsample': np.array([0.7,0.8,0.9]),    'classifier__max_depth': np.array([10,11,12,13,14,15,16,17]), 'classifier__lambda': np.array([1]),
    'classifier__gamma': np.array([0])}grid_search = GridSearchCV(estimator=xgb_pipeline, param_grid=gbm_param_grid, n_jobs= -1,                         scoring='f1_weighted', verbose=10) grid_search.fit(X_train,y_train)

跟上面一样,可以更改XGBClassifier()使其成为XGBRegressor()。我们为变量n_jobs使用-1,以表明我们希望使用所有核进行计算。详细部署以显示分数和用于在训练时获取分数的参数。

结论

最后,只需打印以下最佳参数即可。

#Print out best parameters
print(random_search.best_params_)
print(grid_search.best_params_)#Print out scores on validation set
print(random_search.score(X_test,y_test))
print(grid_search.score(X_test,y_test))

看看验证集的分数!

目录
相关文章
|
10月前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
1061 7
|
10月前
|
数据采集 Web App开发 数据安全/隐私保护
实战:Python爬虫如何模拟登录与维持会话状态
实战:Python爬虫如何模拟登录与维持会话状态
|
10月前
|
存储 分布式计算 测试技术
Python学习之旅:从基础到实战第三章
总体来说,第三章是Python学习路程中的一个重要里程碑,它不仅加深了对基础概念的理解,还引入了更多高级特性,为后续的深入学习和实际应用打下坚实的基础。通过这一章的学习,读者应该能够更好地理解Python编程的核心概念,并准备好应对更复杂的编程挑战。
269 12
|
10月前
|
存储 数据采集 监控
Python文件操作全攻略:从基础到高级实战
本文系统讲解Python文件操作核心技巧,涵盖基础读写、指针控制、异常处理及大文件分块处理等实战场景。结合日志分析、CSV清洗等案例,助你高效掌握文本与二进制文件处理,提升程序健壮性与开发效率。(238字)
735 1
|
10月前
|
存储 Java 调度
Python定时任务实战:APScheduler从入门到精通
APScheduler是Python强大的定时任务框架,通过触发器、执行器、任务存储和调度器四大组件,灵活实现各类周期性任务。支持内存、数据库、Redis等持久化存储,适用于Web集成、数据抓取、邮件发送等场景,解决传统sleep循环的诸多缺陷,助力构建稳定可靠的自动化系统。(238字)
1652 1
|
10月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
832 0
|
10月前
|
机器学习/深度学习 监控 数据挖掘
Python 高效清理 Excel 空白行列:从原理到实战
本文介绍如何使用Python的openpyxl库自动清理Excel中的空白行列。通过代码实现高效识别并删除无数据的行与列,解决文件臃肿、读取错误等问题,提升数据处理效率与准确性,适用于各类批量Excel清理任务。
824 0
|
机器学习/深度学习 数据采集 算法
Python实现xgboost分类模型(XGBClassifier算法)项目实战
Python实现xgboost分类模型(XGBClassifier算法)项目实战
|
机器学习/深度学习 并行计算 算法
第113天: Python XGBoost 算法项目实战
第113天: Python XGBoost 算法项目实战
754 0
|
11月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
1696 102

推荐镜像

更多