机器学习实战第二章k-近邻算法03

2.2.4 测试算法:作为完整程序验证分类器

上节我们已经将数据按照要求做了处理,本节我们经测试分类器的效果,如果分类器的正确率满足要求,海伦就可以使用这个软件来处理约会网站提供的约会名单了。机器学习算法一个很重要的工作就是评估算法的正确率,通常我们只提供已有数据的90%作为训练样本来训练分类器,而使用其余的10%数据去测试分类器,检测分类器的正确率。以后会介绍一些高级方法完成同样的任务,这里我们先采用原始的方法。需要注意的是,10%的测试数据应该是随机选择的,由于海伦提供的数据并没有按照特定目的来排序,所以我们可以随意选择10%数据而不影响其随机性。

前面我们已经提到可以使用错误率来检测分类器的性能。对于分类器来说,错误率就是分类器给出错误结果的次数除以测试数据的总数,完美分类器的错误率为0,而错误率为1.0的分类器不会给出任何正确的分类结果。代码里我们定义一个计数器变量,每次分类器错误地分类数据,计数器就加1,程序执行完成之后计数器的结果除以数据点总数即是错误率。

为了测试分类器效果,在kNN.py文件中创建函数datingClassTest,该函数是自包含的,你可以在任何时候在Python运行环境中使用该函数测试分类器效果。在kNN.py文件中输入下面的程序代码。

程序清单2-4 分类器针对约会网站的测试代码

def datingClassTest():
    hoRatio=0.10
    datingDataMat,datingLabels=file2matrix('datingTestSet2.txt')
    normMat,ranges,minVals=autoNorm(datingDataMat)
    m=normMat.shape[0]
    numTestVecs=int(m*hoRatio)
    errorCount=0.0
    for i in range(numTestVecs):
        classifierResult=classify0(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3)
        print('the classifier came back with:%d,the real answer is:%d'%(classifierResult,datingLabels[i]))
        if (classifierResult != datingLabels[i]):
            errorCount+=1.0
    print('the total error rate is: %f'%(errorCount/float(numTestVecs)))

函数datingClassTest如程序清单2-4所示,它首先使用了file2matrix和autoNorm()函数从文件中读取数据并将其转化为归一化特征值。接着计算测试向量的数量,此步决定了normMat向量中哪些数据用于测试,哪些数据用于分类器的训练样本;然后将这两部分数据输入分类器函数classify0。最后,函数计算错误率并输出结果。注意此处我们使用原始分类器,本章花费了大量篇幅在讲如何处理数据,如何将数据改造为分类器可以使用的特征值。得到可靠的数据同样重要,后续章节将介绍这个主题。

输入命令datingClassTest(),执行分类器测试程序,我们得到下面的输出结果:

datingClassTest() 
the classifier came back with:3,the real answer is:3
the classifier came back with:2,the real answer is:2
the classifier came back with:1,the real answer is:1
...

the classifier came back with:2,the real answer is:2
the classifier came back with:1,the real answer is:1
the classifier came back with:3,the real answer is:1

the total error rate is: 0.050000

分类器处理约会数据集的错误率是5%,这是一个相当不错的结果。我们可以改变函数datingClassTest内变量hoRatio和变量k的值,检测错误率是否随着变量值的变化而增加。依赖分类算法、数据集合程序设置,分类器的输出结果可能有很大的不同。

这个例子表明,我们可以正确的预测分类,错误率仅仅为5%。海伦完全可以输入未知对象的属性信息,由分类软件来帮助它判定某一对象可交往的程度:讨厌、一般喜欢、非常喜欢。

2.2.5 使用算法:构建完整可用系统

上面我们已经在数据上对分类器进行了测试,现在终于可以使用这个分类器为海伦来对约会对象分类。我们会给海伦一段小程序,通过该程序海伦会在约会网站上找到某人并输入他的信息。程序会给出她对对方喜欢程度的预测值。

程序清单2-5 约会网站预测函数

上述程序清单代码大部分我们在前面都见过。唯一新加入的代码时函数raw_input()。该函数允许用户输入文本行命令并返回用户所输入的命令。为了解程序的实际运行效果,输入如下命令:

classifyPerson()
输出
percentage of time spent playing video games?10

frequent flier miles earned per year?10000

liters of ice cream consumed per year?0.5
You will probably like this person: in small doses

目前为止,我们已经看到如何在数据上构建分类器。这里所有数据让人看起来都很容易,但是如何在人不太容易看懂的数据上使用分类器呢?从下一节的例子中,我们会看到如何在二进制存储的图像上数据上使用kNN。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值