-1

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

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没有帮助。

4

2 回答 2

0

report_cv 函数实际上没有被调用,尝试构建一个 lambda 函数或者你可以的,除了你可以先调用 report_cv 函数,然后保存它的值并进一步使用它

于 2019-06-17T12:55:57.260 回答
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首次调用时设置它们的值。

然后,正如@Goyo 所提到的,这确实是问题所在,report_cv没有被调用。从 scikit 学习文档: https ://scikit-learn.org/stable/modules/generated/sklearn.metrics.make_scorer.html

这个工厂函数包装了评分函数,用于 GridSearchCV 和 cross_val_score。它接受一个评分函数,例如accuracy_score、mean_squared_error、adjusted_rand_index 或average_precision,并返回一个对估计器的输出进行评分的可调用函数。

所以返回一个可调用的包装,不暗示调用

我挂了电话report_cv。你需要给它赋值。这将使全局变量的行为符合您的预期,列表不应再为空,但我不能保证它会使此 sklearn 代码的其余部分按预期运行。

于 2019-06-17T12:23:36.160 回答