Базовые знания, необходимые для прочтения этой статьи: гребневая регрессия, регрессия Лассо, немного знаний в области программирования.
Введение
Мы изучили два метода регуляризации: регрессия гребня и регрессия Лассо.Когда несколько функций коррелируют, регрессия Лассо может случайным образом выбрать только один из них, а регрессия гребня выберет все функции. В настоящее время легко думать, что если объединить эти два метода регуляризации, можно объединить преимущества двух методов.Этот регуляризованный алгоритм называетсяЭластичная чистая регрессия1(эластичная чистая регрессия)
2. Введение в модель
Функция стоимости алгоритма эластичной сетевой регрессии сочетает в себе методы регуляризации регрессии Лассо и гребневой регрессии и контролирует размер штрафного члена с помощью двух параметров λ и ρ.
также заключается в том, чтобы найти размер w при минимизации функции стоимости:
Можно видеть, что при ρ = 0 функция стоимости эквивалентна функции стоимости гребневой регрессии, а при ρ = 1 функция стоимости эквивалентна функции стоимости регрессии Лассо. Как и в регрессии Лассо, в функции стоимости есть абсолютное значение, которое не везде можно вывести, поэтому нет возможности напрямую получить аналитическое решение w путем прямого вывода, но все же можно использоватьКоординатный метод спуска2(координатный спуск), чтобы найти w.
3. Шаги алгоритма
Координатный метод спуска:
Метод решения метода координатного спуска такой же, как шаги, используемые в регрессии Лассо, с той лишь разницей, что функция стоимости отличается.
Конкретные шаги:
(1) Инициализируйте весовой коэффициент w, такой как нулевой вектор.
(2) Перебрать все весовые коэффициенты, взять один из весовых коэффициентов в качестве переменной по очереди, а остальные весовые коэффициенты в результате предыдущего вычисления зафиксировать как константу и найти оптимальное решение при наличии только одного весового коэффициента. переменная в текущих условиях.
В k-й итерации способ обновления весового коэффициента следующий:
(3) Шаг (2) является полной итерацией, когда все весовые коэффициенты меняются незначительно или достигают максимального числа итераций, итерация завершается.
В-четвертых, реализация кода
Реализуйте алгоритм эластичной чистой регрессии (координатный спуск) с помощью Python:
def elasticNet(X, y, lambdas=0.1, rhos=0.5, max_iter=1000, tol=1e-4):
"""
弹性网络回归,使用坐标下降法(coordinate descent)
args:
X - 训练数据集
y - 目标标签值
lambdas - 惩罚项系数
rhos - 混合参数,取值范围[0,1]
max_iter - 最大迭代次数
tol - 变化量容忍值
return:
w - 权重系数
"""
# 初始化 w 为零向量
w = np.zeros(X.shape[1])
for it in range(max_iter):
done = True
# 遍历所有自变量
for i in range(0, len(w)):
# 记录上一轮系数
weight = W[i]
# 求出当前条件下的最佳系数
w[i] = down(X, y, w, i, lambdas, rhos)
# 当其中一个系数变化量未到达其容忍值,继续循环
if (np.abs(weight - w[i]) > tol):
done = False
# 所有系数都变化不大时,结束循环
if (done):
break
return w
def down(X, y, w, index, lambdas=0.1, rhos=0.5):
"""
cost(w) = (x1 * w1 + x2 * w2 + ... - y)^2 / 2n + ... + λ * ρ * (|w1| + |w2| + ...) + [λ * (1 - ρ) / 2] * (w1^2 + w2^2 + ...)
假设 w1 是变量,这时其他的值均为常数,带入上式后,其代价函数是关于 w1 的一元二次函数,可以写成下式:
cost(w1) = (a * w1 + b)^2 / 2n + ... + λρ|w1| + [λ(1 - ρ)/2] * w1^2 + c (a,b,c,λ 均为常数)
=> 展开后
cost(w1) = [aa / 2n + λ(1 - ρ)/2] * w1^2 + (ab / n) * w1 + λρ|w1| + c (aa,ab,c,λ 均为常数)
"""
# 展开后的二次项的系数之和
aa = 0
# 展开后的一次项的系数之和
ab = 0
for i in range(X.shape[0]):
# 括号内一次项的系数
a = X[i][index]
# 括号内常数项的系数
b = X[i][:].dot(w) - a * w[index] - y[i]
# 可以很容易的得到展开后的二次项的系数为括号内一次项的系数平方的和
aa = aa + a * a
# 可以很容易的得到展开后的一次项的系数为括号内一次项的系数乘以括号内常数项的和
ab = ab + a * b
# 由于是一元二次函数,当导数为零是,函数值最小值,只需要关注二次项系数、一次项系数和 λ
return det(aa, ab, X.shape[0], lambdas, rhos)
def det(aa, ab, n, lambdas=0.1, rhos=0.5):
"""
通过代价函数的导数求 w,当 w = 0 时,不可导
det(w) = [aa / n + λ(1 - ρ)] * w + ab / n + λρ = 0 (w > 0)
=> w = - (ab / n + λρ) / [aa / n + λ(1 - ρ)]
det(w) = [aa / n + λ(1 - ρ)] * w + ab / n - λρ = 0 (w < 0)
=> w = - (ab / n - λρ) / [aa / n + λ(1 - ρ)]
det(w) = NaN (w = 0)
=> w = 0
"""
w = - (ab / n + lambdas * rhos) / (aa / n + lambdas * (1 - rhos))
if w < 0:
w = - (ab / n - lambdas * rhos) / (aa / n + lambdas * (1 - rhos))
if w > 0:
w = 0
return w
5. Реализация сторонней библиотеки
scikit-learn3выполнить:
from sklearn.linear_model import ElasticNet
# 初始化弹性网络回归器
reg = ElasticNet(alpha=0.1, l1_ratio=0.5, fit_intercept=False)
# 拟合线性模型
reg.fit(X, y)
# 权重系数
w = reg.coef_
6. Демонстрация анимации
Следующая анимация показывает влияние различных ρ на эластичную регрессию сети.Когда ρ постепенно увеличивается, преобладает регулярный член L1, а функция стоимости ближе к регрессии Лассо.Когда ρ постепенно уменьшается, преобладает регулярный член L2, и стоимость ближе функция к гребневой регрессии.
Следующая анимация показывает сравнение между регрессией Лассо и регрессией эластичной сети, Пунктирная линия представляет десять признаков регрессии Лассо, сплошная линия представляет десять признаков регрессии эластичной сети, и каждый цвет представляет весовой коэффициент независимой переменной ( тренировочные данные взяты из sklearn сахарный диабет). наборы данных)
Лассо-регрессия против эластичной чистой регрессииМожно видеть, что по сравнению с регрессией Лассо регрессия эластичной сети сохраняет свойства выбора признаков регрессии Лассо и учитывает стабильность регрессии гребня.
Семь, интеллект-карта
8. Ссылки
- En. Wikipedia.org/wiki/Эль упоминал…
- En.wikipedia.org/wiki/co или низкая…
- SCI kit-learn.org/stable/Modu…
Нажмите для полной демонстрацииздесь
Примечание. Эта статья стремится быть точной и легкой для понимания, но поскольку автор также новичок и имеет ограниченный уровень, если в тексте есть ошибки или упущения, я призываю читателей критиковать и исправлять их, оставляя сообщение.
Эта статья была впервые опубликована на -карта ИИ, добро пожаловать, чтобы следовать