本文记录个人使用xgboost过程中的代码记录(调用sklearn库方式)
安装xgboost: pip install xgboost即可
from numpy import loadtxt from xgboost import XGBClassifier from sklearn.model_selection import train_test_split import xgboost import numpy as np import operator
(一)加载数据,划分训练集以及测试集:
train_dataset = loadtxt('./dataset/feature.csv', delimiter=",")
X_ = train_dataset[:,0:60] # 特征
Y = train_dataset[:,60] # 标签
X_train, X_valid, y_train, y_valid = train_test_split(X, Y, test_size=0.15, random_state=42)
print("Train data length:", len(X_train))
print("Valid data length:", len(X_valid))
(二)模型训练,参数设置,使用早停法
model = XGBClassifier( learning_rate=0.1, # 学习率 n_estimators=1000, # 总体迭代轮数, 对于多分类问题每次迭代会建k颗回归树(k为类别数) max_depth=10, min_child_weight=1, gamma=0.1, subsample=1, colsample_bytree=1, reg_alpha=1, objective='multi:softmax', # 多分类, 和 num_class一起使用 num_class=9, # 9分类 nthread=-1, scale_pos_weight=1, seed=27 ) eval_set = [(X_valid, y_valid)] model.fit(X_train, y_train, early_stopping_rounds=150, eval_metric="mlogloss", eval_set=eval_set, verbose=True) (三)模型保存 model.get_booster().save_model('./checkpoints/xgb.model') print ('save finish!')
注意, 该保存模型的方法只会在整体全部迭代之后进行保存,若想在每一次迭代后保存一个模型,可以找到sklearn实现fit函数的代码文件sklearn.py(按住ctrl点击fit即可跳转到其声明的位置), 观察fit函数可知模型训练在以下部分实现
self._Booster = train(xgb_options, train_dmatrix, self.get_num_boosting_rounds(), evals=evals, early_stopping_rounds=early_stopping_rounds, evals_result=evals_result, obj=obj, feval=feval, verbose_eval=verbose, xgb_model=xgb_model,callbacks=callbacks)
再按如上方法查找train函数声明位置(training.py),发现又调用了模型训练在_train_internal函数中实现,只需要在
for i in range(start_iteration, num_boost_round) 该循环的末尾加上 bst.save_model('./checkpoints/' + str(i) + '.model')就可以实现每一次迭代保存一个模型到checkpoints文件夹.
(四)模型测试
# 加载测试集 test_path = './test.csv' dataset = loadtxt(test_path, delimiter=",") X_te = dataset[:,0:60] # 加载训练好的模型 model = xgb.Booster(model_file='./checkpoints/xgb.model') X_te = xgb.DMatrix(X_te) y_pred = model.predict(X_te, ntree_limit=1291) # 1291是早停法得到的最好迭代次数,本人使用ntree_limit = model.best_ntree_limit保存,貌似是说Booster没有best_ntree_limit属性,可能是模型保存的方式问题导致的,也可以使用joblib保存模型尝试,本人记录了模型最后输出的最好迭代测试为1291,若没有记录,也可以使用print (model.attributes())的方式打印查看最好的迭代轮数(需要加1). predictions = [np.argmax(value) for value in y_pred] # 模型预测类别结果
(五)查看特征的重要性
# 加载模型 model = xgb.Booster(model_file='./checkpoints/xgb.model') # 取得重要性 importance = model.get_fscore() feature_num = 30 # 查看前30个特征的重要性 importance = sorted(importance.items(), key=operator.itemgetter(1), reverse=True) importance = importance[:feature_num] print (importance) # 特征id和相应重要性保存到csv文件中 high_feat = [] with open('feature_id.csv', 'a', newline='') as out: csv_write = csv.writer(out, dialect='excel') for line in importance: high_feat.append(int(str(line[0])[1:])) csv_write.writerow([str(str(line[0])[1:]),str(line[1])]) print (high_feat)