前言
L1正则化(L1 regularization)通常用于机器学习中的线性回归问题,特别是在lasso回归中。在lasso回归中,损失函数由两部分组成:数据拟合项(通常是平方误差)和L1正则化项。
L1正则化项是模型参数的绝对值之和,它被添加到损失函数中,以限制模型参数的大小。这有助于促使模型更倾向于使用少量的特征,因为一些参数可能会被压缩到零。这在特征选择方面很有用,因为它可以使模型自动选择对预测最重要的特征。
Lasso回归的损失函数可以表示为:
通过调整超参数 λ 的值,可以在模型的复杂度和正则化之间找到平衡。较大的 λ 值会导致更强的正则化,可能使得更多的参数被压缩为零,从而实现特征选择的效果。 L1正则化的主要优点之一是它能够产生稀疏权重矩阵,即使在具有大量特征的数据集上,它也能够自动选择最重要的特征。
代码实现
import pandas as pd
data = pd.read_csv('ATM_sample.csv')
data.head()
数据信息:建立自动柜员机现金需求预测模型是每个银行的重要任务。假设您受雇于一家银行,您的任务是通过对重新加载ATM网络做出更明智的决策来优化银行的现金管理。
数据集ATM_sample中的变量Rwithout。CSV是每天从ATM机提取的现金总额记录在银行的ATM网络上。
| Variable | Description |
| Withdraw | The total cash withdrawn a day (in 1000 local currency) |
| Shops | Number of shops/restaurants within a walkable distance (in 100) |
| ATMs | Number 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)
代码使用Lasso回归对给定的特征进行建模,并通过交叉验证的方式选择最佳的正则化参数(alpha值)。在每个alpha值下,模型在测试集上进行预测,实际值与预测值的散点图用于直观比较。最后,输出在测试集上表现最好的alpha值和相应的均方误差。从而实现L1正则化。当然此时的模型只是为了实现L1正则化,还应考虑继续优化模型。
当建立模型时,可以考虑一些改进方法来提高拟合优度。以下是一些建议:
- 添加交互项: 考虑在模型中添加一些特征之间的交互项。例如,已经添加了一个特征
is_center_weekday,还可以考虑其他可能的交互项,比如Shops * ATMs或其它的问题背景相关的组合。这有助于捕捉特征之间的非线性关系。 - 特征工程: 考虑对特征进行更复杂的变换或提取更多的信息。例如,可以尝试对数变换、平方根变换或其他非线性变换,以更好地符合数据的分布。
- 正则化参数调优: 在代码中,已经通过尝试不同的 alpha 值进行了正则化参数的调优。可以考虑使用网格调参等方法来选择最佳的正则化参数,以进一步提高模型性能。
- 特征选择: 如果存在大量特征,可以考虑使用特征选择方法,如递归特征消除(Recursive Feature Elimination)或基于树模型的特征重要性评估来选择最重要的特征。
- 模型集成: 考虑使用模型集成技术,如随机森林、梯度提升树等,以综合多个模型的预测结果,提高整体性能。
- 异常值处理: 检查并处理可能存在的异常值,以防止它们对模型产生不利影响。
在实践中,尝试不同的方法,并使用交叉验证等技术来评估模型的性能,以确保选择的改进方法对于提高模型性能是有效的。
