0

我目前正在尝试使用sklearn_crfsuite库实现 NER 模型。

训练代码简单如下:

for repeat in range(10):
    crf = sklearn_crfsuite.CRF(
                            algorithm='lbfgs',
                            c1=0.1,
                            c2=0.1,
                            max_iterations=100,
                            all_possible_transitions=True,
                            verbose=True
                        )
    crf.fit(X_train, y_train)
    pred_list = crf.predict(X_test)

代码是做十次重复训练,我的目标是观察 10 个不同的分数并将它们平均作为最终分数。然而,每次重复都会给出相同的分数,尽管我在每个循环中重新初始化了模型。

问题是,我如何正确设置随机种子,以便每次重复都能给出不同的结果?

注意:在每个循环中对训练数据进行混洗后,它仍然给出相同的结果。最后,我将训练算法从 'lbfgs'(使用 L-BFGS 方法的梯度下降)更改为'l2sgd' (使用 L2 正则化的随机梯度下降),然后我开始获得不同的结果。

4

1 回答 1

2

您不搜索随机种子,您可能会搜索交叉验证:

您可以在此处找到完整的文档。

如果你想运行 10 次不同的迭代,你可以使用:

crf = sklearn_crfsuite.CRF(
                            algorithm='lbfgs',
                            max_iterations=100,
                            all_possible_transitions=True,
                            verbose=True
                        )
    
params_space = {
    'c1': scipy.stats.expon(scale=0.5),
    'c2': scipy.stats.expon(scale=0.05),
}

# use the same metric for evaluation
f1_scorer = make_scorer(metrics.flat_f1_score,
                        average='weighted', labels=labels)

# search
rs = RandomizedSearchCV(crf, params_space,
                        cv=10,
                        verbose=1,
                        n_jobs=-1,
                        n_iter=50,
                        scoring=f1_scorer)
rs.fit(X_train, y_train)

你会得到最好的参数

于 2022-01-05T10:41:15.787 回答