Python LASSO максимальное количество ненулевых коэффициентов
У меня есть довольно большой набор данных, который включает в себя более 100 коэффициентов и тысячи записей. Поэтому я хотел бы использовать подход Лассо для обучения модели.
В настоящее время я изучаю документацию sci-kit для:
Хотя реализация кажется простой, мне не удалось найти входной аргумент, который позволяет ограничить максимальное количество ненулевых коэффициентов, например, до 10.
Чтобы быть более понятным, в реализации Matlab Lasso параметр 'DFMax' учитывает вышеизложенное.
Есть ли такая опция в любой реализации Python?
1 ответ
Прямое ограничение числа ненулевых коэффициентов является NP-трудной задачей, и это одна из прелестей LASSO, которая асимптотически решает эту NP-сложную проблему.
Я не знаю реализацию DFMax в Matlab, но я предлагаю сделать следующее:
- Используйте LassoCV, чтобы найти лучшее альфа-значение.
- Если число ненулевых коэффициентов меньше вашего предела, примите это альфа-значение.
- Если число ненулевых коэффициентов больше, чем ваш лимит, используйте 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 ненулевых коэффициентов.