xLearn机器学习库:安装与实践指南

在机器学习的领域里,不乏优秀的库和框架,如scikit-learn、TensorFlow和PyTorch等。然而,xLearn以其独特的优势,在处理特定类型的数据和问题时显得尤为出色。特别是对于那些需要处理大规模稀疏数据集的用户,如点击率预测(CTR)、推荐系统和反欺诈检测,xLearn提供了一个高效、易于使用的解决方案。

xlearn 是一个开源的机器学习库,专注于提供高效、灵活的算法来处理大规模稀疏数据。特别适用于点击率预测(CTR)、推荐系统、欺诈检测等场景。xlearn 的主要特点包括:

  • 算法支持:xlearn 支持多种流行的机器学习算法,包括线性模型(如线性回归、逻辑回归)、因子分解机(FM)、场感知因子分解机(FFM)等。
  • 稀疏数据优化:xlearn 专门为处理稀疏数据(如大量的零值特征)进行了优化,这在处理诸如用户-物品交互数据时非常有用。
  • 高性能:xlearn 使用了并行计算技术,包括多线程和GPU加速,可以快速处理大规模数据集。
  • 易于使用:xlearn 提供了简洁的Python API,使得模型的训练和预测变得非常简单。用户可以通过几行代码就完成模型的设置和训练。
  • 交叉验证:xlearn 支持交叉验证功能,帮助用户评估模型的泛化能力。
  • 模型保存与加载:训练好的模型可以保存到文件中,并在需要时重新加载,方便模型的部署和后续的预测。
  • 命令行工具:xlearn 还提供了一个命令行工具,使得用户可以在不写代码的情况下训练和预测模型。

安装

源码安装

git clone https://github.com/aksnzhy/xlearn.git

cd xlearn
mkdir build
cd build
cmake ../
make

如果编译成功,将在 build 文件夹下看到 xlearn_trainxlearn_predict 这两个可执行文件。可以通过如下命令检查 xLearn 是否安装成功:

./run_example.sh

常见问题:

  • 编译错误:确保您的系统上安装了CMake和GCC或Clang。
  • 缺少依赖:安装所需的依赖库,如OpenMP(用于多线程)。

pip安装

pip install xlearn

安装后,在Python中执行:

import xlearn as xl


