Я застрял в этом вопросе уже несколько дней, и мне очень нужна помощь. У меня возникла серьезная проблема с производительностью при использовании нескольких распространенных методов машинного обучения в sklearn. Я работаю над проблемой вероятностного прогнозирования (двоичной классификации) с набором данных, содержащим 5 миллионов наблюдений и 100 функций, используя такие модели, как LogisticRegrade(), MLPClassifier(), RandomForestClassifier() и LinearSVC() из sklearn.
Например, это настройка, которую я использовал для логистической регрессии L2 с перекрестной проверкой, чтобы найти лучший член регуляризации C из сетки c_grid = [1e-15, 1e-10, 1e-5 , 1д-1, 10]:
Код: Выделить всё
lr = LogisticRegression(class_weight=class_weight,
solver='sag', # I also tried 'liblinear'
max_iter=10000,
tol=0.1,
random_state=seed,
penalty='l2')
C = [1e-15, 1e-10, 1e-5, 1e-1, 10]
c_grid = {"C": C}
c_grid = {k: v for k, v in c_grid.items() if v is not None}
...
cv = StratifiedKFold(n_splits=5, random_state=seed, shuffle=True)
clf = GridSearchCV(estimator=lr,
param_grid=c_grid,
scoring='roc_auc',
cv=cv,
return_train_score=True).fit(X_train, Y_train)
best_model = clf.best_estimator_
prob = clf.predict_proba(X_train)[:, 1]
pred = clf.predict(X_train)
Однако весь процесс обучения занял почти 20 часов. Это нормально для набора данных такого размера или это может быть связано с неправильными параметрами или настройками? Например, я скорректировал различные параметры в LogisticRegrade, но ни один из них не улучшил ситуацию.
Плюс, когда я пытался использовать best_model для вычисления результатов тестирования
Код: Выделить всё
prob = clf.predict_proba(X_test)[:, 1]
pred = clf.predict(X_test)
Кажется, это займет целую вечность. Я попробовал распараллелить процесс чем-то вроде
Код: Выделить всё
X_test_batches = np.array_split(X_test, N)
args = [(best_model, batch) for batch in X_test_batches]
with Pool(N) as pool:
prob_batches = pool.map(predict_batch, args)
prob = np.concatenate(prob_batches)
pred = (prob >= 0.5)
но это не слишком помогло, поэтому в конечном итоге мне пришлось вручную реализовать свою собственную функцию прогнозирования (которая, очевидно, работает только для логистики, но не для других моделей, которые я хотел бы протестировать)
Код: Выделить всё
z = np.dot(X_test, best_model.coef_.T) + best_model.intercept_
prob = 1 / (1 + np.exp(-z))
Учитывая, что и обучение, и тестирование занимают неоправданно много времени, я предполагаю, что проблема может быть связана с clf.predict_proba() и clf.predict(). Однако я ожидаю, что sklearn сможет эффективно обрабатывать набор данных из нескольких миллионов наблюдений? Любая помощь будет принята с благодарностью, спасибо!
Подробнее здесь:
https://stackoverflow.com/questions/788 ... es-forever