在机器学习的领域里,不乏优秀的库和框架,如scikit-learn、TensorFlow和PyTorch等。然而,xLearn以其独特的优势,在处理特定类型的数据和问题时显得尤为出色。特别是对于那些需要处理大规模稀疏数据集的用户,如点击率预测(CTR)、推荐系统和反欺诈检测,xLearn提供了一个高效、易于使用的解决方案。
xlearn 是一个开源的机器学习库,专注于提供高效、灵活的算法来处理大规模稀疏数据。特别适用于点击率预测(CTR)、推荐系统、欺诈检测等场景。xlearn 的主要特点包括:
源码安装
git clone https://github.com/aksnzhy/xlearn.git
cd xlearn
mkdir build
cd build
cmake ../
make
如果编译成功,将在 build 文件夹下看到 xlearn_train
和 xlearn_predict
这两个可执行文件。可以通过如下命令检查 xLearn 是否安装成功:
./run_example.sh
常见问题:
pip安装
pip install xlearn
安装后,在Python中执行:
import xlearn as xl
xl.hello()
-------------------------------------------------------------------------
_
| |
__ _| | ___ __ _ _ __ _ __
\ \/ / | / _ \/ _` | '__| '_ \
> <| |___| __/ (_| | | | | | |
/_/\_\_____/\___|\__,_|_| |_| |_|
xLearn -- 0.44 Version --
-------------------------------------------------------------------------
xlearn_train <train_file_path> [OPTIONS]
参数选项:
参数 | 描述 | 示例 |
---|---|---|
-s <type> | 机器学习模型类型(默认为 0) | 对于分类任务: 0 – 线性模型 (GLM) 1 – 因子分解机 (FM) 2 – 面向字段的因子分解机 (FFM) 对于回归任务: 3 – 线性模型 (GLM) 4 – 因子分解机 (FM) 5 – 面向字段的因子分解机 (FFM) |
-x <metric> | 指标 | 可以是 ‘acc’、‘prec’、‘recall’、‘f1’、‘auc’(用于分类),以及 ‘mae’、‘mape’、‘rmsd (rmse)’(用于回归)。默认情况下,xLearn 不会打印任何评估指标信息(只打印损失值) |
-p <opt_method> | 选择优化方法 | 包括 ‘sgd’、‘adagrad’ 和 ‘ftrl’。默认情况下,xLearn 使用 ‘adagrad’ 优化方法 |
-v <validate_file> | 验证数据的路径 | 此选项默认为空,xLearn 将不执行验证过程 |
-m <model_file> | 模型转储文件的路径 | 默认情况下,模型文件名为 ‘train_file’ + ‘.model’。如果将此值设置为 ‘none’,则 xLearn 将不会转储模型检查点 |
-pre <pre-model> | 预训练模型的路径 | 可用于在线学习 |
-t <txt_model_file> | TEXT 模型检查点文件的路径 | 默认情况下不设置此选项,xLearn 将不会转储 TEXT 模型。 |
-l <log_file> | 日志文件的路径 | 默认情况下,xLearn 使用 ‘/tmp/xlearn_log.*’ |
-k <number_of_K> | FM 和 FFM 任务使用的潜在因子数量 | 默认使用 4。当将 k 设置为 1 和 4 时,将获得相同的模型大小。这是因为使用 SSE 指令,内存需要对齐。因此,即使将 k 设置为 1,仍然会从 k = 2 到 4 填充一些虚拟的零 |
-r <learning_rate> | 优化方法的学习率 | 默认为 0.2,xLearn 可以使用自适应梯度下降(AdaGrad)来解决优化问题,如果选择 AdaGrad 方法,学习率将自适应更改 |
-b <lambda_for_regu> | L2 正则项的 Lambda | 默认为 0.00002,可以通过将此值设置为零来禁用正则项 |
-alpha | ftrl 使用的超参数 | |
-beta | :ftrl 使用的超参数 | |
-lambda_1 | ftrl 使用的超参数 | |
-lambda_2 | ftrl 使用的超参数 | |
-u <model_scale> | 用于初始化模型参数的超参数 | 默认为 0.66 |
-e <epoch_number> | 训练过程的 epoch 数 | 默认为 10,xLearn 将默认执行提前停止,因此此值只是一个上限 |
-f <fold_number> | 用于交叉验证的折数 | 如果设置了 --cv 选项就是该数,默认为5 |
-nthread <thread_number> | 用于多线程无锁学习(Hogwild!)的线程数 | |
-block <block_size> | 用于磁盘上的训练的块大小 | |
-sw <stop_window> | 用于提前停止的停止窗口的大小 | 默认为 2 |
-seed <random_seed> | 用于洗牌数据集的随机种子 | |
--disk | 开启用于大规模机器学习问题的磁盘上的训练 | |
--cv | 在训练任务中开启交叉验证 | 如果使用此选项,xLearn 将忽略验证文件(由 -t 选项设置) |
--dis-lock-free | 禁用无锁训练 | 无锁训练可以加速训练,但结果是不确定的,建议在训练数据较大且稀疏使用 |
xlearn_predict <test_file_path> <model_file_path> [OPTIONS]
参数选项:
参数 | 描述 | 示例 |
---|---|---|
-o <output_file> | 输出文件的路径 | 默认情况下,此值将设置为 ‘test_file’ + ‘.out’ |
-l <log_file_path> | 日志文件的路径 | 默认情况下,xLearn 使用 ‘/tmp/xlearn_log’ |
-nthread <thread number> | 用于多线程无锁学习(Hogwild!)的线程数 | |
-block <block_size> | 用于磁盘上的预测的块大小 | |
--sign | 将输出结果转换为 0 和 1 | |
--sigmoid | 将输出结果转换为 0 ~ 1(概率) | |
--disk | 磁盘上的预测 | |
--no-norm | 禁用逐实例的规范化 | 默认情况下,xLearn 在训练和预测过程中都会使用逐实例的规范化 |
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 | 整数 | 磁盘训练的块大小。 | 磁盘训练 |
在这个样例中,将使用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不再得到官方的支持,它在处理大规模稀疏数据方面仍然有其独特的价值和优势。
替代方案
xLearn的价值
尽管有新的工具出现,xLearn仍然在某些特定场景中具有价值,特别是在以下方面:
尽管xLearn不再得到官方的支持,但它在处理大规模稀疏数据方面仍然有其独特的价值和优势。对于那些已经在使用xLearn或者想要探索其功能的用户来说,继续使用它仍然是一个可行的选择。同时,也可以考虑探索其他库,以利用它们提供的最新功能和性能改进。