使用 joblib 在 sklearn 中重用 cross_val_score 拟合的模型
Reusing model fitted by cross_val_score in sklearn using joblib
我在 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
fitbefore exploiting the model.
。
我做错了什么?我不能重用适合计算交叉验证的模型吗?我查看了 Keep the fitted parameters when using a cross_val_score in scikits learn 但要么我不明白答案,要么这不是我要找的。我想要的是用 joblib 保存整个模型,这样我以后就可以使用它而无需重新拟合。
Cross_val_score 不保留拟合模型
Cross_val_predict 确实
没有 cross_val_predict_proba 但你可以这样做
交叉验证必须适合您的模型并不完全正确;而是 k 折交叉验证在部分数据集上适合您的模型 k 次。如果你想要模型本身,你实际上需要在整个数据集上再次拟合模型;这实际上不是交叉验证过程的一部分。所以实际上调用
并不是多余的
alg.fit(data, labels)
在交叉验证后适合您的模型。
另一种方法是不使用专用函数 cross_val_score
,您可以将其视为交叉验证网格搜索的特例(参数 space 中有一个点).在这种情况下,GridSearchCV
将默认在整个数据集上重新拟合模型(它有一个参数 refit=True
),并且在其 [=22] 中也有 predict
和 predict_proba
方法=].
您的模型未拟合的真正原因是函数 cross_val_score
在拟合副本之前首先复制您的模型:Source link
所以你原来的模型还没有装好
我在 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
fitbefore exploiting the model.
。
我做错了什么?我不能重用适合计算交叉验证的模型吗?我查看了 Keep the fitted parameters when using a cross_val_score in scikits learn 但要么我不明白答案,要么这不是我要找的。我想要的是用 joblib 保存整个模型,这样我以后就可以使用它而无需重新拟合。
Cross_val_score 不保留拟合模型 Cross_val_predict 确实 没有 cross_val_predict_proba 但你可以这样做
交叉验证必须适合您的模型并不完全正确;而是 k 折交叉验证在部分数据集上适合您的模型 k 次。如果你想要模型本身,你实际上需要在整个数据集上再次拟合模型;这实际上不是交叉验证过程的一部分。所以实际上调用
并不是多余的alg.fit(data, labels)
在交叉验证后适合您的模型。
另一种方法是不使用专用函数 cross_val_score
,您可以将其视为交叉验证网格搜索的特例(参数 space 中有一个点).在这种情况下,GridSearchCV
将默认在整个数据集上重新拟合模型(它有一个参数 refit=True
),并且在其 [=22] 中也有 predict
和 predict_proba
方法=].
您的模型未拟合的真正原因是函数 cross_val_score
在拟合副本之前首先复制您的模型:Source link
所以你原来的模型还没有装好