Глобальный список изменен внутри функции пуст - PullRequest
0 голосов
/ 17 июня 2019

У меня есть два списка, которые я создаю вне моей функции.Внутри этой функции, которая вызывается несколько раз, эти два списка расширены.Проблема в том, что после того, как я закончил свои вычисления, два списка пусты.Вот код, который я использую:

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 внутри функции не помогает.

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

функция report_cv на самом деле не вызывается, попробуйте создать лямбда-функцию или что вы можете, за исключением того, что вы можете сначала вызвать функцию report_cv, а затем сохранить ее значение и использовать его далее

0 голосов
/ 17 июня 2019

Я еще раз посмотрел на это, выяснил, что, вероятно, не так, но сначала ваш код с некоторыми дополнениями:

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 будет работать так, как ожидается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...