特征选择是一个重要的数据预处理过程
(1)首先数据属性过多容易造成维度灾难,造成学习过程困难。
(2)去除不相关特征,只留下关键因素,则真相更容易看清。
特征选择的目的就是在样本的众多特征中选出有助于样本分类的属性。那么那些属性有助于样本分类呢?我们将对样本的每一个属性进行重要性评价。
Relief 借用了“假设间隔”(hypothesis margin hypothesis marginhypothesis\ margin)的思想,我们知道在分类问题中,常常会采用决策面的思想来进行分类,“假设间隔”就是指在保持样本分类不变的情况下,决策面能够移动的最大距离,可以表示为:
直观上,一个属性属性有助于分类,则样本在该属性上与同类的距离近,与异类的距离远。根据公式1的启发我们得到公式2
附上matlab程序
function [w]=Relief(data,label,class,k)
%data数据
%label数据标签
%class数据类别个数
%k近邻个数
%w属性的重要程度
[m,n]=size(data);
for j=1:n
for i=1:class
Di_index=find(label==i);
Dni_index=find(label~=i);
Di=data(Di_index,j);
Dni=data(Dni_index,j);
nr=sort(pdist2(Di,Di)')';%猜对近邻
nm=sort(pdist2(Di,Dni)')';%猜错近邻
%pl=length(Dni)/m;
pl=1;
part1=sum(nr(:,2:k+1).^2/k,2);
part2=pl.*sum(nm(:,1:k).^2/k,2);
w(1,j)=sum(part2-part1);
end
end
%以iris数据集跑一下
clear;clc;
data=load("Iris.txt");%加载数据
label=ones(50,1)*[1:3];
label=label(:);
class=3;
%对样本在各属性上进行归一化
data = mapminmax(data', 0, 1)';
k=10;%近邻个数
w=zeros(1,class);
w=Relief(data,label,class,k);
for i=1:4
a12=[data(1:50,i),ones(50,1)];
a22=[data(51:100,i),2*ones(50,1)];
a32=[data(101:150,i),3*ones(50,1)];
figure
plot(a12(:,1),a12(:,2),'r*');
hold on
plot(a22(:,1),a22(:,2),'go');
hold on
plot(a32(:,1),a32(:,2),'bs');
title(['属性为' num2str(i)]);
end
实验结果为:
我们看到第3,4维属性有利于分类,第二维属性不利于分类,结果是不是呢?
附上每一维度的数据分布
我们可以看到利用属性3,4确实可以对样本有很好的区分。
ps:这里的距离采用的是欧式距离,采用不同距离,可以对不同结构的数据进行划分。