L1正则化lasso回归

前言

L1正则化(L1 regularization)通常用于机器学习中的线性回归问题,特别是在lasso回归中。在lasso回归中,损失函数由两部分组成:数据拟合项(通常是平方误差)和L1正则化项。

L1正则化项是模型参数的绝对值之和,它被添加到损失函数中,以限制模型参数的大小。这有助于促使模型更倾向于使用少量的特征,因为一些参数可能会被压缩到零。这在特征选择方面很有用,因为它可以使模型自动选择对预测最重要的特征。

Lasso回归的损失函数可以表示为:

picture.image

picture.image

通过调整超参数 λ 的值,可以在模型的复杂度和正则化之间找到平衡。较大的 λ 值会导致更强的正则化,可能使得更多的参数被压缩为零,从而实现特征选择的效果。 L1正则化的主要优点之一是它能够产生稀疏权重矩阵,即使在具有大量特征的数据集上,它也能够自动选择最重要的特征。

代码实现


          
import pandas as pd
          
data = pd.read_csv('ATM_sample.csv')
          
data.head()
      

picture.image

数据信息:建立自动柜员机现金需求预测模型是每个银行的重要任务。假设您受雇于一家银行,您的任务是通过对重新加载ATM网络做出更明智的决策来优化银行的现金管理。

数据集ATM_sample中的变量Rwithout。CSV是每天从ATM机提取的现金总额记录在银行的ATM网络上。

VariableDescription
WithdrawThe total cash withdrawn a day (in 1000 local currency)
ShopsNumber of shops/restaurants within a walkable distance (in 100)
ATMsNumber of other ATMs within a walkable distance (in 10)
Downtown=1 if the ATM is in downtown, 0 if not
Weekday=1 if the day is weekday, 0 if not
Center=1 if the ATM is located in a center (shopping, airport, etc), 0 if not
High=1 if the ATM has a high cash demand in the last month, 0 if not

          
from sklearn.model_selection import train_test_split
          
X = data[['Shops','ATMs','Downtown','Weekday','Center','High']] 
          
Y = data['Withdraw']
          
Xtrain,Xtest,Ytrain,Ytest = train_test_split(X, Y, test_size = 0.3) #划分训练集 测试集 避免模型过拟合
          

          
from sklearn.linear_model import Lasso
          
from sklearn.metrics import mean_squared_error
          
import matplotlib.pyplot as plt
          

          
# 定义不同的 alpha 值
          
alphas = [0.1, 1, 10, 100]
          

          
best_alpha = None
          
best_mse = float('inf')
          
lasso_model = None
          

          
for alpha in alphas:
          
    lasso_model = Lasso(alpha=alpha, max_iter=1000)
          
    lasso_model.fit(Xtrain, Ytrain)  # 训练 Lasso 模型
          
    Ypred = lasso_model.predict(Xtest)  # 预测
          
    mse = mean_squared_error(Ytest, Ypred)  # 计算均方误差
          
    if mse < best_mse:
          
        best_mse = mse
          
        best_alpha = alpha
          

          
    # 绘制实际值与预测值的散点图,每个 alpha 值使用不同颜色
          
    plt.scatter(Ytest, Ypred, label=f'Alpha={alpha}')
          

          
# 设置散点图的标签和标题
          
plt.xlabel("Actual Values")
          
plt.ylabel("Predicted Values")
          
plt.title("Actual vs. Predicted Values")
          
plt.legend()
          
plt.show()  # 显示散点图
          

          
# 打印最佳 alpha 值和均方误差
          
print("Best Alpha:", best_alpha)
          
print("Mean Squared Error (MSE):", best_mse)
      

picture.image

代码使用Lasso回归对给定的特征进行建模,并通过交叉验证的方式选择最佳的正则化参数(alpha值)。在每个alpha值下,模型在测试集上进行预测,实际值与预测值的散点图用于直观比较。最后,输出在测试集上表现最好的alpha值和相应的均方误差。从而实现L1正则化。当然此时的模型只是为了实现L1正则化,还应考虑继续优化模型。

当建立模型时,可以考虑一些改进方法来提高拟合优度。以下是一些建议:

  1. 添加交互项: 考虑在模型中添加一些特征之间的交互项。例如,已经添加了一个特征 is_center_weekday,还可以考虑其他可能的交互项,比如 Shops * ATMs 或其它的问题背景相关的组合。这有助于捕捉特征之间的非线性关系。
  2. 特征工程: 考虑对特征进行更复杂的变换或提取更多的信息。例如,可以尝试对数变换、平方根变换或其他非线性变换,以更好地符合数据的分布。
  3. 正则化参数调优: 在代码中,已经通过尝试不同的 alpha 值进行了正则化参数的调优。可以考虑使用网格调参等方法来选择最佳的正则化参数,以进一步提高模型性能。
  4. 特征选择: 如果存在大量特征,可以考虑使用特征选择方法,如递归特征消除(Recursive Feature Elimination)或基于树模型的特征重要性评估来选择最重要的特征。
  5. 模型集成: 考虑使用模型集成技术,如随机森林、梯度提升树等,以综合多个模型的预测结果,提高整体性能。
  6. 异常值处理: 检查并处理可能存在的异常值,以防止它们对模型产生不利影响。

在实践中,尝试不同的方法,并使用交叉验证等技术来评估模型的性能,以确保选择的改进方法对于提高模型性能是有效的。

0
0
0
0
评论
未登录
暂无评论