我正在使用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.66
reflectance_standard_scaler__SGD score 0.601
reflectance_standard_scaler__SGD score 0.671
答案 0 :(得分:2)
看来sklearn仅在实例化时才检查random_state变量的状态。在这种情况下,我要实例化其他地方,然后设置状态,这太迟了,因为sklearn已经创建了自己的RNG。
在实例化时传递random_state会带来确定性的结果。