sklearn SGDClassifier无法使其确定性地进行训练或预测

时间:2018-09-19 19:54:39

标签: python machine-learning scikit-learn

我正在使用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

1 个答案:

答案 0 :(得分:2)

看来sklearn仅在实例化时才检查random_state变量的状态。在这种情况下,我要实例化其他地方,然后设置状态,这太迟了,因为sklearn已经创建了自己的RNG。

在实例化时传递random_state会带来确定性的结果。