一. 将数据格式转换为libsvm
用libsvm分析数据,首先要把csv格式的数据转换成libsvm格式,网上搜到的方法如下:
1. 网上有一个xls文FormatDataLibsvm.xls具有宏命令,可以利用其中的宏命令来实现。对于属性数据只有一二百的,这种工具简单方便。
2. 可以利用weka来转换,用weka打开csv文件,再将文件重新保存为libsvm格式。
由于我的数据有180万左右,所以使用了第二种方法。去weka官网下载最新版本,我的是weka-3-9-2-oracle-jvm,转换前需要提前下载libsvm的包。打开GUI界面,点击tools下的package manager,按如下界面搜索并下载。
然后就可以转换了数据了。需要注意的是,保存时有可能没有存为.libsvm的选项,这是因为数据格式只能是numerical或者nominal,修改或移除之后就可以了。
二. Mac电脑配置python(PyCharm)的libsvm
1. 首先下载libsvm.zip文件
2. unzip一下libsvm.zip文件,用终端进入libsvm文件夹
3. 输入make
4. 进入libsvm下的python文件夹
5. make一次libsvm->python文件夹 ,上层文件夹会出现一个libsvm.so.2文件
现在已经编译好libsvm了,值得注意的是:libsvm.so.2是unix系统所需要的链接库,而且存在于python上一个文件夹中(即libsvm主文件夹中,而且在svmutil.py中引用libsvm.so.2时,都是看做在上一个目录下进行引入的)
6. 进入系统所使用的python的site-packages文件夹,将libsvm.so.2复制到site-packages文件夹中(本机为/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages)
7. 在该文件夹下建立文件夹libsvm,进入libsvm文件夹,新建__init__.py文件(这一步十分重要,因为libsvm.so.2在上一层文件夹中,因此该libsvm文件夹将会被看做一个python工作区,而__init__.py对于python工作区来说是必须的)
8. 将libsvm->python文件夹下的svm.py、svmutil.py都复制到这个新建的libsvm文件夹中。
按道理说,这样就成功了,但是当我用PyCharm运行from libsvm import svmutil时,出现了如下问题:
ModuleNotFoundError: No module named 'svm'
查看svmutil.py,发现有如下代码:
from svm import *
from svm import __all__ as svm_all
因为当前路径不在系统路径下,编译器不知道去哪里找svm.py,所以修改上述代码为:
from libsvm.svm import *
from libsvm.svm import __all__ as svm_all
就可以用from libsvm.svmutilimport *运行啦。
三、一个简单例子
这里使用了一个最简单的栗子。
from libsvm.svmutil import *
y,x=svm_read_problem('train.libsvm') # 训练数据
yt,xt=svm_read_problem('test.libsvm') # 测试数据
m = svm_train(y[:37000], x[:37000]) # 使用前37000个数据训练
p_label,p_acc,p_val=svm_predict(y[-1700:],x[-1700:],m) # 使用后1700个数据测试