李宏毅机器学习-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
2
3
4
5
6
7
8
9
10
11
12
13
14
# Feature Selection

df = pd.read_csv(tr_path)
target_column = 94
top_key  = 14

y = df.iloc[:,target_column]
X = df.drop(columns=df.columns[target_column])

print(y)
correlations = X.corrwith(y).abs().sort_values(ascending=False).head(top_key)
print(correlations)
selected_features = [df.columns.get_loc(i) - 1 for i in correlations.index]
print("Selected features:\n", selected_features)

这样做有一个好处就是你能自己清楚地把握每一个特征的相关性,然后根据需要选择大于某一阈值的,而不仅仅是机械式的前多少多少个


sklearn

当然,sklearn库早已封装好了相关函数,一起来学习下

Scikit-learn (sklearn) 提供了多种特征选择(Feature Selection)方法,用于从原始数据中筛选出最有价值的特征,以提高模型性能、降低过拟合并减少计算开销。以下是 sklearn 中常用的特征选择方法分类及具体实现:

1. 移除低方差特征(VarianceThreshold)

  • 原理:移除方差低于阈值的特征(方差接近零的特征通常对模型无贡献)。
  • 适用场景适用于删除几乎恒定的特征(如所有样本取值相同)。
  • 示例
    1
    2
    3
    from 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
2
3
from sklearn.feature_selection import SelectKBest, chi2
selector = SelectKBest(chi2, k=10) # 选择卡方检验得分最高的10个特征
X_new = selector.fit_transform(X, y)

3. 递归特征消除(RFE, Recursive Feature Elimination)

  • 原理:通过递归地训练模型(如线性回归、SVM)并移除权重最低的特征,逐步筛选特征。
  • 特点:需要指定最终特征数量或通过交叉验证自动选择(RFECV)。
  • 示例
    1
    2
    3
    4
    5
    from 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(回归)、RandomForestXGBoost 等。

示例:

1
2
3
4
5
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier()
selector = SelectFromModel(model, threshold='median') # 选择重要性高于中位数的特征
X_new = selector.fit_transform(X, y)

完整流程建议

  1. 预处理:先处理缺失值、标准化数据。
  2. 初步筛选:用 VarianceThreshold 或单变量方法减少特征数量。
  3. 精细筛选:结合模型(如 SelectFromModelRFE)和交叉验证。
  4. 验证:比较筛选前后模型的性能(如 AUC、RMSE)。

通过合理组合这些方法,可以高效地优化特征空间,提升模型效果。


L1/L2 正则化

L1/L2 正则化是机器学习中用于防止模型过拟合的核心技术,通过向损失函数添加惩罚项来约束模型参数。以下是关键点总结:

1. L1 正则化(Lasso)

  • 公式:损失函数 + $λ∑|wᵢ|$
    λ控制惩罚强度,wᵢ为模型参数。
  • 特点
    • 稀疏性倾向于将部分参数压缩为0,适用于特征选择
    • 鲁棒性:对异常值不敏感。
    • 不可导性:需用次梯度优化(如坐标下降)。
  • 场景:高维数据、特征冗余时(如基因数据、文本分类)。

2. L2 正则化(Ridge)

  • 公式:损失函数 + $λ∑wᵢ²$
  • 特点
    • 平滑收缩:均匀减小参数值,避免极端权重
    • 可导性:可用梯度下降优化。
    • 抗共线性:缓解特征相关性带来的不稳定。
  • 场景:参数间相关性高(如线性回归、神经网络), 约束参数值,避免模型对训练数据过度敏感,过度依赖某些特征

3. 对比

特性L1L2
稀疏性是(自动特征选择)
解的唯一性可能多解(非严格凸)唯一解(严格凸)
优化方法坐标下降、近端梯度梯度下降、解析解
抗噪声中等

4. 结合使用(Elastic Net)

  • 公式:损失函数 + $λ₁∑|wᵢ| + λ₂∑wᵢ²$
    平衡L1的稀疏性和L2的稳定性,适用于特征维度极高且相关性强的情况。

5.数学直观

  • L1:菱形约束域,最优解常出现在顶点(某些参数为0)。
  • L2:圆形约束域,最优解在边界某点(所有参数非零但小)。

6.代码

  • L2正则化可以在损失函数中手动添加
    1
    2
    3
    4
    5
    6
    7
    8
    for 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/
本文作者
pzhwuhu
发布于
2025年8月16日
更新于
2025年8月16日
许可协议