xl.hello()
-------------------------------------------------------------------------
         _
        | |
   __  _| |     ___  __ _ _ __ _ __
   \ \/ / |    / _ \/ _` | '__| '_ \
    >  <| |___|  __/ (_| | |  | | | |
   /_/\_\_____/\___|\__,_|_|  |_| |_|

      xLearn   -- 0.44 Version --
-------------------------------------------------------------------------

API列表

命令行接口
  • 训练
xlearn_train <train_file_path> [OPTIONS]

参数选项:

参数 描述 示例
-s 机器学习模型类型(默认为 0) 对于分类任务:
0 – 线性模型 (GLM)
1 – 因子分解机 (FM)
2 – 面向字段的因子分解机 (FFM)
对于回归任务:
3 – 线性模型 (GLM)
4 – 因子分解机 (FM)
5 – 面向字段的因子分解机 (FFM)
-x 指标 可以是 ‘acc’、‘prec’、‘recall’、‘f1’、‘auc’(用于分类),以及 ‘mae’、‘mape’、‘rmsd (rmse)’(用于回归)。默认情况下,xLearn 不会打印任何评估指标信息(只打印损失值)
-p 选择优化方法 包括 ‘sgd’、‘adagrad’ 和 ‘ftrl’。默认情况下,xLearn 使用 ‘adagrad’ 优化方法
-v 验证数据的路径 此选项默认为空,xLearn 将不执行验证过程
-m 模型转储文件的路径 默认情况下,模型文件名为 ‘train_file’ + ‘.model’。如果将此值设置为 ‘none’,则 xLearn 将不会转储模型检查点
-pre 预训练模型的路径 可用于在线学习
-t TEXT 模型检查点文件的路径 默认情况下不设置此选项,xLearn 将不会转储 TEXT 模型。
-l 日志文件的路径 默认情况下,xLearn 使用 ‘/tmp/xlearn_log.*’
-k FM 和 FFM 任务使用的潜在因子数量 默认使用 4。当将 k 设置为 1 和 4 时,将获得相同的模型大小。这是因为使用 SSE 指令,内存需要对齐。因此,即使将 k 设置为 1,仍然会从 k = 2 到 4 填充一些虚拟的零
-r 优化方法的学习率 默认为 0.2,xLearn 可以使用自适应梯度下降(AdaGrad)来解决优化问题,如果选择 AdaGrad 方法,学习率将自适应更改
-b L2 正则项的 Lambda 默认为 0.00002,可以通过将此值设置为零来禁用正则项
-alpha ftrl 使用的超参数
-beta :ftrl 使用的超参数
-lambda_1 ftrl 使用的超参数
-lambda_2 ftrl 使用的超参数
-u 用于初始化模型参数的超参数 默认为 0.66
-e 训练过程的 epoch 数 默认为 10,xLearn 将默认执行提前停止,因此此值只是一个上限
-f 用于交叉验证的折数 如果设置了 --cv 选项就是该数,默认为5
-nthread 用于多线程无锁学习(Hogwild!)的线程数
-block 用于磁盘上的训练的块大小
-sw 用于提前停止的停止窗口的大小 默认为 2
-seed 用于洗牌数据集的随机种子
--disk 开启用于大规模机器学习问题的磁盘上的训练
--cv 在训练任务中开启交叉验证 如果使用此选项,xLearn 将忽略验证文件(由 -t 选项设置)
--dis-lock-free 禁用无锁训练 无锁训练可以加速训练,但结果是不确定的,建议在训练数据较大且稀疏使用
  • 预测
xlearn_predict <test_file_path> <model_file_path> [OPTIONS]

参数选项:

参数 描述 示例
-o 输出文件的路径 默认情况下,此值将设置为 ‘test_file’ + ‘.out’
-l 日志文件的路径 默认情况下,xLearn 使用 ‘/tmp/xlearn_log’
-nthread 用于多线程无锁学习(Hogwild!)的线程数
-block 用于磁盘上的预测的块大小
--sign 将输出结果转换为 0 和 1
--sigmoid 将输出结果转换为 0 ~ 1(概率)
--disk 磁盘上的预测
--no-norm 禁用逐实例的规范化 默认情况下,xLearn 在训练和预测过程中都会使用逐实例的规范化
Python接口
  • API列表
import xlearn as xl      # 导入 xLearn 包

# 这部分是关于数据的
# X 是特征数据,可以是 pandas DataFrame 或 numpy.ndarray,
# y 是标签,默认为 None,可以是 pandas DataFrame\Series、数组或列表,
# field_map 是特征的字段映射,默认为 None,可以是 pandas DataFrame\Series、数组或列表
dmatrix = xl.DMatrix(X, y, field_map)

model = create_linear()  # 创建线性模型。

model = create_fm()      # 创建因子分解机。

model = create_ffm()     # 创建基于字段的因子分解机。

model.show()             # 显示模型信息。

model.fit(param, "model_path")   # 训练模型。

model.cv(param)    # 执行交叉验证。

# 用户可以选择以下两者之一
model.predict("model_path", "output_path")  # 进行预测,将结果输出到文件,返回 None。
model.predict("model_path")                 # 进行预测,通过 numpy.ndarray 返回结果。

# 用户可以选择以下两者之一
model.setTrain("data_path")      # 为 xLearn 从文件中设置训练数据。
model.setTrain(dmatrix)          # 为 xLearn 从 DMatrix 设置训练数据。

# 用户可以选择以下两者之一
# 注意:此验证类型必须与训练一致
# 也就是说,如果从文件设置了训练,必须从文件设置验证
model.setValidate("data_path")   # 为 xLearn 从文件中设置验证数据。
model.setValidate(dmatrix)       # 为 xLearn 从 DMatrix 设置验证数据。

# 用户可以选择以下两者之一
model.setTest("data_path")       # 为 xLearn 从文件中设置测试数据。
model.setTest(dmatrix)           # 为 xLearn 从 DMatrix 设置测试数据。

model.setQuiet()    # 设置 xLearn 为静默训练模型。

model.setOnDisk()   # 设置 xLearn 使用磁盘上的训练。

model.setNoBin()    # 不为训练和测试数据生成二进制文件。

model.setSign()     # 将预测转换为 0 和 1。

model.setSigmoid()  # 将预测转换为 (0, 1)。

model.disableNorm()  # 禁用逐实例规范化。

model.disableLockFree()   # 禁用无锁训练。

model.disableEarlyStop()  # 禁用早停。
  • 超参数列表
参数名 类型 描述 适用任务
task 字符串 模型任务类型,‘binary’ 表示二分类,‘reg’ 表示回归。 所有
metric 字符串 评估指标,分类任务可选 ‘acc’、‘prec’、‘recall’、‘f1’、‘auc’,回归任务可选 ‘mae’、‘mape’、‘rmse’、‘rmsd’。 所有
lr 浮点数 学习率。 所有
lambda 浮点数 L2正则化系数。 所有
k 整数 FM 和 FFM 的潜在因子个数。 FM、FFM
init 浮点数 模型初始化参数。 所有
alpha 浮点数 FTRL 优化的超参数。 FTRL
beta 浮点数 FTRL 优化的超参数。 FTRL
lambda_1 浮点数 FTRL 优化的超参数。 FTRL
lambda_2 浮点数 FTRL 优化的超参数。 FTRL
nthread 整数 CPU 核心数,用于多线程计算。 所有
epoch 整数 训练轮数。 所有
fold 整数 交叉验证的折数。 交叉验证
opt 字符串 优化方法,可选 ‘sgd’、‘adagrad’、‘ftrl’。 所有
stop_window 整数 早停的窗口大小。 所有
block_size 整数 磁盘训练的块大小。 磁盘训练

实践样例

Criteo 在线广告预估

Kaggle 预测广告是否会被用户点击

在这个样例中,将使用xLearn来解决一个经典的机器学习问题:在线广告预估。给定一个用户和正在访问的页面,点击给定广告的概率是多少?我们将使用Criteo提供的数据集来训练和测试我们的模型。
python

样例数据在: https://github.com/aksnzhy/xlearn/demo/classification/criteo_ctr/,代码如下:

import xlearn as xl

# 训练任务
ffm_model = xl.create_ffm()  # 使用场感因式分解机
ffm_model.setTrain("./small_train.txt")  # 训练数据
ffm_model.setValidate("./small_test.txt")  # 验证数据

# 参数:
#  0. 二元分类
#  1. 学习率:0.2
#  2. 正则化 lambda:0.002
#  3. 评估指标:准确率
param = {'task': 'binary', 'lr': 0.2, 'lambda': 0.002, 'metric': 'acc'}

# 开始训练
# 训练得到的模型将保存在 model.out 文件中
ffm_model.fit(param, './model.out')

# 预测任务
ffm_model.setTest("./small_test.txt")  # 测试数据
ffm_model.setSigmoid()  # 将输出转换为 0-1

# 开始预测
# 输出结果将保存在 output.txt 文件中
ffm_model.predict("./model.out", "./output.txt")
蘑菇分类

数据集来自 UCI Machine Learning Repositpry

蘑菇分类是一个经典的二分类问题,从UCI机器学习数据集中获取数据。在这个问题中,将使用线性模型来预测蘑菇是否可食用。

样例数据在: https://github.com/aksnzhy/xlearn/demo/classification/mushroom/.

代码如下:

# 导入 xlearn 库
import xlearn as xl

# 训练任务
linear_model = xl.create_linear()  # 使用线性模型
linear_model.setTrain("./agaricus_train.txt")  # 训练数据
linear_model.setValidate("./agaricus_test.txt")  # 验证数据

# 参数:
#  0. 二分类任务
#  1. 学习率: 0.2
#  2. 正则化 lambda: 0.002
#  3. 评估指标: 准确度
#  4. 使用 sgd 优化方法
param = {'task': 'binary', 'lr': 0.2,
         'lambda': 0.002, 'metric': 'acc',
         'opt': 'sgd'}

# 开始训练
# 训练好的模型将保存在 model.out 文件中
linear_model.fit(param, './model.out')

# 预测任务
linear_model.setTest("./agaricus_test.txt")  # 测试数据
linear_model.setSigmoid()  # 将输出转换为 0-1

# 开始预测
# 预测结果将保存在 output.txt 文件中
linear_model.predict("./model.out", "./output.txt")
泰塔尼克生还预测

在这个挑战中,将使用xLearn来解决泰塔尼克生还预测问题。将使用Kaggle提供的数据集来训练和测试模型。(Kaggle链接)

样例数据在: https://github.com/aksnzhy/xlearn/demo/classification/titanic/.

代码如下:

import xlearn as xl

# 训练任务
fm_model = xl.create_fm()  # 使用因子分解机
fm_model.setTrain("./titanic_train.txt")  # 训练数据

# 参数:
#  0. 二分类任务
#  1. 学习率: 0.2
#  2. Lambda: 0.002
#  3. 评估指标: 准确率
param = {'task':'binary', 'lr':0.2, 'lambda':0.002, 'metric':'acc'}

# 使用交叉验证
fm_model.cv(param)
房价预测

在这个挑战中,将使用xLearn来解决房价预测回归问题。将使用Kaggle提供的数据集来训练和测试模型。数据来自 Kaggle

样例数据在: https://github.com/aksnzhy/xlearn/demo/regression/house_price/.

代码如下:

import xlearn as xl

# 训练任务
ffm_model = xl.create_fm()  # 使用因子分解机
ffm_model.setTrain("./house_price_train.txt")  # 训练数据

# 参数:
#  0. 二元任务
#  1. 学习率: 0.2
#  2. 正则项 lambda: 0.002
#  4. 评价指标: rmse
param = {'task':'reg', 'lr':0.2, 'lambda':0.002, 'metric':'rmse'}

# 使用交叉验证
ffm_model.cv(param)

更新信息

自xLearn停止更新以来,可以看到市面上有许多新的机器学习库和框架的出现,它们提供了更多的功能和更好的性能。然而,尽管xLearn不再得到官方的支持,它在处理大规模稀疏数据方面仍然有其独特的价值和优势。

替代方案

  • scikit-learn:这是一个广泛使用的机器学习库,提供了大量的算法和工具,适用于各种机器学习任务
  • TensorFlow:这是一个由Google开发的深度学习框架,适用于复杂的神经网络模型
  • PyTorch:另一个流行的深度学习框架,以其动态计算图和易用性而闻名
  • LightGBM:这是一个由微软开发的高效的梯度增强框架,特别适合于分类和回归任务

xLearn的价值

尽管有新的工具出现,xLearn仍然在某些特定场景中具有价值,特别是在以下方面:

  • 处理稀疏数据:xLearn专门为处理稀疏数据(如大量的零值特征)进行了优化,这在处理诸如用户-物品交互数据时非常有用
  • 高效性:xLearn使用了并行计算技术,包括多线程和GPU加速,可以快速处理大规模数据集
  • 易于使用:xLearn提供了简洁的Python API,使得模型的训练和预测变得非常简单

尽管xLearn不再得到官方的支持,但它在处理大规模稀疏数据方面仍然有其独特的价值和优势。对于那些已经在使用xLearn或者想要探索其功能的用户来说,继续使用它仍然是一个可行的选择。同时,也可以考虑探索其他库,以利用它们提供的最新功能和性能改进。

参考

  • https://xlearn-doc-cn.readthedocs.io/en/latest/all_api/index.html
  • 深入FFM原理与实践(美团技术团队)
  • 一文读懂FM算法优势,并用python实现
  • Introductory Guide – Factorization Machines & their application on huge datasets (with codes in Python)
  • 简单高效的组合特征自动挖掘框架

你可能感兴趣的:(机器学习,机器学习,xlearn,fm,ffm,lr)