案例11.1
题目:试编程实现Relief算法,并考察其在西瓜数据集3.0上的运行结果。
机器学习11.1.zip
步骤1:如图搭建模板。
步骤2:在文件上传内分别上传西瓜训练集。
西瓜数据集.csv
步骤3:在“Python脚本编辑器”中,配置如下参数,并设置如下自定义代码块
def run(in1 = None):
import numpy as np
import pandas as pd
def Relief(X,Y):
# Relef算法
# 输入:
# X:样本数据,列表类型,允许连续型和离散型数据,维度为样本数×特征数
# Y: 类标记,列表或者numpy.array类型,这里仅考虑2分类情况
# 输出:
# r:计算出的相关统计量,对应于教材上的(11,3)式,长度为特征数
X=np.asarray(X)
Y=np.asarray(Y).reshape(-1)
m=len(X) #样本数
n=len(X[0]) #特征数
types=np.array([type(xj) for xj in X[0]]) #各个特征的类型
d_index=np.where(types==str)[0] #离散属性序号
c_index=np.where((types==int)|(types==float))[0] #连续属性序号
Xd=np.array([[x[i] for i in d_index] for x in X]) #X之离散属性部分
Xc=np.array([[x[i] for i in c_index] for x in X]) #X之连续属性部分
Xc=(Xc-Xc.min(0))/(Xc.max(0)-Xc.min(0)) #连续值部分规范化到[0,1]区间
r=np.zeros(n) #存储相关统计量
for i in range(m):
# 计算xi与所有样本的距离平方(等号右边两项分别为离散和连续特征贡献)
dist2=(Xd[i,:]!=Xd).sum(1)+((Xc[i,:]-Xc)**2).sum(1)
# 同类最近邻
dist2_nh=dist2.copy() #拷贝距离副本
dist2_nh[i]=max(dist2)+1 #自身距离本为0,将其强制设为较大值
dist2_nh[Y!=Y[i]]=max(dist2)+1 #异类距离也设为较大值
nh_index=np.argmin(dist2_nh) #同类中最近邻样本的索引号
r[d_index]-=Xd[i]!=Xd[nh_index] #r之离散属性部分
r[c_index]-=(Xc[i]-Xc[nh_index])**2 #r之连续属性部分
# 异类最近邻
dist2_nm=dist2.copy() #拷贝距离副本
dist2_nm[Y==Y[i]]=max(dist2)+1 #同类距离设为较大值
nm_index=np.argmin(dist2_nm) #异类中最近邻样本的索引号
r[d_index]+=Xd[i]!=Xd[nm_index] #r之离散属性部分
r[c_index]+=(Xc[i]-Xc[nm_index])**2 #r之连续属性部分
return r
X=in1[['色泽','根蒂','敲声','纹理','脐部','触感','密度','含糖率']]
Y=in1[['好瓜']]
r=Relief(X,Y)
res=pd.DataFrame({"id":[1]})
for i,j in enumerate(['色泽','根蒂','敲声','纹理','脐部','触感','密度','含糖率']):
res[j]=r[i]
del res["id"]
return res
步骤4:点击运行->全部运行,右键Python脚本编辑器->结果数据->预览,结果如下:
该结果计算了每一个特征的分值,其中脐部是分值最高的特征。