Rumale
Rumale(Ruby machine learning)是一个Ruby机器学习库。Rumale提供了与Python中Scikit-Learn类似的机器学习算法接口。Rumale支持支持向量机、逻辑回归、岭回归、Lasso回归、多层感知器、朴素贝叶斯、决策树、梯度树提升、随机森林、K均值、高斯混合模型、DBSCAN、谱聚类、多维缩放、t-SNE、Fisher判别分析、邻域成分分析、主成分分析、非负矩阵分解以及许多其他算法。
安装
将此行添加到您的应用程序的Gemfile中:
gem 'rumale'
然后执行:
$ bundle
或者自己安装:
$ gem install rumale
文档
使用方法
示例1. Pendigits数据集分类
Rumale提供了加载libsvm格式数据集文件的功能。我们首先从LIBSVM Data网站下载pendigits数据集。
$ wget https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/multiclass/pendigits
$ wget https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/multiclass/pendigits.t
使用线性SVM和RBF核特征映射训练分类器的代码如下:
require 'rumale'
# 加载训练数据集。
samples, labels = Rumale::Dataset.load_libsvm_file('pendigits')
# 将训练数据映射到RBF核特征空间。
transformer = Rumale::KernelApproximation::RBF.new(gamma: 0.0001, n_components: 1024, random_seed: 1)
transformed = transformer.fit_transform(samples)
# 训练线性SVM分类器。
classifier = Rumale::LinearModel::SVC.new(reg_param: 0.0001)
classifier.fit(transformed, labels)
# 保存模型。
File.open('transformer.dat', 'wb') { |f| f.write(Marshal.dump(transformer)) }
File.open('classifier.dat', 'wb') { |f| f.write(Marshal.dump(classifier)) }
使用训练好的分类器对测试数据进行分类的代码如下:
require 'rumale'
# 加载测试数据集。
samples, labels = Rumale::Dataset.load_libsvm_file('pendigits.t')
# 加载模型。
transformer = Marshal.load(File.binread('transformer.dat'))
classifier = Marshal.load(File.binread('classifier.dat'))
# 将测试数据映射到RBF核特征空间。
transformed = transformer.transform(samples)
# 对测试数据进行分类并评估预测结果。
puts("准确率:%.1f%%" % (100.0 * classifier.score(transformed, labels)))
# 其他评估方法
# results = classifier.predict(transformed)
# evaluator = Rumale::EvaluationMeasure::Accuracy.new
# puts("准确率:%.1f%%" % (100.0 * evaluator.score(results, labels)))
执行上述脚本的结果如下:
$ ruby train.rb
$ ruby test.rb
准确率:98.5%
示例2. 交叉验证
require 'rumale'
# 加载数据集。
samples, labels = Rumale::Dataset.load_libsvm_file('pendigits')
# 定义要评估的估计器。
lr = Rumale::LinearModel::LogisticRegression.new
# 定义评估指标、分割策略和交叉验证。
ev = Rumale::EvaluationMeasure::Accuracy.new
kf = Rumale::ModelSelection::StratifiedKFold.new(n_splits: 5, shuffle: true, random_seed: 1)
cv = Rumale::ModelSelection::CrossValidation.new(estimator: lr, splitter: kf, evaluator: ev)
# 执行5折交叉验证。
report = cv.perform(samples, labels)
# 输出结果。
mean_accuracy = report[:test_score].sum / kf.n_splits
puts "5折交叉验证平均准确率:%.1f%%" % (100.0 * mean_accuracy)
执行上述脚本的结果如下:
$ ruby cross_validation.rb
5折交叉验证平均准确率:95.5%
加速
Numo::Linalg
Rumale使用Numo::NArray进行类型化数组操作。加载Numo::Linalg可以使用BLAS库执行Numo::NArray的矩阵和向量乘积。一些机器学习算法经常计算矩阵和向量乘积,这类算法的执行速度可以预期会加快。
安装Numo::Linalg gem。
$ gem install numo-linalg
在Ruby脚本中,只需要与Rumale一起加载Numo::Linalg。
require 'numo/linalg/autoloader'
require 'rumale'
Numo::Linalg允许用户选择BLAS/LAPACK的后台库。除了固定后台库外,还可以使用Numo::OpenBLAS和Numo::BLIS来简化安装。
Numo::TinyLinalg
Numo::TinyLinalg是Numo::Linalg的子集库,仅包含机器学习算法中使用的方法。Numo::TinyLinalg仅支持OpenBLAS作为BLAS和LAPACK的后台库。如果在安装过程中未找到OpenBLAS库,Numo::TinyLinalg会下载并构建它。
$ gem install numo-tiny_linalg
加载Numo::TinyLinalg而不是Numo::Linalg。
require 'numo/tiny_linalg'
Numo::Linalg = Numo::TinyLinalg
require 'rumale'
并行处理
Rumale中的几个估计器支持并行处理。Rumale中的并行处理通过Parallel gem实现,因此请安装并加载它。
$ gem install parallel
require 'parallel'
require 'rumale'
支持并行处理的估计器具有n_jobs参数。当将-1赋给n_jobs参数时,将使用所有处理器。
estimator = Rumale::Ensemble::RandomForestClassifier.new(n_jobs: -1, random_seed: 1)
相关项目
- Rumale::SVM提供了具有Rumale接口的LIBSVM和LIBLINEAR支持向量机算法。
- Rumale::Torch提供了使用torch.rb定义的神经网络进行学习和推理的Rumale接口。
许可证
该gem在BSD-3-Clause许可证条款下作为开源软件提供。