在 python 中绘制逻辑回归的 L2 正则化路径的优雅方法?

数据挖掘 Python matplotlib 正则化 套索
2022-03-10 18:12:56

尝试使用以下代码绘制逻辑回归的 L2 正则化路径(正则化路径示例可在 ML 教科书 Elements of Statistical Learning https://web.stanford.edu/~hastie/Papers/ESLII的第 65 页找到.pdf)。有一种感觉,我正在以愚蠢的方式做这件事 - 认为有一种更简单,更优雅的编码方式 - 非常感谢建议。

counter = 0
for c in np.arange(-10, 2, dtype=np.float):    
    lr = LogisticRegression(C = 10**c,
                            fit_intercept=True,
                            solver = 'liblinear',
                            penalty = 'l2',
                            tol = 0.0001,
                            n_jobs = -1,
                            verbose = -1,
                            random_state = 0
                           )
    model=lr.fit(X_train_z, y_train)


    coeff_list=model.coef_.ravel()
    
    if counter == 0:
        coeff_table = pd.DataFrame(pd.Series(coeff_list,index=X_train.columns),columns=[10**c])
    else:
        temp_table = pd.DataFrame(pd.Series(coeff_list,index=X_train.columns),columns=[10**c])
        coeff_table = coeff_table.join(temp_table,how='left')
    counter += 1

plt.rcParams["figure.figsize"] = (20,10)
coeff_table.transpose().iloc[:,:10].plot()
plt.ylabel('weight coefficient')
plt.xlabel('C')
plt.legend(loc='right')
plt.xscale('log')
plt.show()
1个回答

sklearn 已经为回归问题提供了这样的功能,在enet_pathlasso_path. 这里有一个示例笔记本

这些函数具有一些 cython 基础,因此可能比您的版本快得多。您可以在不添加 cython 的情况下在实现中包含的另一项改进是使用“热启动”:附近的 alpha 应该具有相似的系数。所以试试

# This needs to be instantiated outside the loop so we don't start from scratch each time.
lr = LogisticRegression(C = 1,  # we'll override this in the loop
                        warm_start=True,
                        fit_intercept=True,
                        solver = 'liblinear',
                        penalty = 'l2',
                        tol = 0.0001,
                        n_jobs = -1,
                        verbose = -1,
                        random_state = 0
                       )
for c in np.arange(-10, 2, dtype=np.float):
    lr.set_params(C=10**c)
    model=lr.fit(X_train_z, y_train)
    ...