李宏毅机器学习-HW1 Notebook
这是我完成李宏毅机器学习2021作业1时记录的一些笔记 ,希望能对你有所帮助😊
作业1是**HW1-COVID-19 Cases Prediction(Regression)**,是一个回归任务,kaggle链接
下面是 strong baseline
的要求:
Strong Baseline
- Feature selection (what other features are useful?)
- DNN architecture (layers? dimension? activation function?)
- Training (mini-batch? optimizer? learning rate?)
- L2 regularization
- There are some mistakes in the sample code, can you find them?
特征选择
源数据有94列,肯定不能一股脑地全拿来训练,我们需要进行特征选择。我是用的比较传统的计算相关性的方法,然后排序,取前k个,大致代码如下:
1 |
|
这样做有一个好处就是你能自己清楚地把握每一个特征的相关性,然后根据需要选择大于某一阈值的,而不仅仅是机械式的前多少多少个
sklearn
当然,sklearn
库早已封装好了相关函数,一起来学习下
Scikit-learn (sklearn)
提供了多种特征选择(Feature Selection)方法,用于从原始数据中筛选出最有价值的特征,以提高模型性能、降低过拟合并减少计算开销。以下是 sklearn 中常用的特征选择方法分类及具体实现:
1. 移除低方差特征(VarianceThreshold)
- 原理:移除方差低于阈值的特征(方差接近零的特征通常对模型无贡献)。
- 适用场景:适用于删除几乎恒定的特征(如所有样本取值相同)。
- 示例:
1
2
3from sklearn.feature_selection import VarianceThreshold
selector = VarianceThreshold(threshold=0.1) # 移除方差 <0.1 的特征
X_new = selector.fit_transform(X)
2. 单变量特征选择(Univariate Selection)
基于统计检验或模型对每个特征单独评估,选择最佳特征。
方法:
- SelectKBest:选择得分最高的前
k
个特征。 - SelectPercentile:选择得分最高的前
percentile%
特征。 - 常用统计检验:
- 分类问题:
chi2
(卡方检验)、f_classif
(ANOVA F值)、mutual_info_classif
(互信息)。 - 回归问题:
f_regression
(F检验)、mutual_info_regression
(互信息)。
- 分类问题:
示例:
1 |
|
3. 递归特征消除(RFE, Recursive Feature Elimination)
- 原理:通过递归地训练模型(如线性回归、SVM)并移除权重最低的特征,逐步筛选特征。
- 特点:需要指定最终特征数量或通过交叉验证自动选择(
RFECV
)。 - 示例:
1
2
3
4
5from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
selector = RFE(model, n_features_to_select=5) # 选择5个特征
X_new = selector.fit_transform(X, y)
4. 基于模型权重的特征选择
- 原理:使用具有特征重要性或系数权重的模型(如线性模型、树模型)筛选特征。
- 方法:
SelectFromModel
:根据模型权重或重要性阈值选择特征。- 适用于:
Lasso
(回归)、RandomForest
、XGBoost
等。
示例:
1 |
|
完整流程建议
- 预处理:先处理缺失值、标准化数据。
- 初步筛选:用
VarianceThreshold
或单变量方法减少特征数量。 - 精细筛选:结合模型(如
SelectFromModel
或RFE
)和交叉验证。 - 验证:比较筛选前后模型的性能(如 AUC、RMSE)。
通过合理组合这些方法,可以高效地优化特征空间,提升模型效果。
L1/L2 正则化
L1/L2 正则化是机器学习中用于防止模型过拟合的核心技术,通过向损失函数添加惩罚项来约束模型参数。以下是关键点总结:
1. L1 正则化(Lasso)
- 公式:损失函数 + $λ∑|wᵢ|$
λ控制惩罚强度,wᵢ为模型参数。 - 特点:
- 稀疏性:倾向于将部分参数压缩为0,适用于特征选择。
- 鲁棒性:对异常值不敏感。
- 不可导性:需用次梯度优化(如坐标下降)。
- 场景:高维数据、特征冗余时(如基因数据、文本分类)。
2. L2 正则化(Ridge)
- 公式:损失函数 + $λ∑wᵢ²$
- 特点:
- 平滑收缩:均匀减小参数值,避免极端权重。
- 可导性:可用梯度下降优化。
- 抗共线性:缓解特征相关性带来的不稳定。
- 场景:参数间相关性高(如线性回归、神经网络), 约束参数值,避免模型对训练数据过度敏感,过度依赖某些特征。
3. 对比
特性 | L1 | L2 |
---|---|---|
稀疏性 | 是(自动特征选择) | 否 |
解的唯一性 | 可能多解(非严格凸) | 唯一解(严格凸) |
优化方法 | 坐标下降、近端梯度 | 梯度下降、解析解 |
抗噪声 | 强 | 中等 |
4. 结合使用(Elastic Net)
- 公式:损失函数 + $λ₁∑|wᵢ| + λ₂∑wᵢ²$
平衡L1的稀疏性和L2的稳定性,适用于特征维度极高且相关性强的情况。
5.数学直观
- L1:菱形约束域,最优解常出现在顶点(某些参数为0)。
- L2:圆形约束域,最优解在边界某点(所有参数非零但小)。
6.代码
- L2正则化可以在损失函数中手动添加
1
2
3
4
5
6
7
8for epoch in range(n_epochs):
optimizer.zero_grad()
y_pred = model(X_tensor)
loss = nn.MSELoss()(y_pred, y_target)
l2_reg = torch.sum(model.weight ** 2) # L2惩罚项(不包含偏置)
total_loss = loss + lambda_l2 * l2_reg # 总损失
total_loss.backward()
optimizer.step() - 也可以直接在优化器中加
weight_decay
实现,比如:1
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3, weight_decay=1e-4)
李宏毅机器学习-HW1 Notebook
http://pzhwuhu.github.io/2025/08/16/HW1 Notebook/