超参数调整实战: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))

看看验证集的分数!

目录
相关文章
|
20天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
29天前
|
机器学习/深度学习 Python
堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能
本文深入探讨了堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能。文章详细介绍了堆叠的实现步骤,包括数据准备、基础模型训练、新训练集构建及元学习器训练,并讨论了其优缺点。
50 3
|
1月前
|
机器学习/深度学习 数据采集 算法
深入调查研究Scikit-learn
【11月更文挑战第11天】
46 1
|
20天前
|
小程序 开发者 Python
探索Python编程:从基础到实战
本文将引导你走进Python编程的世界,从基础语法开始,逐步深入到实战项目。我们将一起探讨如何在编程中发挥创意,解决问题,并分享一些实用的技巧和心得。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考。让我们一起开启Python编程的探索之旅吧!
44 10
|
27天前
|
数据采集 存储 算法
Python 中的数据结构和算法优化策略
Python中的数据结构和算法如何进行优化?
|
1月前
|
算法 Unix 数据库
Python编程入门:从基础到实战
本篇文章将带你进入Python编程的奇妙世界。我们将从最基础的概念开始,逐步深入,最后通过一个实际的项目案例,让你真正体验到Python编程的乐趣和实用性。无论你是编程新手,还是有一定基础的开发者,这篇文章都将为你提供有价值的信息和知识。让我们一起探索Python的世界吧!
|
1月前
|
并行计算 调度 开发者
探索Python中的异步编程:从基础到实战
在Python的世界里,异步编程是一种让程序运行更加高效、响应更快的技术。本文不仅会介绍异步编程的基本概念和原理,还将通过具体代码示例展示如何在Python中实现异步操作。无论你是初学者还是有经验的开发者,都能从中获益,了解如何运用这一技术优化你的项目。
|
1月前
|
数据处理 Python
探索Python中的异步编程:从基础到实战
在Python的世界中,“速度”不仅是赛车手的追求。本文将带你领略Python异步编程的魅力,从原理到实践,我们不单单是看代码,更通过实例感受它的威力。你将学会如何用更少的服务器资源做更多的事,就像是在厨房里同时烹饪多道菜而不让任何一道烧焦。准备好了吗?让我们开始这场技术烹饪之旅。
|
机器学习/深度学习 算法 数据处理
Python机器学习笔记 使用scikit-learn工具进行PCA降维
Python机器学习笔记 使用scikit-learn工具进行PCA降维之前总结过关于PCA的知识:深入学习主成分分析(PCA)算法原理。这里打算再写一篇笔记,总结一下如何使用scikit-learn工具来进行PCA降维。
2853 0
|
21天前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!