版权声明:本文为博主原创文章,转载时请附上原文链接:https://blog.csdn.net/qq_40871363/article/details/86511843

Relief算法python实现

  • 一、特征选择算法简介
    • (一)子集搜索与评价
    • (二)特征选择分类
      • 1. 过滤式特征选择
      • 2. 包裹式特征选择
      • 3. 嵌入式特征选择
  • 二、Relief算法简介
    • (一)原理
    • (二)伪算法
  • 三、Relief算法python实现
    • (一)代码

一、特征选择算法简介

对一个学习任务,给定它的数据属性集,属性即为“特征”。其中有些属性对学习任务有用称之为“相关特征”,有些属性无用则称之为“无关特征”。无关特征的存在不仅会在一定程度上加大数据集的冗余程度,还会在学习任务过程中造成不小的影响。因此,从给定的特征集合中选择出相关特征子集非常必要,而这个过程,即为“特征选择”。特征选择有两个显著的好处,一是可以起到降维的作用,二是可以减小学习任务的训练难度。
如何选择出相关特征子集?穷举显然是不合适的。我们希望可以给它一个初始集合,称之为“候选集合”,然后评价其的好坏,基于评价结果生成下一个候选集合,如此循环,直至无法找到更好的候选集合为止。当然这种方法容易让结果陷入局部最优。那么采用这种方法,关键在于两点:如何根据评价结果产生下一个候选特征子集?如何评价一个候选特征子集的好坏?下面将根据此作简单介绍。

(一)子集搜索与评价

第一个关键点是“子集搜索”问题,第二个关键点是“子集评价”问题。关于子集搜索,常见的方法有“前向搜索”、“后向搜索”、“双向搜索”等。关于子集评价,方法之一是计算信息熵增益,以此作为评价标准。将特征子集搜索与子集评价结合起来,即可进行特征选择。

(二)特征选择分类

常见的特征选择大致可分为三类:过滤式、包裹式和嵌入式。其中,Relief算法针对二分类进行特征选择,ReliefF算法针对多分类进行特征选择,ReliefF算法详细参见博文:https://blog.csdn.net/qq_40871363/article/details/86594578

1. 过滤式特征选择

2. 包裹式特征选择

3. 嵌入式特征选择

本文主要对过滤式特征选择算法进行python实现。

二、Relief算法简介

待补充

(一)原理

待补充

(二)伪算法

待补充

三、Relief算法python实现

(一)代码

代码片

