Fundamentos del aprendizaje automático: selección de características con Lasso

El primer modelo con el que todos entran en contacto en el aprendizaje automático debería ser la regresión lineal simple, pero a menudo se pasa por alto cuando se aprende Lasso. De hecho, la regresión de Lasso también es un árbol de hoja perenne en los modelos de aprendizaje automático y se usa ampliamente en la industria. En muchos proyectos, especialmente la selección de características verá su sombra.

Lasso agrega la regularización L1 a la regresión lineal simple, que puede reducir los coeficientes de las variables sin importancia a 0, realizando así la selección de características. El enfoque de este artículo es demostrar cómo usarlo para la selección de funciones después de explicar su principio. Espero que pueda obtener nuevos conocimientos.

principio de lazo

Lasso es agregar una norma 1 a la función objetivo de la regresión lineal simple

Recuerde: en la regresión lineal, si el parámetro θ es demasiado grande y hay demasiadas características, fácilmente se producirá un sobreajuste, como se muestra a continuación:20220524162355

Esta foto del Sr. Li Hongyi tiene más impacto visual

20220524111538

Para evitar el sobreajuste (theta es demasiado grande), en la función objetivo j ( θ ) J(\theta) , se agrega un factor de penalización por complejidad, es decir, un término regular, para evitar el sobreajuste y mejorar la capacidad de generalización del modelo. El término regular puede usar L1-norma(Lasso), L2-norma(Ridge) o combinar L1-norma y L2-norma(Elastic Net).

Función de costo para la regresión de lazo

J ( θ ) = 1 2 i m ( y ( i ) θ T x ( i ) ) 2 + λ j n θ j J(\theta)=\frac{1}{2}\sum_{i}^{m}(y^{(i)}-\theta ^Tx^{(i)})^2+\lambda \sum_ {j}^{n}|\theta_j|

Forma matricial:

J ( θ ) = 1 2 n ( X θ Y ) T ( X θ Y ) + α θ 1 J(\mathbf\theta) = \frac{1}{2n}(\mathbf{X\theta} - \mathbf{Y})^T(\mathbf{X\theta} - \mathbf{Y}) + \ alfa||\theta||_1

El izquierdo es Lasso, el derecho es regresión de cresta, β1, β2 son los parámetros del modelo que se optimizarán, la elipse roja es la función objetivo y el área azul es el espacio de solución.

Ya sea regresión de cresta o regresión de lazo, la esencia es a través del ajuste λ yo para lograr un ajuste equilibrado del error y la varianza del modelo. El punto tangente entre la elipse roja y el área azul es la solución óptima de la función objetivo.Se puede ver que la solución óptima de Lasso es más fácil de cortar al eje de coordenadas, formando un resultado disperso (algunos coeficientes son cero). La regresión de Ridge reduce los coeficientes de regresión sin descartar ninguna característica, lo que hace que el modelo sea relativamente estable, pero en comparación con la regresión de Lasso, esto hará que el modelo tenga más características y una mala interpretación del modelo.

Hoy nuestro enfoque está en Lasso, y los objetivos de optimización son: ( 1 / ( 2 n s a m p l e s ) ) y X w 2 2 + a l p h a w 1 (1 / (2 * n_muestras)) * ||y - Xw||^2_2 + alfa * ||w||_1

上式不是连续可导的,因此常规的解法如梯度下降法、牛顿法、就没法用了。常用的方法:坐标轴下降法与最小角回归法(Least-angle regression (LARS))。

这部分就不展开了,感兴趣的同学可以看下刘建平老师的文章《Lasso回归算法: 坐标轴下降法与最小角回归法小结 》,这里不过多赘述。
www.cnblogs.com/pinard/p/60…

想深入研究,可以看下Coordinate Descent和LARS的论文 www.stat.cmu.edu/~ryantibs/c…
arxiv.org/pdf/math/04…

scikit-learn 提供了这两种优化算法的Lasso实现,分别是

sklearn.linear_model.Lasso(alpha=1.0, *, fit_intercept=True, 
normalize='deprecated', precompute=False, copy_X=True,
max_iter=1000, tol=0.0001, warm_start=False, 
positive=False, random_state=None, selection='cyclic')


sklearn.linear_model.lars_path(X, y, Xy=None, *, Gram=None,
max_iter=500, alpha_min=0, method='lar', copy_X=True, 
eps=2.220446049250313e-16, copy_Gram=True, verbose=0, 
return_path=True, return_n_iter=False, positive=False)

用 Lasso 找到特征重要性

在机器学习中,面对海量的数据,首先想到的就是降维,争取用尽可能少的数据解决问题,Lasso方法可以将特征的系数进行压缩并使某些回归系数变为0,进而达到特征选择的目的,可以广泛地应用于模型改进与选择。

La selección de características es un gran tema en el aprendizaje automático

scikit-learn 的Lasso实现中,更常用的其实是LassoCV(沿着正则化路径具有迭代拟合的套索(Lasso)线性模型),它对超参数 α \alpha 使用了交叉验证,来帮忙我们选择一个合适的 α \alpha 。不过GridSearchCV+Lasso也能实现调参,这里就列一下LassoCV的参数、属性和方法。

