版权声明:本文为博主原创文章,转载时请附上原文链接:https://blog.csdn.net/qq_40871363/article/details/86594578
ReliefF算法python实现
一、ReliefF算法简介
ReliefF算法是Relief算法的拓展,其适用于处理多分类问题。
(一)原理
假设数据集D中的样本分属于N个类别,对于样本xi,若它属于第n类,则ReliefF算法首先在同类即第n类的样本中寻找xi的k个最近邻样本作为猜中近邻;然后在第n类之外的每个类中均找到xi的k个最近邻样本作为猜错近邻,其相关统计量对应于属性j的分量则为:
(二)伪算法
待补充
二、ReliefF算法python实现
(一)代码
代码片
// An highlighted block
# _*_ coding:utf8 _*_
"""
# 说明:特征选择方法一:过滤式特征选择(ReliefF算法)
# 思想:先用特征选择过程对初始特征进行"过滤",然后再用过滤后的特征训练模型
# 时间:2019-1-16
# 问题:
"""
import pandas as pd
import numpy as np
import numpy.linalg as la
import random
# 异常类
class ReliefError:
pass
class Relief:
def __init__(self, data_df, sample_rate, t, k):
"""
#
:param data_df: 数据框(字段为特征,行为样本)
:param sample_rate: 抽样比例
:param t: 统计量分量阈值
:param k: k近邻的个数
"""
self.__data = data_df
self.__feature = data_df.columns
self.__sample_num = int(round(len(data_df) * sample_rate))
self.__t = t
self.__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 是数值型' % one
else:
# print '%s 是离散型' % one
keys = list(set(list(col)))
values = list(xrange(len(keys)))
new = dict(zip(keys, values))
new_data[one] = self.__data[one