使用joblib重用sklearn中cross_val_score拟合的模型



我在python中创建了以下函数:

def cross_validate(algorithms, data, labels, cv=4, n_jobs=-1):
    print "Cross validation using: "
    for alg, predictors in algorithms:
        print alg
        print
        # Compute the accuracy score for all the cross validation folds. 
        scores = cross_val_score(alg, data, labels, cv=cv, n_jobs=n_jobs)
        # Take the mean of the scores (because we have one for each fold)
        print scores
        print("Cross validation mean score = " + str(scores.mean()))
        name = re.split('(', str(alg))
        filename = str('%0.5f' %scores.mean()) + "_" + name[0] + ".pkl"
        # We might use this another time 
        joblib.dump(alg, filename, compress=1, cache_size=1e9)  
        filenameL.append(filename)
        try:
            move(filename, "pkl")
        except:
            os.remove(filename) 
        print 
    return

我认为为了进行交叉验证,sklearn必须符合您的功能。

但是,当我稍后尝试使用它时(f是我在joblib.dump(alg, filename, compress=1, cache_size=1e9)):中保存的pkl文件

alg = joblib.load(f)  
predictions = alg.predict_proba(train_data[predictors]).astype(float)

我在第一行中没有得到任何错误(所以看起来负载正在工作),但随后它告诉我NotFittedError: Estimator not fitted, call适合下一行的before exploiting the model.

我做错了什么?我不能重复使用适合计算交叉验证的模型吗?我在scikitslearn中使用cross_val_score时查看了"保持拟合参数",但要么我不明白答案,要么这不是我想要的。我想要的是用joblib保存整个模型,这样我以后就可以使用它而不需要重新拟合。

交叉验证必须适合您的模型是不太正确的;相反,k次交叉验证在部分数据集上适合你的模型k次。如果你想要模型本身,你实际上需要在整个数据集上再次拟合模型;这实际上不是交叉验证过程的一部分。所以实际上调用并不是多余的

alg.fit(data, labels)

以在交叉验证后适合您的模型。

另一种方法是不使用专门的函数cross_val_score,您可以将其视为交叉验证网格搜索的特殊情况(在参数空间中有一个点)。在这种情况下,默认情况下,GridSearchCV将在整个数据集上重新装配模型(它有一个参数refit=True),并且在其API中也有predictpredict_proba方法。

您的模型未拟合的真正原因是函数cross_val_score在拟合副本之前首先复制您的模型:源链接

所以你原来的模型没有安装。

Cross_val_score不保持拟合模型交叉_预测没有cross_val_product_proba,但您可以执行此

交叉验证模型的predict_proba

相关内容

  • 没有找到相关文章

最新更新