2017-07-04 129 views
0

我嘗試使用下面的PARAMS來訓練XGBoost模型PARAMS:如何從已保存的XGBoost模型

xgb_params = { 
    'objective': 'binary:logistic', 
    'eval_metric': 'auc', 
    'lambda': 0.8, 
    'alpha': 0.4, 
    'max_depth': 10, 
    'max_delta_step': 1, 
    'verbose': True 
} 

由於我輸入的數據是太大,不能完全加載到內存,I適應增量訓練:

xgb_clf = xgb.train(xgb_params, input_data, num_boost_round=rounds_per_batch, 
        xgb_model=model_path) 

進行預測的代碼是

xgb_clf = xgb.XGBClassifier() 
booster = xgb.Booster() 
booster.load_model(model_path) 
xgb_clf._Booster = booster 
raw_probas = xgb_clf.predict_proba(x) 

結果似乎不錯。但是當我試圖調用xgb_clf.get_xgb_params()時,我得到了一個參數代碼,其中所有參數都被設置爲默認值。

我可以猜測,根本原因是當我初始化模型時,我沒有傳入任何參數。所以模型使用默認值進行初始化,但是當它預測時,它使用了一個內置的加速器使用一些預定義的參數。

但是,我想知道是否有任何方法,在將預先訓練好的助推器模型分配給XGBClassifier後,我可以看到用於訓練助推器的真實參數,但不能用於初始化分類。

謝謝大家。

回答

0

您似乎在代碼中將sklearn API與功能性API混合在一起,如果您堅持使用其中一個,您應該獲取參數以保留在pickle中。以下是使用sklearn API的示例。

import pickle 
import numpy as np 
import xgboost as xgb 
from sklearn.datasets import load_digits 


digits = load_digits(2) 
y = digits['target'] 
X = digits['data'] 

xgb_params = { 
    'objective': 'binary:logistic', 
    'reg_lambda': 0.8, 
    'reg_alpha': 0.4, 
    'max_depth': 10, 
    'max_delta_step': 1, 
} 
clf = xgb.XGBClassifier(**xgb_params) 
clf.fit(X, y, eval_metric='auc', verbose=True) 

pickle.dump(clf, open("xgb_temp.pkl", "wb")) 
clf2 = pickle.load(open("xgb_temp.pkl", "rb")) 

assert np.allclose(clf.predict(X), clf2.predict(X)) 
print(clf2.get_xgb_params()) 

產生

{'base_score': 0.5, 
'colsample_bylevel': 1, 
'colsample_bytree': 1, 
'gamma': 0, 
'learning_rate': 0.1, 
'max_delta_step': 1, 
'max_depth': 10, 
'min_child_weight': 1, 
'missing': nan, 
'n_estimators': 100, 
'objective': 'binary:logistic', 
'reg_alpha': 0.4, 
'reg_lambda': 0.8, 
'scale_pos_weight': 1, 
'seed': 0, 
'silent': 1, 
'subsample': 1} 
+0

謝謝您的回答。我以前使用sklearn的joblib.dump,它確實有效。但我沒有設法找到一種使用sklearn API逐步適應模型的方法。因此,請你請讓我知道如何去做? (遞增擬合模型的需求更重要) –