机器学习笔记 第十一章特征选择与稀疏学习

11.1  子集搜索与评价

        我们将属性称为“特征”,对于当前学习任务有用的属性称为“相关特征”,没什么用的属性称为“无关特征”,“冗余特征”所包含的信息能从其他特征中推演出来,从给定的特征集合·里面选择出相关的特征子集的过程就称为“特征选择”。

特征选择的原因

        \bullet选择重要的特征可以大大减轻维数灾难问题;

        \bullet去除不相关特征往往可以降低学习任务的难度。

        想要从特征集合中选取出一个包含所有重要信息·的特征子集,遍历往往会遭遇组合爆炸。可行的方案是,产生一个“候选子集”,评价其好坏,基于评价结果产生下一个候选子集,再对其进行评价,周而复始,直到无法找到更好的候选子集为止。该过程涉及两个关键问题:子集搜索解决根据评价结果获取下一个候选子集,子集评价解决评价候选特征子集的好坏问题。

        第一个环节是子集搜索。给定特征集合\left \{ a_{1},a_{2},...,a_{d} \right \},对这d个候选单特征子集进行评价,假定\left \{ a_{2} \right \}最优,那么就将\left \{ a_{2} \right \}作为第一轮的选定集;在剩下的d-1个候选两特征子集中\left \{ a_{2},a_{4} \right \}最优,并且其优于\left \{ a_{2} \right \},那么将\left \{ a_{2},a_{4} \right \}作为本轮的选定集;...假设第k+1轮时,最优候选(k+1)特征子集不如上一轮的选定集,则停止,并且将上一轮的k个特征集合作为特征选择结果。

        第二个环节是子集评价。假定数据集D,且第i类样本所占比例为p_{i}(i=1,2,...,|\gamma |),假定本属性均为离散型。对于属性子集A,假设将D分成V个子集\left \{ D^{1},D^{2},...,D^{V} \right \},并且每个子集的样本在A上取值相同,则属性子集A信息增益

Gain(A)=Ent(D)-\sum_{v=1}^{V}\frac{|D^{v}|}{|D|}Ent(D^{v})

其中信息熵为

Ent(D)=-\sum_{i=1}^{|\gamma |}p_{k}log_{2}p_{k}

信息增益越大,那么特征子集A包含的有利于分类的信息越多,所以,我们往往可以用训练数据集D来计算其信息增益,并以此为评价准则。

11.2  过滤式选择

        过滤式选择方法先是对数据集进行特征选择,再训练学习器,这就等价于先用特征选择过程对初始特征进行“过滤”,再用过滤后的特征来训练模型。过滤式选择的代表算法是Relief,该方法设计了一个“相关统计量”来度量特征的重要性。该统计量是一个向量,对应于每个初始特征,只需指定一个阈值\tau,然后选择比\tau大的相关统计量分量所对应的特征即可。

        Relief的关键是怎么确定相关统计量。假定训练集\left \{ (x_{1},y_{1}),(x_{2},y_{2}),...,(x_{m},y_{m}) \right \},对于每个实例x_{i},Relief先在x_{i}的同类样本中寻找最近邻x_{i,nh},即为猜中近邻,再从x_{i}的异类样本中寻找其最近邻x_{i,nm},即为猜错近邻,则相关统计量对应于属性j的分量为

\delta ^{j}=\sum_{i}^{}-diff(x_{i}^{j},x_{i,nh}^{j})^{2}+diff(x_{i}^{j},x_{i,nm}^{j})^{2}

其中x_{a}^{j}表示样本x_{a}在属性j上的取值,diff(x_{a}^{j},x_{b}^{j}),取决于属性j的类型:如果属性j为离散型,则x_{a}^{j}=x_{b}^{j}diff(x_{a}^{j},x_{b}^{j})=0,否则为1;若属性j为连续型,则diff(x_{a}^{j},x_{b}^{j})=|x_{a}^{j}-x_{b}^{j}|

        从上式中可以看出,如果diff(x_{i}^{j},x_{i,nh}^{j})^{2}-diff(x_{i}^{j},x_{i,nm}^{j})^{2}大于0,那么说明属性j对区分同类与异类样本是有益的,于是就增大属性j所对应的统计量分量;反之,则说明属性j起到负面作用,故减小属性j所对应的统计量分量。

        Relief的时间开销随采样次数以及原始特征数线性增长,故是一个运行效率很高的过滤式特征选择算法。

11.3  包裹式选择

        与过滤式特征选择不同,包裹式特征选择就是为给定学习器选择最有利于其性能的特征子集。LVW是一个典型的包裹式特征选择方法,它使用随机策略来进行子集搜索,并以最终分类器的误差为特征子集评价准则。算法描述如下

        上图算法第8行使用交叉验证法来估计学习器\pounds的误差,注意该误差是特征子集A'的误差,若比当前特征子集A上的误差小,则将A'保留下来。需要注意的是,LVW算法若初始特征数很多、T设置较大,则算法在由运行时限的情况下可能给不出解。

        下面是LVW算法的实现代码

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score


