如何仅对 30% 的数据使用 RandomizedSearchCV 或 GridSearchCV

How to use RandomizedSearchCV or GridSearchCV for only 30% of data

如何仅对 30% 的数据使用 RandomizedSearchCV 或 GridSearchCV 以加快处理速度。 我的 X.shape 是 94456,100,我正在尝试使用 RandomizedSearchCV 或 GridSearchCV,但这需要很长时间。我运行了几个小时的代码,但仍然没有结果。 我的代码如下所示:

# Random Forest

param_grid = [
{'n_estimators': np.arange(2, 25), 'max_features': [2,5,10,25], 
 'max_depth': np.arange(10, 50), 'bootstrap': [True, False]}
]

clf = RandomForestClassifier()

grid_search_forest = GridSearchCV(clf, param_grid, cv=5, scoring='accuracy')
grid_search_forest.fit(X, y)

rf_best_model = grid_search_forest.best_estimator_


# Decsision Tree

param_grid = {'max_depth': np.arange(1, 50), 'min_samples_split': [20, 30, 40]}

grid_search_dec_tree = GridSearchCV(DecisionTreeClassifier(), param_grid, cv=10, scoring='accuracy')
grid_search_dec_tree.fit(X, y)

dt_best_model = grid_search_dec_tree.best_estimator_


# K Nearest Neighbor

knn = KNeighborsClassifier()
k_range = list(range(1, 31))
param_grid = dict(n_neighbors=k_range)
grid_search_knn = GridSearchCV(knn, param_grid, cv=10, scoring='accuracy')

grid_search_knn.fit(X, y)

knn_best_model = grid_search_knn.best_estimator_

您始终可以对数据的一部分进行抽样以适合您的模型。虽然不是为此目的而设计,train_test_split 在这里很有用(它可以处理洗牌、分层等,在手动采样中你必须自己处理):

from sklearn.model_selection import train_test_split
X_train, _, y_train, _ = train_test_split(X, y, stratify=y, test_size=0.70)

通过请求 test_size=0.70,您的训练数据 X_train 现在将是初始数据集 X 的 30%。

您现在应该将代码中的所有 .fit(X, y) 语句替换为 .fit(X_train, y_train)

在更一般的层面上,您的网格中的所有这些 np.arange() 语句看起来有点矫枉过正 - 我建议在列表中选择一些有代表性的值,而不是在 中进行网格搜索 细节。众所周知,随机森林对树的数量 n_estimators 非常不敏感,一次添加一棵树几乎没有用 - 选择 'n_estimators': [50, 100]...

这样的东西

ShuffleSplit 非常适合这个问题。您可以将 cv 定义为:

cv = ShuffleSplit(n_splits=1, test_size=.3)

这意味着预留并使用 30% 的训练数据来验证每个超参数设置。另一方面,cv=5 将进行 5 次交叉验证,这意味着每个超参数设置要经过 5 fitpredict

因此,这也需要对您的代码进行非常小的更改。只需将 GridSearchCV 中的 cv=5cv=10 替换为 cv = ShuffleSplit(n_splits=1, test_size=.3) 即可。