Я хочу провести честное сравнение между различными моделями машинного обучения. Однако я обнаружил, что модель гребневой регрессии будет автоматически использовать несколько процессоров, и нет параметра, с помощью которого я мог бы ограничить количество используемых процессоров (например, n_jobs). Есть ли какой-нибудь способ решить эту проблему?
Минимальный пример:
from sklearn.datasets import make_regression
from sklearn.linear_model import RidgeCV
features, target = make_regression(n_samples=10000, n_features=1000)
r = RidgeCV()
r.fit(features, target)
print(r.score(features, target))
Вот это попробуйте посмотреть здесь sklearn.utils.parallel_backend думаю можно настроить количество ядер для расчета с помощью параметра njobs.
К сожалению, это не полезная мера.
Если вы установите для переменной окружения OMP_NUM_THREADS
значение n
, вы получите ожидаемое поведение. Например. в Linux выполните export OMP_NUM_THREADS=1
в терминале, чтобы ограничить использование до 1 процессора.
В зависимости от вашей системы вы также можете установить его непосредственно в python. См., например. Как установить переменные окружения в Python?
На основе документов для RidgeCV
:
Ридж-регрессия со встроенной перекрестной проверкой.
По умолчанию он выполняет перекрестную проверку «Оставить один-один», которая является формой эффективной перекрестной проверки «Оставить один-один».
И по умолчанию вы используете None
- чтобы использовать эффективную перекрестную проверку Leave-One-Out.
Альтернативный подход с ridge regression
и cross validation
:
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import Ridge
clf = Ridge(a)
scores = cross_val_score(clf, features, target, cv=1, n_jobs=1)
print(scores)
См. также документы Ridge и cross_val_score.
Пытаясь расширить ответ @PV8, каждый раз, когда вы создаете экземпляр RidgeCV()
без явной установки параметра cv
(как в вашем случае), происходит то, что выполняется перекрестная проверка Efficient Leave One Out (в соответствии с алгоритмами, на которые ссылается здесь , реализация здесь).
С другой стороны, при явной передаче параметра cv
в RidgeCV()
происходит следующее:
model = Ridge()
parameters = {'alpha': [0.1, 1.0, 10.0]}
gs = GridSearchCV(model, param_grid=parameters)
gs.fit(features, target)
print(gs.best_score_)
(как вы можете видеть здесь), а именно, что вы будете использовать GridSearchCV
по умолчанию n_jobs=None
.
Самое главное, как указал один из sklearn
основных разработчиков здесь, проблема, с которой вы экспериментируете, может зависеть не от sklearn
, а от
[...] ваша установка numpy, выполняющая векторизованные операции с параллелизмом.
(где векторизованные операции выполняются в вычислительно эффективной процедуре перекрестной проверки LOO, которую вы неявно вызываете, не передавая cv
в RidgeCV()
).
Какая у вас ОС?