Relief特征选择算法
Relief算法最早由Kira提出,最初局限于两类数据的分类问题。Relief算法是一种特征权重算法(Feature weighting algorithms),根据各个特征和类别的相关性赋予特征不同的权重,权重小于某个阈值的特征将被移除。Relief算法中特征和类别的相关性是基于特征对近距离样本的区分能力。算法从训练集D中随机选择一个样本R,然后从和R同类的样本中寻找最近邻样本H,称为Near Hit,从和R不同类的样本中寻找最近邻样本M,称为NearMiss,然后根据以下规则更新每个特征的权重:如果R和Near Hit在某个特征上的距离小于R和Near Miss上的距离,则说明该特征对区分同类和不同类的最近邻是有益的,则增加该特征的权重;反之,如果R和Near Hit在某个特征的距离大于R和Near Miss上的距离,说明该特征对区分同类和不同类的最近邻起负面作用,则降低该特征的权重。以上过程重复m次,最后得到各特征的平均权重。特征的权重越大,表示该特征的分类能力越强,反之,表示该特征分类能力越弱。Relief算法的运行时间随着样本的抽样次数m和原始特征个数N的增加线性增加,因而运行效率非常高。具体算法如下所示:
ReliefF算法实现代码如下:
import pandas as pd
import numpy as np
import numpy.linalg as la
import random
def Relief_F(dataSet,featnames):#使用reliefF算法计算属性的权重值,根据阈值选出最佳的特征子集
dataSet=dataSet.values#将数据框转换为数组
feature=len(featnames)#特征数量
m=5#m:样本抽样次数
k=5#k:最近邻样本数
feat_class=['b1','b2','b3','b4','b5','b6','b7','b8','b9','pred_minus_obs_H_b1','pred_minus_obs_H_b2','pred_minus_obs_H_b3','pred_minus_obs_H_b4','pred_minus_obs_H_b5','pred_minus_obs_H_b6','pred_minus_obs_H_b7','pred_minus_obs_H_b8','pred_minus_obs_H_b9','pred_minus_obs_S_b1','pred_minus_obs_S_b2','pred_minus_obs_S_b3','pred_minus_obs_S_b4','pred_minus_obs_S_b5','pred_minus_obs_S_b6','pred_minus_obs_S_b7','pred_minus_obs_S_b8','pred_minus_obs_S_b9','class']
weight_vecate=[]#特征权重向量
weight_list=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]#初始化特征权重列表中的每个特征
for l in range(m):#遍历抽样次数
#print(l)
temp1=0
temp3=0
k_min_dist=[]#同类中的k个最近距离列表
class_sample_list=[]#与R同一类别的样本
k_min_dist_list=[]#与R同类的样本列表
k_min_dist_sample_list=[]#存储同类中k个最近邻样本
every_class_k_min_list=[]#存储与R不同类的每个类的k个最近邻
R=random.choice(dataSet)