def evaluate_feature_subset(X_train, y_train, X_test, y_test, feature_subset):
    
    if len(feature_subset) == 0:
        return 0  # 如果没有选择特征,准确率为0

    # 选择特征子集
    X_train_subset = X_train[:, feature_subset]
    X_test_subset = X_test[:, feature_subset]

    # 训练模型
    model = RandomForestClassifier(n_estimators=10, random_state=42)
    model.fit(X_train_subset, y_train)

    # 预测并评估
    y_pred = model.predict(X_test_subset)
    accuracy = accuracy_score(y_test, y_pred)

    return accuracy


def las_vegas_wrapper(X_train, y_train, X_test, y_test, max_features=None, max_iterations=100):
    
    num_features = X_train.shape[1]
    if max_features is None:
        max_features = num_features

    best_features = []
    best_accuracy = 0

    for _ in range(max_iterations):
        # 随机选择特征子集
        num_selected_features = np.random.randint(1, min(max_features, num_features) + 1)
        feature_subset = np.random.choice(num_features, num_selected_features, replace=False)

        # 评估特征子集
        accuracy = evaluate_feature_subset(X_train, y_train, X_test, y_test, feature_subset)

        # 更新最佳特征子集
        if accuracy > best_accuracy:
            best_accuracy = accuracy
            best_features = feature_subset

    return best_features, best_accuracy


# 示例使用
if __name__ == "__main__":
    # 加载数据集
    data = load_iris()
    X = data.data
    y = data.target

    # 划分数据集
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

    # 执行 Las Vegas Wrapper 算法
    best_features, best_accuracy = las_vegas_wrapper(X_train, y_train, X_test, y_test)
    print("最佳特征子集:", best_features)
    print("最佳准确率:", best_accuracy)

        evaluate_feature_subset函数用来评估给定特征子集的模型性能,返回准确率;las_vegas_wrapper函数执行 Las Vegas Wrapper 算法。它随机选择特征子集,训练模型并评估其性能,最终返回最佳特征子集及其对应的准确率。示例中使用的是鸢尾花数据集,也可以替换为其他数据集进行测试。

11.4  嵌入式选择与L_{1}正则化

        与前两种选择方法不同的是,嵌入式特征选择是将特征选择过程与学习器训练过程融为一体,两者在同一个优化过程中完成。

        给定数据集D=\left \{ (x_{1},y_{1}),(x_{2},y_{2}),...,(x_{m},y_{m}) \right \},其中x\in R^{d},y\in R。考虑线性回归模型,假定以平方误差为损失函数,那么优化目标为

min_{w}\sum_{i=1}^{m}(y_{i}-w^{T}x_{i})^{2}.

        当样本特征过多,但是样本数又相对较少时,上式很可能陷入过拟合。为缓解过拟合,可引入正则化,使用L_{2}范数正则化,有

min_{w}\sum_{i=1}^{m}(y_{i}-w^{T}x_{i})^{2}+\lambda ||w||_{2}^{2}.

        此外,我们还可以将L_{2}范数替换为L_{p},令p=1,即采用L_{1}范数,有

min_{w}\sum_{i=1}^{m}(y_{i}-w^{T}x_{i})^{2}+\lambda ||w||_{1}.

        L_{1}范数和L_{2}范数正则化都有助于降低过拟合风险,但前者更易于获得稀疏解,即它求得的w会有更少的非零向量。

        L_{1}正则化问题的求解可使用近端梯度下降,即令\bigtriangledown表示微分算子,优化目标为

min_{x}f(x)+\lambda ||w||_{1},

f(x)可导,且存在常数L>0使得

||\bigtriangledown f(x')-\bigtriangledown f(x)||_{2}^{2}\leqslant L||x'-x||  (\forall x,x')

则在x_{k}附近可将f(x)通过二阶泰勒展式近似为

\hat{f}(x)\simeq f(x_{k})+\left \langle \bigtriangledown f(x_{k}),x-x_{k} \right \rangle+\frac{L}{2}||x-x_{k}||^{2}

=\frac{L}{2}||x-(x_{k}-\frac{1}{L}\bigtriangledown f(x_{k}))||_{2}^{2}+const

其中const是与x无关的常数,\left \langle .,. \right \rangle表示内积。显然,上式的最小值在x_{k+1}获得

x_{k+1}=x_{k}-\frac{1}{L}\bigtriangledown f(x_{k}).

x_{k+1}=argmin\sum_{\infty }^{}\frac{L}{2}||x-(x_{k}-\frac{1}{L}\bigtriangledown f(x_{k}))||_{2}^{2}+\lambda ||x||_{1},

即在每一步对f(x)进行梯度下降迭代的同时考虑L_{1}范数最小化。对于上式,可先计算z=x_{k}-\frac{1}{L}\bigtriangledown f(x_{k}),然后求解

x_{k+1}=argmin\sum_{\infty }^{}\frac{L}{2}||x-z||_{2}^{2}+\lambda ||x||_{1},

x^{i}表示x的第i个分量,将上式按分量展开可看出,不存在x^{i}x^{j}(i\neq j)这样的项,即x的各分量互不影响,故有闭式解

x_{k+1}^{i}=\begin{cases} z^{i}-\lambda /L & \text{ if } \lambda /L <z^{i}; \\ 0 & \text{ if } |z^{i}|\leqslant \lambda /L; \\ z^{i}+\lambda /L & \text{ if } z^{i}<-\lambda /L , \end{cases}

其中x_{k+1}^{i}z^{i}分别是x_{k+1}与z的第i个分量。

  • 12
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值