在Python中使用Weka
Weka是用Java编写的数据挖掘工具,如果要在Python中调用Weka,需要用到Jython。Jython是100%用Java实现的Python,可以无缝的嵌入到Java平台当中。
前期准备:
1. 安装JDK,Jython
2. 将Jython的执行路径加入到$PATH,将Weka.jar的路径加入到$CLASSPATH中
下面我们用Jython调用Weka的朴素贝叶斯分类器来对数据进行分类:
1 #!/usr/bin/python 2 #coding=UTF-8 3 import sys 4 import java.io.FileReader as FileReader 5 import java.io.File as File 6 import weka.core.Instances as Instances 7 import weka.core.converters.CSVLoader as CSVLoader 8 import weka.classifiers.bayes.NaiveBayes as NaiveBayes 9 #训练数据格式为CSV文件 10 loader=CSVLoader() 11 loader.setSource(File('train.csv')) 12 data=loader.getDataSet() 13 14 ''' 15 训练数据格式为arff文件 16 reader = FileReader("/train.arff") 17 data = Instances(reader) 18 ''' 19 20 #设置分类属性 21 data.setClassIndex(data.numAttributes()-1) 22 23 #训练朴素贝叶斯模型 24 nb=NaiveBayes() 25 #设置选项,测出我们不使用任何选项 26 options=splitOptions('') 27 nb.setOptions(options) 28 nb.buildClassifier(data) 29 #输出训练好的朴素贝叶斯分类模型 30 print nb 31 32 #导入测试数据,此处是CSV格式,也可以用arff格式 33 loader=CSVLoader() 34 loader.setSource(File('test.csv')) 35 test_data=loader.getDataSet() 36 test_data.setClassIndex(test_data.numAttributes()-1) 37 38 num=test_data.numInstances() 39 print num 40 for i in range(num): 41 #输出测试样例在所有类别上的概率分布 42 r1=nb.distributionForInstance(test_data.instance(i)) 43 #输出测试样例的分类结果,是所有类别中概率最高的那个类别 44 r2=nb.classifyInstance(test_data.instance(i)) 45 print r1 46 print r2 47 48 #5重交叉验证评估朴素贝叶斯分类器的效果 49 evaluator=Evaluation(data) 50 print evaluator.evaluateModel(NaiveBayes(),['-t','train.csv','-x','5','-i'])
上述脚本命名为weka_naive_bayes.py
执行该脚本的命令为jython weka_naive_bayes.py
参考文献:
[2] Weka Sourceforge
[3] 用Python的方式调用Weka