Security News
Maven Central Adds Sigstore Signature Validation
Maven Central now validates Sigstore signatures, making it easier for developers to verify the provenance of Java packages.
scikitjs-node
Advanced tools
JavaScript package for predictive data analysis and machine learning.
Aims to be a Typescript port of the scikit-learn python library.
This library is for users who wish to train or deploy their models to JS environments (browser, mobile) but with a familiar API.
Generic math operations are powered by Tensorflow.js core layer for faster calculation.
Documentation site: www.scikitjs.org
For Node.js users who wish to bind to the Tensorflow C++ library, simply
yarn add scikitjs-node
import { LinearRegression } from 'scikitjs-node'
const lr = LinearRegression({ fitIntercept: false })
const X = [[1], [2]] // 2D Matrix with a single column vector
const y = [10, 20]
await lr.fit(X, y)
lr.predict([[3, 4]]) // roughly [30, 40]
console.log(lr.coef)
console.log(lr.intercept)
This library aims to be a drop-in replacement for scikit-learn but for JS environments. There are some differences in deploy environment and underlying libraries that make for a slightly different experience. Here are the 3 main differences.
While I would have liked to make every function identical to the python equivalent, it wasn't possible. In python, one has named arguments, meaning that all of these are valid function calls.
def myAdd(a=0, b=100):
return a+b
print(myAdd()) # 100
print(myAdd(a=10)) # 110
print(myAdd(b=10)) # 10
print(myAdd(b=20, a=20)) # 40 (order doesn't matter)
print(myAdd(50,50)) # 100
Javascript doesn't have named parameters, so one must choose between positional arguments, or passing in a single object with all the parameters.
For many classes in scikit-learn, the constructors take in a ton of arguments with sane defaults, and the user usually only specifies which one they'd like to change. This rules out the positional approach.
After a class is created most function calls really only take in 1 or 2 arguments (think fit, predict, etc). In that case, I'd rather simply pass them positionally. So to recap.
from sklearn.linear_model import LinearRegression
X, y = [[1],[2]], [10, 20]
lr = LinearRegression(fit_intercept = False)
lr.fit(X, y)
Turns into
import { LinearRegression } from 'scikitjs-node'
let X = [[1], [2]]
let y = [10, 20]
let lr = new LinearRegression({ fitIntercept: false })
await lr.fit(X, y)
You'll also notice in the code above, these are actual classes in JS, so you'll need to new
them.
Not a huge change, but every function call and variable name that is underscore_case
in python will simply be camelCase
in JS. In cases where there is an underscore but no word after, it is removed.
from sklearn.linear_model import LinearRegression
X, y = [[1],[2]], [10, 20]
lr = LinearRegression(fit_intercept = False)
lr.fit(X, y)
print(lr.coef_)
Turns into
import { LinearRegression } from 'scikitjs-node'
let X = [[1], [2]]
let y = [10, 20]
let lr = new LinearRegression({ fitIntercept: false })
await lr.fit(X, y)
console.log(lr.coef)
In the code sample above, we see that fit_intercept
turns into fitIntercept
(and it's an object). And coef_
turns into coef
.
It's common practice in Javascript to not tie up the main thread. Many libraries, including tensorflow.js only give an async "fit" function.
So if we build on top of them our fit functions will be asynchronous. But what happens if we make our own estimator that has a synchronous fit function? Should we burden the user with finding out if their fit function is async or not, and then "awaiting" the proper one? I think not.
I think we should simply await all calls to fit. If you await a synchronous function, it resolves immediately and you are on your merry way. So I literally await all calls to .fit and you should too.
from sklearn.linear_model import LogisticRegression
X, y = [[1],[-1]], [1, 0]
lr = LogisticRegression(fit_intercept = False)
lr.fit(X, y)
print(lr.coef_)
Turns into
import { LogisticRegression } from 'scikitjs-node'
let X = [[1], [-1]]
let y = [1, 0]
let lr = new LogisticRegression({ fitIntercept: false })
await lr.fit(X, y)
console.log(lr.coef)
See guide here
FAQs
JavaScript package for predictive data analysis and machine learning.
The npm package scikitjs-node receives a total of 11 weekly downloads. As such, scikitjs-node popularity was classified as not popular.
We found that scikitjs-node demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 4 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Maven Central now validates Sigstore signatures, making it easier for developers to verify the provenance of Java packages.
Security News
CISOs are racing to adopt AI for cybersecurity, but hurdles in budgets and governance may leave some falling behind in the fight against cyber threats.
Research
Security News
Socket researchers uncovered a backdoored typosquat of BoltDB in the Go ecosystem, exploiting Go Module Proxy caching to persist undetected for years.