// An highlighted block
# _*_ coding:utf8 _*_"""
# 说明:特征选择方法一:过滤式特征选择(Relief算法)
# 思想:先用特征选择过程对初始特征进行"过滤",然后再用过滤后的特征训练模型
# 时间:2019-1-14
# 问题:
"""import pandas as pd
import numpy as np
import numpy.linalg as la
import random# 异常类
class FilterError:passclass Filter:def __init__(self, data_df, sample_rate, t, k):"""#:param data_df: 数据框(字段为特征,行为样本):param sample_rate: 抽样比例:param t: 统计量分量阈值:param k: 选取的特征的个数"""self.__data = data_dfself.__feature = data_df.columnsself.__sample_num = int(round(len(data_df) * sample_rate))self.__t = tself.__k = k# 数据处理(将离散型数据处理成连续型数据,比如字符到数值)def get_data(self):new_data = pd.DataFrame()for one in self.__feature[:-1]:col = self.__data[one]if (str(list(col)[0]).split(".")[0]).isdigit() or str(list(col)[0]).isdigit() or (str(list(col)[0]).split('-')[-1]).split(".")[-1].isdigit():new_data[one] = self.__data[one]# print '%s 是数值型' % oneelse:# print '%s 是离散型' % onekeys = list(set(list(col)))values = list(xrange(len(keys)))new = dict(zip(keys, values))new_data[one] = self.__data[one].map(new)new_data[self.__feature[-1]] = self.__data[self.__feature[-1]]return new_data# 返回一个样本的猜中近邻和猜错近邻def get_neighbors(self, row):df = self.get_data()row_type = row[df.columns[-1]]right_df = df[df[df.columns[-1]] == row_type].drop(columns=[df.columns[-1]])wrong_df = df[df[df.columns[-1]] != row_type].drop(columns=[df.columns[-1]])aim = row.drop(df.columns[-1])f = lambda x: eulidSim(np.mat(x), np.mat(aim))right_sim = right_df.apply(f, axis=1)right_sim_two = right_sim.drop(right_sim.idxmin())# print right_sim_two# print right_sim.values.argmax()   # np.argmax(wrong_sim)wrong_sim = wrong_df.apply(f, axis=1)# print wrong_sim# print wrong_sim.values.argmax()# print right_sim_two.idxmin(), wrong_sim.idxmin()return right_sim_two.idxmin(), wrong_sim.idxmin()# 计算特征权重def get_weight(self, feature, index, NearHit, NearMiss):data = self.__data.drop(self.__feature[-1], axis=1)row = data.iloc[index]nearhit = data.iloc[NearHit]nearmiss = data.iloc[NearMiss]if (str(row[feature]).split(".")[0]).isdigit() or str(row[feature]).isdigit() or (str(row[feature]).split('-')[-1]).split(".")[-1].isdigit():max_feature = data[feature].max()min_feature = data[feature].min()right = pow(round(abs(row[feature] - nearhit[feature]) / (max_feature - min_feature), 2), 2)wrong = pow(round(abs(row[feature] - nearmiss[feature]) / (max_feature - min_feature), 2), 2)# w = wrong - rightelse:right = 0 if row[feature] == nearhit[feature] else 1wrong = 0 if row[feature] == nearmiss[feature] else 1# w = wrong - rightw = wrong - right# print wreturn w# 过滤式特征选择def relief(self):sample = self.get_data()# print samplem, n = np.shape(self.__data)  # m为行数,n为列数score = []sample_index = random.sample(range(0, m), self.__sample_num)print '采样样本索引为 %s ' % sample_indexnum = 1for i in sample_index:    # 采样次数one_score = dict()row = sample.iloc[i]NearHit, NearMiss = self.get_neighbors(row)print '第 %s 次采样,样本index为 %s,其NearHit行索引为 %s ,NearMiss行索引为 %s' % (num, i, NearHit, NearMiss)for f in self.__feature[0:-1]:w = self.get_weight(f, i, NearHit, NearMiss)one_score[f] = wprint '特征 %s 的权重为 %s.' % (f, w)score.append(one_score)num += 1f_w = pd.DataFrame(score)print '采样各样本特征权重如下:'print f_wprint '平均特征权重如下:'print f_w.mean()return f_w.mean()# 返回最终选取的特征def get_final(self):f_w = pd.DataFrame(self.relief(), columns=['weight'])final_feature_t = f_w[f_w['weight'] > self.__t]print final_feature_tfinal_feature_k = f_w.sort_values('weight').head(self.__k)print final_feature_kreturn final_feature_t, final_feature_k# 几种距离求解
def eulidSim(vecA, vecB):return la.norm(vecA - vecB)def cosSim(vecA, vecB):""":param vecA: 行向量:param vecB: 行向量:return: 返回余弦相似度(范围在0-1之间)"""num = float(vecA * vecB.T)denom = la.norm(vecA) * la.norm(vecB)cosSim = 0.5 + 0.5 * (num / denom)return cosSimdef pearsSim(vecA, vecB):if len(vecA) < 3:return 1.0else:return 0.5 + 0.5 * np.corrcoef(vecA, vecB, rowvar=0)[0][1]if __name__ == '__main__':data = pd.read_csv('西瓜数据集3.csv')[['色泽', '根蒂', '敲击', '纹理', '脐部', '触感', '密度', '含糖率', '类别']]print dataf = Filter(data, 1, 0.8, 6)f.relief()# f.get_final()

