我正在使用 sklearn.linear_model.SGDClassifier 训练一个简单的线性模型。我注意到在完全相同的训练集上进行训练时,有时会得到截然不同的结果。我正在进行一个实验,尝试固定特征构建流程和样本选择,看看初始随机状态对分类器结果的影响。因此,我尝试多次循环运行相同的拟合和预测代码,每次重新实例化分类器对象并将种子设置为123456。
classif['classifier'].random_state = 123456 classif['classifier'].fit(LABELED, LABELS) y_test = classif['classifier'].predict(TEST_LABELED[:1000]) classif['accuracy_over_iter'] = np.append(classif['accuracy_over_iter'], accuracy_score(TEST_LABELS[:1000], y_test)) classif["score"] = accuracy_score(TEST_LABELS[:1000], y_test) print(f'{classif["description"]} score {classif["score"]}')
之后,每个训练的分类器最终都会产生略有不同的预测。我是否没有正确设置种子?
reflectance_standard_scaler__SGD score 0.642 reflectance_standard_scaler__SGD score 0.644 reflectance_standard_scaler__SGD score 0.632 reflectance_standard_scaler__SGD score 0.623 reflectance_standard_scaler__SGD score 0.66reflectance_standard_scaler__SGD score 0.601 reflectance_standard_scaler__SGD score 0.671
回答:
看起来 sklearn 仅在实例化时检查 random_state 变量的状态。在这种情况下,我在别处实例化,然后再设置状态,这已经太晚了,因为 sklearn 已经创建了自己的随机数生成器。
在实例化时传递 random_state 可以得到确定性的结果。