### 参数
eps:路径的长度。eps=1e-3意味着alpha_min / alpha_max = 1e-3。
n_alphas:沿正则化路径的Alpha个数,默认100。
alphas:用于计算模型的alpha列表。如果为None,自动设置Alpha。
fit_intercept:是否估计截距,默认True。如果为False,则假定数据已经中心化。
tol:优化的容忍度,默认1e-4:如果更新小于tol,优化代码将检查对偶间隙的最优性,并一直持续到它小于tol为止
cv:定交叉验证拆分策略

### 属性

alpha_:交叉验证选择的惩罚量
coef_:参数向量(目标函数公式中的w)。
intercept_:目标函数中的截距。
mse_path_:每次折叠不同alpha下测试集的均方误差。
alphas_:对于每个l1_ratio,用于拟合的alpha网格。
dual_gap_:最佳alpha(alpha_)优化结束时的双重间隔。
n_iter_	int:坐标下降求解器运行的迭代次数,以达到指定容忍度的最优alpha。

### 方法

fit(X, y[, sample_weight, check_input])	用坐标下降法拟合模型。
get_params([deep])	获取此估计器的参数。
path(X, y, *[, l1_ratio, eps, n_alphas, …])	计算具有坐标下降的弹性网路径。
predict(X)	使用线性模型进行预测。
score(X, y[, sample_weight])	返回预测的确定系数R ^ 2。
set_params(**params)	设置此估算器的参数。

Python实战

波士顿房价数据为例

## 导入库 
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import Lasso
import warnings
warnings.filterwarnings('ignore')
##  读取数据
url = r'F:\100-Days-Of-ML-Code\datasets\Regularization_Boston.csv'
df = pd.read_csv(url)

scaler=StandardScaler()
df_sc= scaler.fit_transform(df)
df_sc = pd.DataFrame(df_sc, columns=df.columns)
y = df_sc['price']
X = df_sc.drop('price', axis=1) # becareful inplace= False
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

Lasso调参数,主要就是选择合适的alpha,上面提到LassoCV,GridSearchCV都可以实现,这里为了绘图我们手动实现。

alpha_lasso = 10**np.linspace(-3,1,100)
lasso = Lasso()
coefs_lasso = []

for i in alpha_lasso:
    lasso.set_params(alpha = i)
    lasso.fit(X_train, y_train)
    coefs_lasso.append(lasso.coef_)
    
plt.figure(figsize=(12,10))
ax = plt.gca()
ax.plot(alpha_lasso, coefs_lasso)
ax.set_xscale('log')
plt.axis('tight')
plt.xlabel('alpha')
plt.ylabel('weights: scaled coefficients')
plt.title('Lasso regression coefficients Vs. alpha')
plt.legend(df.drop('price',axis=1, inplace=False).columns)
plt.show()

20220703230521 图中展示的是不同的变量随着alpha惩罚后,其系数的变化,我们要保留的就是系数不为0的变量。alpha值不断增大时系数才变为0的变量在模型中越重要。

我们也可以按系数绝对值大小倒序看下特征重要性,可以设置更大的alpha值,就会看到更多的系数被压缩为0了。

lasso = Lasso(alpha=10**(-3))
model_lasso = lasso.fit(X_train, y_train)
coef = pd.Series(model_lasso.coef_,index=X_train.columns)
print(coef[coef != 0].abs().sort_values(ascending = False))

LSTAT2 2.876424
LSTAT 2.766566
LSTAT4 0.853773
LSTAT5 0.178117
LSTAT10 0.102558
LSTAT9 0.088525
LSTAT8 0.001112
dtype: float64

lasso = Lasso(alpha=10**(-2))
model_lasso = lasso.fit(X_train, y_train)
coef = pd.Series(model_lasso.coef_,index=X_train.columns)
print(coef[coef != 0].abs().sort_values(ascending = False))

LSTAT 1.220552
LSTAT3 0.625608
LSTAT10 0.077125
dtype: float64

或者直接画个柱状图

fea = X_train.columns
a = pd.DataFrame()
a['feature'] = fea
a['importance'] = coef.values

a = a.sort_values('importance',ascending = False)
plt.figure(figsize=(12,8))
plt.barh(a['feature'],a['importance'])
plt.title('the importance features')
plt.show()

20220703230558

总结

La ventaja del método de regresión de Lasso es que puede compensar las deficiencias del método de estimación de mínimos cuadrados y la estimación óptima local de la regresión por pasos, y puede seleccionar bien las características y resolver eficazmente el problema de la multicolinealidad entre las características.

La desventaja es que cuando hay un conjunto de características altamente correlacionadas, el método de regresión de Lasso tiende a seleccionar una de las características e ignorar todas las demás características, lo que puede conducir a la inestabilidad de los resultados.

Aunque el método de regresión de Lasso tiene inconvenientes, aún puede desempeñar un buen papel en escenarios adecuados.

referencia

www.biaodianfu.com/ridge-lasso…
machinelearningcompass.com/machine_lea…
www.cnblogs.com/pinard/p/60…
www.biaodianfu.com/ridge-lasso…

Supongo que te gusta

Origin juejin.im/post/7116163017888235528
Recomendado
Clasificación