对于每种模型,我正在执行以下步骤:
1)拟合模型
2)对第一类(占数据集的5%)进行0.0调用,对于零类进行1.0调用。 (这无法通过gridsearch和class_weight ='balanced'参数解决。)>:(
3)找到最佳阈值
fpr, tpr, thresholds = roc_curve(y_train, model.predict_proba(X_train)[:, 1])
optimal_threshold = thresholds[np.argmax(tpr - fpr)]
4)两种课程的召回率均达到70。
5)预测测试数据集的概率,并使用上面计算出的optimum_threshold来获取类。
这里是一个问题:当我一次又一次地启动代码时,如果我不修正random_state,则最佳阈值是变化的,并且会安静地移动。这会导致基于测试样本的准确性指标发生巨大变化。
我是否需要计算一些平均阈值并将其用作恒定的硬值?或者也许我到处都必须修复random_state?还是发现optimum_threshold的方法不正确?
答案 0 :(得分:1)
如果未将random_state
设置为固定值,则每次运行的结果都会不同。要获得可重现的结果,请将random_state
设置为固定值所需的所有位置,或者使用固定的numpy随机种子numpy.random.seed
。
https://scikit-learn.org/stable/faq.html#how-do-i-set-a-random-state-for-an-entire-execution
Scikit常见问题解答提到最好在需要的地方使用random_state
而不是全局随机状态。
全局随机状态示例:
import numpy as np
np.random.seed(42)
一些在本地设置random_state
的示例:
X_train, X_test, y_train, y_test = train_test_split(sample.data, sample.target, test_size=0.3, random_state=0)
skf = StratifiedKFold(n_splits=10, random_state=0, shuffle=True)
classifierAlgorithm = LGBMClassifier(objective='binary', random_state=0)