XGboost-网格调参法(转载与测试)

一、原理

一篇好文:
https://www.jianshu.com/p/7467e616f227

二、网格调参
用xgboost既可以用来做二分类、多分类,也可以用来做回归预测数值,除了特征之外,影响模型的是如何调参了,一般是按一定的步骤、网格搜索最优参数,如下两篇文章一个是用来分类,一个是用来预测数值的案例,并且详细给出了调参的步骤和代码:
https://blog.csdn.net/han_xiaoyang/article/details/52665396 (用来分类XGBClassifier)
https://segmentfault.com/a/1190000014040317 (用来预测数字,XGBRegressor)

三、实践
参考以上的博客,用iris经典数据集进行多分类的预测(三个类别)。

  • 载入库
import pandas as pd
import numpy as np
import xgboost as xgb
from sklearn.model_selection import GridSearchCV
from xgboost.sklearn import XGBClassifier
from sklearn import metrics
import matplotlib.pyplot as plt
  • 数据集
from sklearn.datasets import load_iris
iris = load_iris()
X,y = iris.data,iris.target
  • 用Early Stop检查过拟合
model = XGBClassifier()
eval_set =[(X_test,y_test)]
model.fit(X_train,y_train,eval_metric="mlogloss",eval_set=eval_set,verbose=True)

eval_set=[(x_test,y_test)] 评估数据集,list类型
eval_metric=“mlogloss” 评估标准(多分类问题,使用mlogloss作为损失函数)
fit函数参数:early_stopping_rounds= 10 如果模型的loss十次内没有减小,则提前结束模型训练
verbose = True True显示,False不显示

  • 预测
y_pred = model.predict(X_test)
  • 两种评分
from sklearn.metrics import accuracy_score
from sklearn.metrics import mean_absolute_error
err1 = accuracy_score(y_test,y_pred)
err2 = mean_absolute_error(y_test,y_pred)
print("accuracy1 is {0}%".format(err1*100.0))
print("accuracy2 is {0}%".format(err2*100.0))

accuracy1 is 97.77777777777777%
accuracy2 is 2.2222222222222223% #这个部分再看看吧,每个类型的含义
  • 接下来,可视化训练过程
results = model.evals_result()
epochs = len(results['validation_0']['merror'])
x_axis = range(0,epochs)
fig, ax =plt.subplots(1,2,figsize=(10,5))
ax[0].plot(x_axis, results['validation_0']['mlogloss'], label='Train')
ax[0].plot(x_axis, results['validation_1']['mlogloss'], label='Test')
ax[0].legend()
ax[0].set_title('XGBoost Log Loss')
ax[0].set_ylabel('Log Loss')
ax[0].set_xlabel('epochs')

ax[1].plot(x_axis, results['validation_0']['merror'], label='Train')
ax[1].plot(x_axis, results['validation_1']['merror'], label='Test')
ax[1].legend()
ax[1].set_title('XGBoost Classification Error')
ax[1].set_ylabel('Classification Error')
ax[1].set_xlabel('epochs')
plt.show()

XGboost-网格调参法(转载与测试)_第1张图片
运行结果XGboost-网格调参法(转载与测试)_第2张图片
从图上看出,运行到74步的时候停止,最好的效果在64次。
ps:根据许多大牛的实践经验,选择early_stopping_rounds=10%*n_estimators。

一开始可以选择较大的迭代

model = XGBClassifier(n_estimators=1000)

你可能感兴趣的:(数据分析,XGboost,XGboost)