特征选择算法之Relief算法python实现相关推荐

  1. 浅谈关于特征选择算法与Relief的实现

    一. 背景 1) 问题 在机器学习的实际应用中,特征数量可能较多,其中可能存在不相关的特征,特征之间也可能存在相关性,容易导致如下的后果: 1.     特征个数越多,分析特征.训练模型所需的时间就越 ...

  2. 特征选择算法----Relief算法python实现

    特征选择算法----Relief算法 特征选择算法分为: (1)封装式算法:遗传算法,适用于处理大规模的数据,具有全局搜索能力强且不易陷入局部最优解. (2)嵌入式算法:需要嵌入机器学习算法,往往降维 ...

  3. 特征选择之Relief算法与Relief-F算法

    特征选择之Relief算法与Relief-F算法 一.背景介绍 二.Relief算法 三.Relief-F算法 参考资料 一.背景介绍 Relief算法是由Kira提出的一种经典的过滤式特征选择算法, ...

  4. 机器学习经典算法详解及Python实现--元算法、AdaBoost

    http://blog.csdn.net/suipingsp/article/details/41822313 第一节,元算法略述 遇到罕见病例时,医院会组织专家团进行临床会诊共同分析病例以判定结果. ...

  5. 西瓜书课后11.1(Relief算法)

    题目 试编程实现Relief算法,并考察其在西瓜数据集3.0上的运行结果. 分析 Relief是一种过滤式特征选择方法.简单来说就是利用这种方法可以计算出各个特征子集的重要性.我们用 δ j \del ...

  6. relief算法研究

    最近由于工作需要,对数据进行降维处理,通过对各种算法的研究,想寻找一种比较理想的算法,处理数据维度,达到降维的目的,对PCA进行研究,但是PCA是对当前多维数据的空间变换,无法达到物理降维的目的,因此 ...

  7. 决策树(1)——ID3算法与C4.5算法的理论基础与python实现

    1.前言   决策树是一种常用的机器学习算法,既可以做分类任务也可以做回归任务,本文主要讨论用于分类任务的决策树.决策树与数据结构中的树相同,也是由一个根结点.若干个内部结点和若干个叶结点构成.这里我 ...

  8. 机器学习算法清单!附Python和R代码

    来源:数据与算法之美 本文约6000字,建议阅读8分钟. 通过本文为大家介绍了3种机器学习算法方式以及10种机器学习算法的清单,学起来吧~ 前言 谷歌董事长施密特曾说过:虽然谷歌的无人驾驶汽车和机器人 ...

  9. 《大厂算法面试题目与答案汇总,剑指offer等常考算法题思路,python代码》V1.0版...

    为了进入大厂,我想很多人都会去牛客.知乎.CSDN等平台去查看面经,了解各个大厂在问技术问题的时候都会问些什么样的问题. 在看了几十上百篇面经之后,我将算法工程师的各种类型最常问到的问题都整理了出来, ...

  10. 相似图片检测:感知哈希算法之dHash的Python实现

    原文:https://blog.csdn.net/haluoluo211/article/details/52769325 相似图片检测:感知哈希算法之dHash的Python实现 某些情况下,我们需 ...

最新文章

  1. mysql七个模块_mysql(pymysql模块的使用,视图,触发器)
  2. vbscript错误代码及对应解释大全[z]
  3. 智能合约语言 Solidity 教程系列9 - 错误处理
  4. 尾气冒黑烟是什么问题_对机动车环保检测尾气排放的了解!
  5. 求解最长单调递增子串
  6. php7.2 加载pgsql驱动,PHP启动:无法加载动态库PGSQL - php
  7. Window捕获消息机制-C#
  8. 怎么查看linux文件夹下有多少个文件
  9. LeetCode--85.最大矩形(单调栈)
  10. sql server代理无法启动_谁说前端不需要懂Nginx反向代理与负载均衡
  11. python基于协程的网络库gevent、eventlet
  12. atitit.提升备份文件复制速度(1) -----分析统计问题and解决方案
  13. Win7上USB转串口芯片ch341驱动安装方法
  14. ecshop设置会员头像
  15. java导出excel水印_springboot为导出的pdf和excel加水印
  16. web安全攻防渗透测试实战指南
  17. 数据库系统学习笔记(3)
  18. 如何安装最新版本的office(preview预览版)、更新
  19. 好家园房产中介网后台管理项目
  20. 【机器学习】基于mnist数据集的手写数字识别

热门文章

  1. ExtJs教程----如何改变各个区域的背景色
  2. linux wine qq 字体,在UOS系统中更改deepin-wineQQ使用的字体经验谈
  3. 13我无所不能——无线网络里面的秘密
  4. 最新的easymule版本,使用vs2005编译
  5. 为什么使用一个变频器控制多个电机?
  6. Bpmn.js 中文文档(一)
  7. 2021中国统计摘要
  8. android字体设置
  9. 手机如何利用IP地址定位城市
  10. HTTP权威指南(浓缩版)