2016-12-21 57 views
0

我有一個分類器我適合使用cross_val並獲得良好的結果。基本上所有我做的是:保存sklearn分類器適合cross_val

clf = RandomForestClassifier(class_weight="balanced") 
scores = cross_val_score(clf, data, target, cv=8) 
predict_RF = cross_val_predict(clf, data, target, cv=8) 

from sklearn.externals import joblib 
joblib.dump(clf, 'churnModel.pkl') 

基本上就是我想要做的是採取是越來越契合通過cross_val,並出口到JOBLIB模型。然而,當我試圖把它在一個單獨的項目,我得到:

sklearn.exceptions.NotFittedError: Estimator not fitted, call `fit` before exploiting the model. 

所以我猜cross_val實際上並沒有拯救適合我的CLF?我如何堅持cross_val生成的模型?

+1

哪個型號?當你交叉驗證時,你適合*幾個*模型。 –

回答

0

juanpa.arrivillaga是對的。恐怕你必須手動完成,但scikit-learn使它非常容易。 cross_val_score正在製作不會返回給您的深層複印件。下面你會在列表中有deepcopied模型(即clf_models)通過juanpa.arrivillaga的建議

from sklearn.model_selection import StratifiedKFold 
from sklearn.ensemble import RandomForestClassifier 
from copy import deepcopy 

kf = StratifiedKFold(n_splits=8) 
clf = RandomForestClassifier(class_weight="balanced") 
clf_models = [] 

# keep in mind your X and y should be indexed same here 
kf.get_n_splits(X_data) 
for train_index, test_index in kf.split(X_data): 
    print("TRAIN:", train_index, "TEST:", test_index) 
    X_train, X_test = X_data[train_index], X_data[test_index] 
    y_train, y_test = y_data[train_index], y_data[test_index] 
    tmp_clf = deepcopy(clf) 
    tmp_clf.fit(X_train, y_train) 

    print("Got a score of {}".format(tmp_clf.score(X_test, y_test)) 
    clf_models.append(tmp_clf) 

-edit StratifiedKFold是一個更好的選擇。只是爲了示範。

+0

可能更好地使用'StratifiedKFold' –

+0

所以,如果我理解正確,clf_models是8個模型的列表擬合到父數據的子集的權利?有沒有最好的做法,讓這個單一的模型?我只挑選得分最高的那個,還是有辦法將它們混合? –

+0

這是正確的,clf_models是8個擬合模型的列表。如果您使用交叉驗證,目的通常是爲模型找到好的超參數。如果這意味着模型未訓練的數據中的摺疊對於未來的數據集特別不具有代表性,那麼選擇具有最佳分數的模型可能是正確的選擇。你應該看看這是否屬實。這些事通常根據具體情況決定; RandomForestClassifier可能甚至不會爲您的情況產生任何結果。總之,這取決於。 – itzjustricky