# 导入库文件和数据集
from sklearn.datasets import load_boston
from sklearn.metrics import r2_score,mean_squared_error,mean_absolute_error,accuracy_score,precision_score, recall_score
from sklearn.model_selection import train_test_split
import math
boston_data = load_boston()
X = boston_data.data
y = boston_data.target
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=420)
1. sklearnAPI的库的使用方式
from xgboost import XGBRegressor
reg = XGBRegressor( n_estimators = 20, #迭代次数 l
earning_rate = 0.1, #学习率
max_depth=5 )
reg.fit(X_train, y_train)
ypred = reg.predict(X_test)
mean_squared_error(y_test, ypred)
math.sqrt(mean_squared_error(y_test, ypred))
# 设置eval_set参数,可以一边训练,一边测试
reg.fit(X_train, y_train, eval_set = [(X_train, y_train), (X_test, y_test)])
2. XGBoost的原生库的使用方式
核心点:
DMatrix()类:用于封装数据,它是XGBoost自定义的一个数据矩阵类,目的是这种定义方式可以优化存储和运算速度;
XGBoost必须先使用字典设定参数集,再使用train()将参数输入,进行训练;
import xgboost as xgb
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)
# params:弱评估器(booster)有关的参数
params = {
'eta': 0.1, #学习率
'max_depth':5 #树的最大深度
}
num_round = 20 # 迭代轮数
bst = xgb.train(params=params, #设置模型参数
dtrain=dtrain, #dtrain:训练数据集
num_boost_round = num_round #迭代轮数
)
ypred = bst.predict(dtest)
mean_squared_error(y_test, ypred)
# 也可以一边训练,一边测试
bst = xgb.train(
params=params,
dtrain=dtrain,
num_boost_round = num_round,
evals=[(dtrain, 'train'),(dtest, 'test')] #evals:验证数据集
)
result1 = bst.predict(dtest)
print(math.sqrt(mean_squared_error(y_test, result1)))
result2 = bst.predict(
dtest,
ntree_limit=19 #限制predict时使用的树的数目
)
print(math.sqrt(mean_squared_error(y_test, result2)))
调用xgboost.train()和sklearnAPI中的XGBRegressor,需要输入的参数是不同的。它们只是写法不同,功能是相同的。
比如第一个参数eta,就是XGBRegressor里的learning_rate。
只不过在sklearnAPI中,开发团队友好地将参数的名称调节成了与sklearn中其他算法类更相似的样子。
两种使用方式的区别:
- 建模流程略有不同:原生库的数据必须封装在DMatrix()中,再进行训练;sklearnAPI没有数据封装的过程;
- 原生XGBoost库的大部分参数通过params传递;sklearnAPI没有params这个参数,所有参数都是直接在类里 面赋值;
- 原生XGBoost库的train()函数即可用来处理分类问题,也可用来处理回归问题;sklearnAPI分别封装了分类函数与回归函数;