FFM/libffm在Windows上的使用

45 sec read

FFM 的作者Yu-Chin Juan在GitHub上开源了C++版本的代码libffm,由于日常的数据处理都是Python环境,所以期望能找到Python版本的FFM。相关的项目Github上有很多,比如这个:A Python wrapper for LibFFM。该项目在Windows的安装方式为:

  • 将项目下载到本地,并解压。
  • 安装mingw32环境。conda install mingw32
  • 在环境变量PATH中添加mingw32路径:C:\RBuildTools\3.5\mingw_32\bin
  • 修改Python中的编译设置,D:\ProgramData\Anaconda3\Lib\distutils\ cfg如果没有此文件则自己创建,添加内容为:

  • 在项目目录中执行:python setup.py install

但在使用的时候,会报如下错误。主要原因是在Windows上进行安装的时候并没有编译生成libffm.so文件,其他类似的项目均如此。

Libffm在Windows上的编译

由于使用Python包时遇到问题,所以想着直接使用C++版本的代码进行编译。看了下项目介绍,只有v1.21版本的libffm才支持Windows环境:

我按照上面的流程进行安装,遇到的第一个报错:无法找到“nmake”

我能想到大初步解决方案为将“nmake”所在目录添加到环境变量PATH中。然而,执行后还是会报错,这次报错的主要把内容是无法加载到引用的文件:

网上搜索了下,发现VC++设置环境变量的水还是比较深的,需要添加PATH、LIB和INCLUDE这三个环境变量。主要的原因是VS2015里面加入了ucrt这个东西,所以需要额外引入Windows 10的SDK,还有uuid.lib得在Windows 8.x的SDK里找到,所以配置起来还是蛮麻烦的。

  • PATH  C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin;C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE
  • LIB  C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10240.0\ucrt\x86;C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86
  • INCLUDE  C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include;C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt

具体路径按照自己安装的位置进行相应的调整。完成后再次执行即可成功编译。如下,只出现了一些警告信息:

编译完成后会在源文件文件夹下新建一个windows的文件夹,并生成2个exe文件:

  • ffm-predict.exe
  • ffm-train.exe

ffm-train.exe与ffm-predict.exe的使用

比较简单的方法时在命令行直接调用,使用方法如项目文档中所述:

另外也可通过Python调用命令行的方式来使用:

示例代码所用到的训练文件地址为:https://github.com/keyunluo/python-ffm/tree/master/example/libffm-format

如上调用非常的麻烦,我另外找到了一个开源的项目对其进行了进一步封装:https://github.com/gatapia/py_ml_utils,封装的代码为:

总之,整体上在Windows环境下使用libffm非常的困难,不管是编译还是调用,如果环境许可,建议还是在Linux环境下使用。

打赏作者
微信支付标点符 wechat qrcode
支付宝标点符 alipay qrcode

含C/C++代码包Anaconda安装问题

上篇文章主要讲了libffm在Windows系统下安装遇到的问题,今天在Linux环境下的Anaconda中安
1 min read

使用Python获取照片Exif信息

什么是Exif? Exif(Exchangeable image file format)是专门为数码相机的照
4 min read

Python学习笔记:range与xrange

以下为我在使用range与xrange遇到的小坑。原先一直以为range与xrange的区别如下: range
16 sec read

发表评论

电子邮件地址不会被公开。 必填项已用*标注