函数内部修改的全局列表为空

时间:2019-06-17 12:09:27

标签: python scikit-learn global-variables

我在函数之外创建了两个列表。在多次调用的该函数内部,扩展了这两个列表。问题是我完成计算后,两个列表为空。这是我正在使用的代码:

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 :(得分: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函数,然后保存其值并进一步使用它