Я хочу провести честное сравнение между различными моделями машинного обучения. Однако я обнаружил, что модель гребневой регрессии будет автоматически использовать несколько процессоров, и нет параметра, с помощью которого я мог бы ограничить количество используемых процессоров (например, 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()).
Какая у вас ОС?