如何仅对 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 fit
和 predict
。
因此,这也需要对您的代码进行非常小的更改。只需将 GridSearchCV
中的 cv=5
或 cv=10
替换为 cv = ShuffleSplit(n_splits=1, test_size=.3)
即可。
如何仅对 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 fit
和 predict
。
因此,这也需要对您的代码进行非常小的更改。只需将 GridSearchCV
中的 cv=5
或 cv=10
替换为 cv = ShuffleSplit(n_splits=1, test_size=.3)
即可。