如何仅对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()
语句看起来都过分了-我建议您在列表中选择一些有代表性的值,而不要通过that详细信息进行网格搜索。众所周知,尤其是随机森林对树的数量n_estimators
不敏感,并且一次添加一棵树几乎没有用,例如'n_estimators': [50, 100]
...
ShuffleSplit非常适合此问题。您可以将cv
定义为:
cv = ShuffleSplit(n_splits=1, test_size=.3)
这意味着预留并使用30%的训练数据来验证每个超参数设置。另一方面,cv=5
将执行5倍交叉验证,这意味着每个超参数设置都要经过5 fit
和predict
。
因此,这还需要对代码进行非常小的更改。只需将cv=5
中的cv=10
或GridSearchCV
替换为cv = ShuffleSplit(n_splits=1, test_size=.3)
,就可以完成。