Как использовать RandomizedSearchCV или GridSearchCV только для 30% данных - PullRequest
0 голосов
/ 24 марта 2020

Как использовать RandomizedSearchCV или GridSearchCV только для 30% данных, чтобы ускорить процесс. Мой 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_

Ответы [ 2 ]

1 голос
/ 24 марта 2020

Вы всегда можете выбрать часть ваших данных, чтобы соответствовать вашим моделям. Хотя это и не предназначено для этой цели, здесь может пригодиться train_test_split (он может позаботиться о перетасовке, стратификации и т. Д. 1020 *, о которых при ручном отборе проб вы должны позаботиться самостоятельно):

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 теперь будут составлять 30% от вашего начального набора X.

Теперь вы должны заменить все операторы .fit(X, y) в вашем коде на .fit(X_train, y_train).

На более общем уровне все эти операторы np.arange() в вашей сетке выглядят как излишние - я бы предложил выбрать некоторые репрезентативные значения в списке вместо того, чтобы выполнять поиск по сетке в , который деталь. В частности, случайные леса, как известно, нечувствительны к количеству деревьев n_estimators, и вряд ли полезно добавлять по одному дереву за раз - go для чего-то вроде 'n_estimators': [50, 100] ...

0 голосов
/ 24 марта 2020

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) и все готово.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...