如何修复sklearn中的随机化
How to fix randomization in sklearn
我试图在我的代码中修复随机化,但每次我 运行,我都会得到不同的最佳分数和最佳参数。结果相差不大,但我怎样才能修正结果以获得相同的最佳分数和参数每次 运行?
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,20,30,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,y_pred),"\n")
为了获得可重现的结果,代码中的每个随机源都必须显式播种(即便如此,您也必须请注意 所有其他人都相等 的隐含假设实际上成立 - 请参阅 了解不成立的情况。
您的代码中有三个部分固有地包含一个随机元素:
train_test_split
DecisionTreeClassifier
StratifiedKFold
您正确地播种了第一个(使用 random_state=27
),但是您没有为其他两个播种,在两个中都留下了 random_state=None
。
您应该做的只是用显式种子替换代码中 random_state=None
的两种情况,就像您对 train_test_split
所做的那样;它不必是任何特定的数字,甚至在所有情况下都相同,只需明确设置即可。
我试图在我的代码中修复随机化,但每次我 运行,我都会得到不同的最佳分数和最佳参数。结果相差不大,但我怎样才能修正结果以获得相同的最佳分数和参数每次 运行?
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,20,30,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,y_pred),"\n")
为了获得可重现的结果,代码中的每个随机源都必须显式播种(即便如此,您也必须请注意 所有其他人都相等 的隐含假设实际上成立 - 请参阅
您的代码中有三个部分固有地包含一个随机元素:
train_test_split
DecisionTreeClassifier
StratifiedKFold
您正确地播种了第一个(使用 random_state=27
),但是您没有为其他两个播种,在两个中都留下了 random_state=None
。
您应该做的只是用显式种子替换代码中 random_state=None
的两种情况,就像您对 train_test_split
所做的那样;它不必是任何特定的数字,甚至在所有情况下都相同,只需明确设置即可。