本文采用自己构建的方式进行json文件生成,此外我们也可以采用现有的数据转化工具进行处理。比如百度的表格数据转化工具(2.2节已经介绍了)。
另一个便是在线json验证格式工具:
2.5 KNN分类器实现通过数据分析,我们查看数据样本是否偏态分别,数据规模情况等等。针对性进行数据预处理后,编写具体算法模型。本文主要是KNN分类器,其代码如下:
''' 构造KNN分类器 vecX:输入向量,待测数据 filename: 特征集文件路径 isnorm:是否进行归一化处理 k:k值的选择,默认选择3 ''' def knn_classifier(vecX,dataset,labels,isnorm='Y',k=3): # 距离计算(方法1) if isnorm == 'Y': normMat,ranges,minVals = norm_dataset(dataset) # 对数据进行归一化处理 normvecX = norm_dataset(vecX) else: normMat = dataset normvecX = vecX m = normMat.shape[0] # tile方法是在列向量vecX,datasetSize次,行向量vecX1次叠加 diffMat = tile(normvecX,(m,1)) - normMat sqDiffMat = diffMat ** 2 sqDistances = sqDiffMat.sum(axis=1) # axis=0 是列相加,axis=1是行相加 distances = sqDistances**0.5 # print('vecX向量到数据集各点距离:\n'+str(distances)) sortedDistIndexs = distances.argsort(axis=0) # 距离排序,升序 # print(sortedDistIndicies) classCount = {} # 统计前k个类别出现频率 for i in range(k): votelabel = labels[sortedDistIndexs[i]] classCount[votelabel] = classCount.get(votelabel,0) + 1 #统计键值 # 类别频率出现最高的点,itemgetter(0)按照key排序,itemgetter(1)按照value排序 sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True) print(str(vecX)+'KNN的投票决策结果:\n'+str(sortedClassCount[0][0])) return sortedClassCount[0][0] 3 KNN算法模型评估 3.1 评价指标介绍基本知识
混淆矩阵:正元组和负元组的合计
图3-1 混淆矩阵表
评估度量:(其中P:正样本数 N:负样本数 TP:真正例 TN:真负例 FP:假正例 FN:假负例)
图3-2 评估信息度量表
注意:学习器的准确率最好在检验集上估计,检验集的由训练集模型时未使用的含有标记的元组组成数据。
各参数描述如下:
TP(真正例/真阳性):是指被学习器正确学习的正元组,令TP为真正例的个数。
TN(真负例/真阴性):是指被学习器正确学习的负元组,令TN为真负例的个数。
FP(假正例/假阳性):是被错误的标记为正元组的负元组。令FP为假正例的个数。
FN(假负例/假阴性):是被错误的标记为负元组的正元组。令FN为假负例的个数。
准确率:正确识别的元组所占的比例。
评价指标优点
一般采用精确率和召回率作为度量的方法具有以下几个优点:
(1) 准确率数值对于小数据不是特别敏感,而精确率和召回率对于这样数据比较敏感。 (2) 在相同实验环境下,F度量这种倾向和我们直观感觉是一致的,我们对目标事件很敏感,甚至返回一些垃圾数据也在所不惜。 (3) 通过精确率和找回来衡量目标事件和垃圾事件的差异。
模型评估拓展
参见《自然语言处理理论与实战》一书第13章模型评估。
3.2 评估算法模型实现本文只是对错误率进行评估,其也是knn分类器核心指标,实现代码如下:
'''测试评估算法模型''' def test_knn_perfor(filename): hoRatio = 0.1 dataset,label = file_matrix(filename) # 获取训练数据和标签 normMat,ranges,minVals = norm_dataset(dataset) # 对数据进行归一化处理 m = normMat.shape[0] numTestVecs = int(m*hoRatio) # 10%的测试数据条数 errorCount = 0.0 # 统计错误分类数 for i in range(numTestVecs): classifierResult = knn_classifier(normMat[i,:],normMat[numTestVecs:m,:],label[numTestVecs:m],3) # 此处分类器可以替换不同分类模型 print('分类结果:'+str(classifierResult)+'\t\t准确结果:'+str(label[i])) if classifierResult != label[i]: errorCount += 1.0 Global.all_FileNum += 1 print('总的错误率为:'+str(errorCount/float(numTestVecs))+"\n总测试数据量: "+str(Global.all_FileNum))运行效果如下:
[0.44832535 0.39805139 0.56233353]KNN的投票决策结果: 分类结果:3 准确结果:3 [0.15873259 0.34195467 0.98724416]KNN的投票决策结果: 分类结果:2 准确结果:2 ... 分类结果:3 准确结果:3 [0.19385799 0.30474213 0.01919426]KNN的投票决策结果: 分类结果:2 准确结果:2 [0.24463971 0.10813023 0.60259472]KNN的投票决策结果: 分类结果:1 准确结果:1 [0.51022756 0.27138082 0.41804137]KNN的投票决策结果: 分类结果:3 准确结果:1 总的错误率为:0.05 总测试数据量: 100 耗时:0.0300 s评估结果分析: