Я еще раз посмотрел на это, выяснил, что, вероятно, не так, но сначала ваш код с некоторыми дополнениями:
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
в функции, которая установитих значения, когда он впервые вызывается согласно этому ответу .
Затем, и это действительно то, в чем проблема, как упоминал @Goyo, report_cv
не вызывается.Из scikit выучите документы: https://scikit -learn.org / stable / modules / generate / sklearn.metrics.make_scorer.html
Эта фабричная функция оборачивает функции оценки для использованияв GridSearchCV и cross_val_score.Он принимает функцию оценки, такую как precision_score, mean_squared_error ,гулируемый_rand_index или average_precision, и возвращает вызываемый элемент, который оценивает выходные данные оценщика.
То есть возвращает вызываемый , обертывания , не подразумевайте звонков .
Я вставил строку для звонка report_cv
.Вам нужно будет дать ему значения.Это заставит глобальные переменные вести себя так, как вы ожидаете, список больше не должен быть пустым, но я не могу обещать, что остальная часть этого кода sklearn будет работать так, как ожидается.