機械学習の基礎:なげなわによる特徴選択

機械学習で誰もが最初に接触するモデルは単純な線形回帰である必要がありますが、ラッソを学習するときに渡されることがよくあります。実際、ラッソ回帰は機械学習モデルの常緑樹でもあり、業界で広く使用されています。多くのプロジェクトでは、特に特徴選択に彼の影が見えます。

Lassoは、単純な線形回帰にL1正則化を追加します。これにより、重要でない変数の係数を0に縮小できるため、特徴選択が実現されます。この記事の焦点は、その原理を説明した後、特徴選択にそれを使用する方法を示すことです。あなたがいくつかの新しい知識を得ることができることを願っています。

投げ縄の原理

ラッソは、単純な線形回帰の目的関数に1ノルムを追加することです。

思い出してください:線形回帰では、パラメーターθが大きすぎて特徴が多すぎると、以下に示すように、過剰適合が発生しやすくなります。20220524162355

李宏毅さんのこの写真は、より視覚的なインパクトがあります

20220524111538

過剰適合(シータが大きすぎる)を防ぐために、目的関数で J ( θ ) J(\ theta) の後に、過剰適合を防ぎ、モデルの一般化能力を強化するために、複雑さのペナルティ係数、つまり通常の項が追加されます。通常の用語では、L1-norm(Lasso)、L2-norm(Ridge)を使用するか、L1-normとL2-norm()を組み合わせるElastic Net

ラッソ回帰のコスト関数

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 |

マトリックス形式:

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})+ \アルファ||\シータ||_1

左はラッソ、右はリッジ回帰、β1、β2は最適化されるモデルパラメーター、赤い楕円は目的関数、青い領域は解空間です。

リッジ回帰であろうとラッソ回帰であろうと、本質は調整によるものです λ l モデルの誤差と分散のバランスの取れた調整を実現するための赤い楕円と青い領域の間の接点は、目的関数の最適解です。ラッソの最適解は、座標軸に合わせて切り取りやすく、まばらな結果を形成していることがわかります(一部の係数はゼロです)。リッジ回帰は、特徴を破棄せずに回帰係数を減らし、モデルを比較的安定させますが、ラッソ回帰と比較すると、モデルの特徴が多くなり、モデルの解釈が不十分になります。

今日、私たちはラッソに焦点を当てており、最適化の目標は次のとおりです。 ( 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_samples))* || y --Xw || ^ 2_2 + alpha * || 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,进而达到特征选择的目的,可以广泛地应用于模型改进与选择。

特徴選択は機械学習の大きなトピックです

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

总结

ラッソ回帰法の利点は、最小二乗推定法とステップワイズ回帰の局所最適推定の欠点を補い、特徴を適切に選択し、特徴間の多重共線性の問題を効果的に解決できることです。

不利な点は、相関性の高い特徴のセットがある場合、ラッソ回帰法は特徴の1つを選択し、他のすべての特徴を無視する傾向があり、結果が不安定になる可能性があることです。

ラッソ回帰法には欠点がありますが、それでも適切なシナリオで適切な役割を果たすことができます。

参照

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

おすすめ

転載: juejin.im/post/7116163017888235528