Оптимизация производительности логистической регрессии GridSearchCV на больших наборах данных в sklearnPython

Программы на Python
Anonymous
Оптимизация производительности логистической регрессии GridSearchCV на больших наборах данных в sklearn

Сообщение Anonymous »

У меня возникла серьезная проблема с производительностью при использовании нескольких распространенных методов машинного обучения в sklearn. Я работаю над проблемой двоичной классификации с набором данных, содержащим 5 миллионов наблюдений и 100 функций, используя такие модели, как LogisticRegrade(), MLPClassifier(), RandomForestClassifier() и LinearSVC( ) из sklearn.
Например, это настройка, которую я использовал для логистической регрессии L2 с перекрестной проверкой, чтобы найти лучший термин регуляризации, C, из сетка c_grid = [1e-15, 1e-10, 1e-5, 1e-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 ... ets-in-skl

Вернуться в «Python»