Python LASSO максимальное количество ненулевых коэффициентов

У меня есть довольно большой набор данных, который включает в себя более 100 коэффициентов и тысячи записей. Поэтому я хотел бы использовать подход Лассо для обучения модели.

В настоящее время я изучаю документацию sci-kit для:

Хотя реализация кажется простой, мне не удалось найти входной аргумент, который позволяет ограничить максимальное количество ненулевых коэффициентов, например, до 10.

Чтобы быть более понятным, в реализации Matlab Lasso параметр 'DFMax' учитывает вышеизложенное.

Есть ли такая опция в любой реализации Python?

1 ответ

Решение

Прямое ограничение числа ненулевых коэффициентов является NP-трудной задачей, и это одна из прелестей LASSO, которая асимптотически решает эту NP-сложную проблему.

Я не знаю реализацию DFMax в Matlab, но я предлагаю сделать следующее:

  1. Используйте LassoCV, чтобы найти лучшее альфа-значение.
  2. Если число ненулевых коэффициентов меньше вашего предела, примите это альфа-значение.
  3. Если число ненулевых коэффициентов больше, чем ваш лимит, используйте Lasso и список увеличивающихся альфа-значений с альфа-значением LassoCV в качестве минимального значения, и остановитесь, если число ненулевых коэффициентов равно или ниже вашего порогового значения.

Я не считаю принятый ответ лучшим. Вот пример нахождения определенного количества коэффициентов Лассо.

from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
from scipy.optimize import differential_evolution

X, y = make_classification(n_samples=2000, n_features=50, n_informative=10, random_state=10)
logit = LogisticRegression(penalty='l1', C=1.0)

target = 10

def func(C):
    logit = LogisticRegression(penalty='l1', C=C[0], solver='liblinear')
    logit.fit(X, y)
    n_nonzero = np.sum(logit.coef_ != 0)
    return (target-n_nonzero)**2

differential_evolution(func, bounds=[(0, 2)], tol=0.1, maxiter=20)
     fun: 0.0
 message: 'Optimization terminated successfully.'
    nfev: 212
     nit: 13
 success: True
       x: array([0.03048243])
logit = LogisticRegression(penalty='l1', C=0.03048243, solver='liblinear')
logit.fit(X, y)
np.sum(logit.coef_ != 0)

Мы нашли оптимальный параметр регуляризации, чтобы иметь ровно 10 ненулевых коэффициентов.

Другие вопросы по тегам