random-forest
Random forest method. Ported to JavaScript with WebAssembly. Async computation and multithreading implemented with WebWorkers (for browsers).
No tests yet. See examples in the example
folder.
- Fast
- Sync/async modes
- Threads support
- CommonJS module
Install
npm install -S random-forest
Sync mode
Init
const RandomForestClassifier RandomForestRegressor = const rf = nEstimators: 100 maxDepth: 10 maxFeatures: 'auto' minSamplesLeaf: 5 minInfoGain: 0
Training, Predicting
rfconst ypred = rf
Saving, Loading models
const model = rffsconst modelLoaded = fsrfconst ypred = rf
Some browsers doesn't allow running WebAssembly in a sync mode. In such case, you can try async mode described below.
Async mode
const RandomForestClassifier RandomForestRegressor = // ! Don't miss /async part in require('random-forest/async') ! ; { const rf = nEstimators: 100 maxDepth: 10 maxFeatures: 'auto' minSamplesLeaf: 5 minInfoGain: 0 nJobs: 4 // Control the number of threads (workers) with this param await rf await rf const ypred = await rf console}
Currently the async
mode doesn't support loading/saving models.
Development
Contributions are very welcomed. Some insights on how everything works:
Building steps:
- The native code is loaded from the native-forest repo, a fork from RandomForests, a C++ implementation of random forests
- Custom C++ interfaces are in
src/api.cpp
andsrc/api.h
. - Emscripten compiles the
native-forest
code with defined interfaces intonative/native.js
andnative/native.wasm
. Compilation settings located inMakefile
- To load WebAssembly in sync mode,
prepare-wasm.js
script converts the wasm file into a Uint8 array and stores it in thewrappers
folder - Then
src/base.js
loadswrapper/native.bin.js
as a regular CommonJS module, initializes it using thenative/native.js
module utils and then inititalizes native functions withcwrap
- That's all what needed for the sync mode to work. Now prepare
async
version. To make it easier loading and bundling the module, a WebWorker script is bundled, rather than uses importScript. It's also loaded not as a separate file, but Blob. To generate the Blob we need the worker to be compiled first, then loaded as a string - Bundle
src/worker.js
intodist/worker.js
- Use
prepare-worker.js
to read code ofdist/worker.js
and save it as a module inwrapper/worker.code.js
- Load wrapped code in
src/async.js
, init Blob, the URL, and WebWorkers - In async mode results are aggregates