Используя набор данных UCI Human Activity Recognition, я пытаюсь создать модель DecisionTreeClassifier. Если параметры по умолчанию и random_state равно 156, модель возвращает следующую точность:
dt_clf = DecisionTreeClassifier(random_state=156)
dt_clf.fit(X_train, y_train)
pred = dt_clf.predict(X_test)
print('DecisionTree Accuracy Score: {0:.4f}'.format(accuracy_score(y_test, pred)))
Вывод:
DecisionTree Accuracy Score: 0.8548
С произвольным набором max_depth, I запустил GridSearchCV, чтобы найти его лучшие параметры:
params = {
'max_depth': [6, 8, 10, 12, 16, 20, 24]
}
grid_cv = GridSearchCV(dt_clf, param_grid=params, scoring='accuracy', cv=5, verbose=1)
grid_cv.fit(X_train, y_train)
print('GridSearchCV Best Score: {0:.4f}'.format(grid_cv.best_score_))
print('GridSearchCV Best Params:', grid_cv.best_params_)
Вывод:
Fitting 5 folds for each of 7 candidates, totalling 35 fits
[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1
concurrent workers. [Parallel(n_jobs=1)]: Done 35 out of 35 |
elapsed: 1.6min finished GridSearchCV Best Score: 0.8513 GridSearchCV
Best Params: {'max_depth': 16}
Теперь я хотел проверить «лучший параметр» max_depth=16
на отдельный набор тестов, чтобы убедиться, что это действительно лучший параметр среди предоставленного списка max_depth = [6, 8, 10, 12, 16, 20, 24]
.
max_depths = [6, 8, 10, 12, 16, 20, 24]
for depth in max_depths:
dt_clf = DecisionTreeClassifier(max_depth=depth, random_state=156)
dt_clf.fit(X_train, y_train)
pred = dt_clf.predict(X_test)
accuracy = accuracy_score(y_test, pred)
print('max_depth = {0} Accuracy: {1:.4f}'.format(depth, accuracy))
Но, к моему удивлению, тест показал, что «лучший параметр» max_depth=16
не где близок к тому, чтобы быть лучшим из всех:
Вывод:
max_depth = 6 Accuracy: 0.8558
max_depth = 8 Accuracy: 0.8707
max_depth = 10 Accuracy: 0.8673
max_depth = 12 Accuracy: 0.8646
max_depth = 16 Accuracy: 0.8575
max_depth = 20 Accuracy: 0.8548
max_depth = 24 Accuracy: 0.8548
Я понимаю, что лучшие параметры из GridSearchCV основаны на средних тестах, полученных в результате перекрестная проверка обучающего набора (X_train, y_train), но разве это не должно отражаться на тестовом наборе в определенной степени? Я предполагаю, что наборы данных UCI не несбалансированы, поэтому смещение набора данных не должно быть проблемой.