2017-10-26 3 views
2

を使用して訓練GradientBoostingClassifierのロード:の保存と、私は次のコードを使用してjoblib.dump使用して訓練GradientBoostingClassifierを保存しようとしていますjoblib.dump

# use 90% of training data 
NI=int(len(X_tr)*0.9) 
I1=np.random.choice(len(X_tr),NI) 
Xi=X_tr[I1,:] 
Yi=Y_tr[I1] 

#train a GradientBoostingCalssifier using that data 

a=GradientBoostingClassifier(learning_rate=0.02, n_estimators=500, min_samples_leaf=50,presort=True,warm_start=True) 

a.fit(Xi,Yi) 

# calculate class probabilities for the remaining data 

I2=np.array(list(set(range(len(X_tr)))-set(I1))) 
Pi=np.zeros(len(X_tr)) 
Pi[I2]=a.predict_proba(X_tr[I2,:])[:,1].reshape(-1) 

#save indexes of training data and the predicted probabilites 
np.savetxt('models\\balanced\\GBT1\\oob_index'+str(j)+'.txt',I2) 
np.savetxt('models\\balanced\\GBT1\\oob_m'+str(j)+'.txt',Pi) 

# save the trained classifier 
joblib.dump(a, 'models\\balanced\\GBT1\\m'+str(j)+'.pkl') 

分類器が訓練され、保存された後、私は、ターミナルを閉じました新しいターミナルを開き、

保存されたテスト・データセットに対する分類子をロードし、それをテストするために、次のコードを実行し
# load the saved class probabilities 
    Pi=np.loadtxt('models\\balanced\\GBT1\\oob_m'+str(j)+'.txt') 

    #load the training data index 
    Ii=np.loadtxt('models\\balanced\\GBT1\\oob_index'+str(j)+'.txt') 

    #load the trained model 
    a=joblib.load('models\\balanced\\GBT1\\m'+str(j)+'.pkl') 

    #predict class probabilities using the trained model 
    Pi1=a.predict_proba(X_tr[Ii,:])[:,1] 

    # Calculate aupr for the retrained model 
    _prec,_rec,_=metrics.precision_recall_curve(Y[Ii],Pi1,pos_label=1) 
    auc=metrics.auc(_rec,_prec); 

    # calculate aupr for the saved probabilities 
    _prec1,_rec1,_=metrics.precision_recall_curve(Y[Ii],Pi[Ii],pos_label=1) 
    auc1=metrics.auc(_rec1,_prec1); 

    print('in iteration ', j, ' aucs: ', auc, auc1) 

コードは次のように出力されます反復0のAUCで :0.0331879 0.0657821 ..... .......................... すべての場合、リロードされたクラシファイアのauprは、元の訓練されたクラシファイアと大きく異なります。私は読み込みと保存に同じバージョンのsklearnとpythonを使用しています。私は間違って何をしていますか?

+0

は漬物を使用してモデルを保存https://machinelearningmastery.com/save-gradient-:それはdefault

コードは以下aucメトリックのと同じ結果を生成することにより、データをシャッフルboosting-models-xgboost-python/ – Paddy

+0

コードは正しいですか? => 'Ii = Pi = np.loadtxt ...'。ここでは、変数Piにロードしているインデックスを再割り当てします。 –

+0

@Paddy。はい、彼は出来ます。しかし、問題は無関係であり、scikitのドキュメントは 'joblib'(http://scikit-learn.org/stable/modules/model_persistence.html#persistence-example)でscikitモデルを保存することをお勧めします。 –

答えて

1

エラーはあなたのコードです。 train_test_splitを使用してデータを分割することをおすすめします。

from sklearn.ensemble import GradientBoostingClassifier 
from sklearn.metrics import precision_recall_curve 
from sklearn.metrics import auc 
from sklearn.datasets import load_iris 
from sklearn.model_selection import train_test_split 
import pickle 
from sklearn.externals import joblib 

def main(): 
    X, y = load_iris(return_X_y=True) 
    X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=.3) 

    clf = GradientBoostingClassifier() 
    clf.fit(X_train, y_train) 

    preds = clf.predict(X_test) 
    prec, rec, _ = precision_recall_curve(y_test, preds, pos_label=1) 

    with open('dump.pkl', 'wb') as f: 
     pickle.dump(clf, f) 

    print('AUC SCORE: ', auc(rec, prec)) 

    clf2 = joblib.load('dump.pkl') 
    preds2 = clf2.predict(X_test) 

    prec2, rec2, _ = precision_recall_curve(y_test, preds2, pos_label=1) 

    print('AUC SCORE AFTER DUMP: ', auc(rec2, prec2)) 

if __name__ == '__main__': 
    main() 

>>> AUC SCORE: 0.273271889401 
>>> AUC SCORE AFTER DUMP: 0.273271889401 
関連する問題