我正在针对公交时刻表的数据集运行一些用于分类目的的算法。具体来说,我运行了一些随机森林,部分源代码如下:
# Instantiate random forest
from sklearn.ensemble import RandomForestClassifier
random_forest = RandomForestClassifier()
# K-Fold Cross Validation (for grid search)
inner_cross_validator = StratifiedKFold(n_splits=k_fold, shuffle=True)
from sklearn.model_selection import GridSearchCV
# Define parameters for grid search
number_of_trees = {'n_estimators': [100, 300, 500]}
max_features_per_tree = {'max_features': [0.2, 0.5, 0.8]}
min_samples_split_per_node = {'min_samples_split': [0.2, 0.5, 0.8]}
parameters = {**number_of_trees, **max_features_per_tree, **min_samples_split_per_node}
# Execute grid search and retrieve the best classifier
best_random_forest = GridSearchCV(estimator=random_forest, param_grid=parameters, scoring='average_precision', cv=inner_cross_validator, n_jobs=3)
best_random_forest.fit(X_train, y_train)
但是,在“网格搜索”之后,精度和召回率几乎根本没有提高。
通常,根据我过去使用其他数据集的经验,与库的默认值相比,我没有注意到网格搜索后各种指标的得分提高超过5%或很少提高10%像SkLearn。
我可以做一些事情(在特征工程阶段之后)以显着提高分类模型的性能吗?
答案 0 :(得分:2)
超参数调整增加5%-10%是显着的增加。您不应期望获得比GridSearch更大的增长。
除了要素工程(具有很大的性能提升范围)之外,您还可以尝试:
随机搜索:在定义的范围内搜索随机选择的超参数值。这应该 http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.RandomizedSearchCV.html
使用其他算法:您当前正在使用RandomForest。这是一种非常有效的方法,可以减少预测的差异并稍微提高性能。但是,其他方法如Gradient Boosting应该可以为您提供更好的性能。
不同算法的组合:这是一个非常广泛的主题,涵盖了多种不同的组合模型以提高性能的方式。 https://www.analyticsvidhya.com/blog/2018/06/comprehensive-guide-for-ensemble-models/