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

问题描述 投票:0回答:2

如何仅对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_
python machine-learning scikit-learn cross-validation
2个回答
0
投票

您总是可以对部分数据进行抽样以适合您的模型。尽管不是为此目的而设计的,但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] ...


0
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.