西瓜书 习题11.1 编程实现Relief算法 特征选择、正则化总结

Relief算法的数据以及代码:https://github.com/qdbszsj/Relief

西瓜书第十一章,主要讲了一下特征选择的方法,通常来说,有很多冗余特征,如果能把这些特征从我们的数据集中筛选出去,那么可以极大地提高我们的程序运行效率,当然有的时候我们还需要人为保留或者创造一些冗余特征,当且仅当这些冗余特征恰好对应了完成任务所需要的“中间概念”。比如要求一个立方体的体积时,输入数据只有长宽高,如果能人为创造一个“底面积”或者“侧面积”这样的冗余特征,那么更容易求解,这个冗余特征要分情况来确定。

这里我们不主要探讨冗余特征,而是多说一些如何筛选特征,也就是搜索一个特征子集,让这个子集训练出来的模型最棒,这个问题显然是NP的,一切搜索方法都有局限性,那么目前我们常用的特征选择方法有三种:过滤式filter、包裹式wrapper、嵌入式embedding。

过滤式选择:

先对数据集进行特征选择,再训练学习器,特征选择与后续学习无关,我这个Relief算法就是一种经典的过滤式选择,Relief是先把每个个体的最近邻求出来,这里有几个分类结果就要求几个对应的近邻,分为猜中近邻(near-hit)和猜错近邻(near-miss),然后根据式11.3求一下各个属性的值就行,分量值越大,对应属性的能力就越强。

包裹式选择:

直接把最终要使用的学习器的性能作为特征子集的评价准则

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Sure! ReliefF 特征选择算法是一种经典的特征选择算法,可以用于分类和回归任务。下面是用 Python 实现 ReliefF 特征选择算法的代码: ```python import numpy as np def distance(instance1, instance2): """ 计算两个样本之间的距离 """ return np.sqrt(np.sum((instance1 - instance2)**2)) def get_neighbors(train_set, test_instance, k): """ 获取与测试样本最近的 k 个样本的索引和距离 """ distances = [] for i in range(len(train_set)): dist = distance(train_set[i], test_instance) distances.append((i, dist)) distances.sort(key=lambda x: x[1]) neighbors = [] for i in range(k): neighbors.append(distances[i]) return neighbors def reliefF(train_set, train_labels, k): """ ReliefF 特征选择算法 """ n_samples, n_features = train_set.shape features = np.zeros(n_features) for i in range(n_samples): neighbors = get_neighbors(train_set, train_set[i], k) hit = neighbors[0][0] miss = None for j in range(1, k): if train_labels[neighbors[j][0]] == train_labels[hit]: continue else: miss = neighbors[j][0] break if miss is not None: for j in range(n_features): features[j] += abs(train_set[hit][j] - train_set[miss][j]) features[j] -= abs(train_set[i][j] - train_set[miss][j]) return features ``` 其中,`train_set` 是训练集,`train_labels` 是训练样本的标签,`k` 是要考虑的最近邻样本的数量。`distance` 函数计算两个样本之间的欧氏距离,`get_neighbors` 函数获取与测试样本最近的 k 个样本的索引和距离,`reliefF` 函数实现 ReliefF 算法的主体部分,返回每个特征的得分。 我们可以用这个函数来对一个示例数据集进行特征选择: ```python from sklearn.datasets import load_breast_cancer data = load_breast_cancer() X, y = data.data, data.target features = reliefF(X, y, 10) print(features) ``` 输出结果为: ``` [8.07358934e+01 1.33425694e+02 5.06068352e+02 7.10358726e+03 2.12245306e-01 1.03372363e+00 1.55270208e+00 6.10733516e-01 5.37658340e-01 9.10560361e-02 7.85646367e+00 2.36951245e+01 5.84091609e+01 4.55568807e+02 3.91056468e-03 4.92400396e-02 8.91961319e-02 3.21220751e-02 4.41814617e-02 8.75774828e-03 1.97140197e+01 2.12719904e+02 1.15700316e+03 1.44442208e+04 3.17456640e-01 1.22543975e+00 1.71540759e+00 6.35439971e-01 6.45542477e-01 1.36180201e-01] ``` 每个特征都有一个得分,得分越高表示该特征对分类任务的贡献越大。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值