我在函数之外创建了两个列表。在多次调用的该函数内部,扩展了这两个列表。问题是我完成计算后,两个列表为空。这是我正在使用的代码:
true_classes = []
predicted_classes = []
def report_cv(y_true, y_pred):
true_classes.extend(y_true)
predicted_classes.extend(y_pred)
return accuracy_score(y_true, y_pred)
cv = StratifiedKFold(n_splits=5, shuffle=True)
rfr = RandomForestClassifier(n_estimators=1000, class_weight='balanced',
n_jobs=-1)
scores = cross_val_score(rfr,
X=data_ml_clean.iloc[:, 2:],
y=data_ml_clean.vDili,
cv=cv, n_jobs=-1,
scoring=make_scorer(report_cv))
print(classification_report(true_classes, predicted_classes))
我不明白为什么不将它们视为全局变量。在函数内部添加global true_classes
无济于事。
答案 0 :(得分:0)
我对此有另一种看法,找出了可能出问题的地方,但首先在代码中添加了一些附加内容:
true_classes = []
predicted_classes = []
def report_cv(y_true, y_pred):
global true_classes
global predicted_classes
true_classes.extend(y_true)
predicted_classes.extend(y_pred)
return accuracy_score(y_true, y_pred)
cv = StratifiedKFold(n_splits=5, shuffle=True)
rfr = RandomForestClassifier(n_estimators=1000, class_weight='balanced',
n_jobs=-1)
def calculate_scores():
# (no global keyword needed here)
scores = cross_val_score(rfr,
X=data_ml_clean.iloc[:, 2:],
y=data_ml_clean.vDili,
cv=cv, n_jobs=-1,
scoring=make_scorer(report_cv)) # this call to report_cv should set the two global variables
print(true_classes)
print(predicted_classes)
a = report_cv(actual_y_true, actual_y_pred)
print(classification_report(true_classes, predicted_classes))
因此,您只需要在函数中使用global
关键字,该关键字将在根据this answer首次调用时设置其值。
然后,这确实是问题所在,正如@Goyo所提到的,report_cv
没有被调用。从scikit学习文档:
https://scikit-learn.org/stable/modules/generated/sklearn.metrics.make_scorer.html
此工厂函数包装计分函数以在GridSearchCV中使用 和cross_val_score。它需要一个得分函数,例如 precision_score,mean_squared_error,adjusted_rand_index或 average_precision并返回可为评估者评分的可调用项 输出。
因此返回可调用的,包装,并不表示调用。
我在一行中打电话给report_cv
。您将需要为其提供值。这将使全局变量的行为符合您的期望,列表不应再为空,但是我不能保证它将使此sklearn代码的其余部分按预期运行。
答案 1 :(得分:0)
实际上未调用report_cv函数,请尝试构建lambda函数或您可以做什么,除了可以先调用report_cv函数,然后保存其值并进一步使用它