问题描述
我正在尝试修复代码中的随机化问题,但每次运行时,我都会获得不同的最佳分数和最佳参数。结果相差不大,但是我如何修复结果以在每次运行时获得相同的最佳分数和参数?
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.25,random_state = 27)
print(X_train.shape,X_test.shape,y_train.shape,y_test.shape)
clf = DecisionTreeClassifier(random_state=None)
parameter_grid = {'criterion': ['gini','entropy'],'splitter': ['best','random'],'max_depth': [1,2,3,4,5,6,8,10,20,30,50],'max_features': [10,40,50]
}
skf = StratifiedKFold(n_splits=10,random_state=None)
skf.get_n_splits(X_train,y_train)
grid_search = gridsearchcv(clf,param_grid=parameter_grid,cv=skf,scoring='precision')
grid_search.fit(X_train,y_train)
print('Best score: {}'.format(grid_search.best_score_))
print('Best parameters: {}'.format(grid_search.best_params_))
clf = grid_search.best_estimator_
y_pred_iris = clf.predict(X_test)
print(confusion_matrix(y_test,y_pred),"\n")
print(classification_report(y_test,"\n")
解决方法
为了获得可重复的结果,代码中的每个随机源都必须明确播种(即使这样,您也必须小心的隐含假设em>所有其他相等实际上都成立 - 请参阅 Why does the importance parameter influence performance of Random Forest in R? 以了解不相等的情况)。
您的代码中的三个部分本质上包含一个随机元素:
train_test_split
DecisionTreeClassifier
StratifiedKFold
您正确地播种了第一个(使用 random_state=27
),但您没有为其他两个做这件事,从而在它们两个中都留下了 random_state=None
。
您应该做的是简单地用显式种子替换代码中 random_state=None
的两种情况,就像您对 train_test_split
所做的那样;它不必是任何特定的数字,甚至在所有情况下都不必是相同的,只需明确设置即可。