From 05c9d9af772c1d197798ea28fdd985e92b6fc5ac Mon Sep 17 00:00:00 2001 From: Dan Crescimanno Date: Mon, 18 Apr 2022 10:30:14 -0700 Subject: [PATCH 1/4] feat: fixed loadBoston calls. Need to do the others --- package-lock.json | 185 +++++++++++++++++++++++++++++----- package.json | 1 + src/datasets/datasets.test.ts | 9 ++ src/datasets/datasets.ts | 26 ++++- src/tree/decisiontree.test.ts | 4 +- 5 files changed, 194 insertions(+), 31 deletions(-) create mode 100644 src/datasets/datasets.test.ts diff --git a/package-lock.json b/package-lock.json index 1d7b24fe..a8328c5c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "@tensorflow/tfjs-node": "3.13.0", "lodash": "^4.17.21", "mathjs": "^10.0.0", + "node-fetch": "2.6.0", "seedrandom": "^3.0.5", "simple-statistics": "^7.7.0" }, @@ -2711,6 +2712,25 @@ "node": ">= 8" } }, + "node_modules/@mapbox/node-pre-gyp/node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/@mapbox/node-pre-gyp/node_modules/tar": { "version": "6.1.11", "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", @@ -2894,6 +2914,26 @@ "node": ">=0.10.0" } }, + "node_modules/@octokit/request/node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/@octokit/rest": { "version": "18.12.0", "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.12.0.tgz", @@ -3663,6 +3703,25 @@ "yarn": ">= 1.3.2" } }, + "node_modules/@tensorflow/tfjs-core/node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/@tensorflow/tfjs-core/node_modules/seedrandom": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-2.4.3.tgz", @@ -3726,6 +3785,25 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/@tensorflow/tfjs/node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/@tensorflow/tfjs/node_modules/seedrandom": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-2.4.4.tgz", @@ -5798,6 +5876,26 @@ "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", "dev": true }, + "node_modules/danfojs-node/node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/danfojs-node/node_modules/seedrandom": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-2.4.4.tgz", @@ -10612,22 +10710,11 @@ } }, "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", "engines": { "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } } }, "node_modules/node-int64": { @@ -16127,7 +16214,8 @@ }, "node_modules/tr46": { "version": "0.0.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" }, "node_modules/traverse": { "version": "0.6.6", @@ -16591,7 +16679,8 @@ }, "node_modules/webidl-conversions": { "version": "3.0.1", - "license": "BSD-2-Clause" + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" }, "node_modules/whatwg-encoding": { "version": "1.0.5", @@ -16612,7 +16701,8 @@ }, "node_modules/whatwg-url": { "version": "5.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -18607,6 +18697,14 @@ "yallist": "^4.0.0" } }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, "tar": { "version": "6.1.11", "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", @@ -18752,6 +18850,15 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true + }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dev": true, + "requires": { + "whatwg-url": "^5.0.0" + } } } }, @@ -19244,6 +19351,14 @@ "sprintf-js": "~1.0.2" } }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, "seedrandom": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-2.4.4.tgz", @@ -19322,6 +19437,14 @@ "seedrandom": "2.4.3" }, "dependencies": { + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, "seedrandom": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-2.4.3.tgz", @@ -20955,6 +21078,15 @@ } } }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dev": true, + "requires": { + "whatwg-url": "^5.0.0" + } + }, "seedrandom": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-2.4.4.tgz", @@ -24366,12 +24498,9 @@ } }, "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "requires": { - "whatwg-url": "^5.0.0" - } + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" }, "node-int64": { "version": "0.4.0", @@ -28273,7 +28402,9 @@ } }, "tr46": { - "version": "0.0.3" + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" }, "traverse": { "version": "0.6.6", @@ -28572,7 +28703,9 @@ } }, "webidl-conversions": { - "version": "3.0.1" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" }, "whatwg-encoding": { "version": "1.0.5", @@ -28593,6 +28726,8 @@ }, "whatwg-url": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", "requires": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" diff --git a/package.json b/package.json index bcdfdc1f..f81229e4 100644 --- a/package.json +++ b/package.json @@ -49,6 +49,7 @@ "@tensorflow/tfjs-node": "3.13.0", "lodash": "^4.17.21", "mathjs": "^10.0.0", + "node-fetch": "2.6.0", "seedrandom": "^3.0.5", "simple-statistics": "^7.7.0" }, diff --git a/src/datasets/datasets.test.ts b/src/datasets/datasets.test.ts new file mode 100644 index 00000000..ec533015 --- /dev/null +++ b/src/datasets/datasets.test.ts @@ -0,0 +1,9 @@ +import { loadBoston } from './datasets' + +describe('test', function () { + it('loadBoston test', async function () { + let Array2D = await loadBoston() + expect(Array2D.length).toEqual(507) + expect(Array2D[0].length).toEqual(14) + }) +}) diff --git a/src/datasets/datasets.ts b/src/datasets/datasets.ts index 60377547..32c38e4e 100644 --- a/src/datasets/datasets.ts +++ b/src/datasets/datasets.ts @@ -1,15 +1,33 @@ +import fetch from 'node-fetch' + +export const dataUrls = { + loadBoston: 'http://scikitjs.org/data/boston.csv' +} + /** * Loads the Boston housing dataset (regression). Samples 506, features 13. * @example * ```typescript import { loadBoston } from 'scikitjs' - let df = await loadBoston() - df.print() + let Array2D = await loadBoston() + console.log(Array2D[0]) // Headers ['CRIM', 'ZN', ..., 'LSTAT', 'target'] + console.log(Array2D.slice(1)) // All the actual data ``` */ -export function loadBoston(): string { - return 'http://scikitjs.org/data/boston.csv' + +export async function loadBoston(): Promise>> { + let text = (await fetch(dataUrls.loadBoston) + .then((el) => el.text()) + .catch((el) => { + console.error(`Fetch failed to get url ${dataUrls.loadBoston}`) + console.error(el) + })) as string + let Array2D = text + .split('\n') + .map((el) => el.split(',').map((singleNumb) => Number(singleNumb))) + Array2D.pop() // There is a newline that ends the file and no data after + return Array2D } /** diff --git a/src/tree/decisiontree.test.ts b/src/tree/decisiontree.test.ts index 3e496508..6fd710ea 100644 --- a/src/tree/decisiontree.test.ts +++ b/src/tree/decisiontree.test.ts @@ -1,5 +1,5 @@ import { DecisionTreeClassifier, DecisionTreeRegressor } from './decisiontree' -import { loadBoston, loadIris } from '../datasets/datasets' +import { loadIris, dataUrls } from '../datasets/datasets' import * as dfd from 'danfojs-node' describe('DecisionTree', function () { @@ -586,7 +586,7 @@ describe('DecisionTree', function () { } ] /*[[[end]]]*/ - let df = await dfd.readCSV(loadBoston()) + let df = await dfd.readCSV(dataUrls.loadBoston) let y = df['target'].values let X = df.drop({ columns: 'target' }).values From 3251738e09b9e1af9a354b225033a57b1081f573 Mon Sep 17 00:00:00 2001 From: Dan Crescimanno Date: Mon, 18 Apr 2022 18:53:07 -0700 Subject: [PATCH 2/4] feat: remove data loading logic in favor of using dfd.readCSV(url) --- package-lock.json | 14 ---- package.json | 1 - src/datasets/datasets.test.ts | 9 --- src/datasets/datasets.ts | 124 ++-------------------------------- src/index.ts | 2 +- 5 files changed, 8 insertions(+), 142 deletions(-) delete mode 100644 src/datasets/datasets.test.ts diff --git a/package-lock.json b/package-lock.json index a8328c5c..9c22beef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,6 @@ "@tensorflow/tfjs-node": "3.13.0", "lodash": "^4.17.21", "mathjs": "^10.0.0", - "node-fetch": "2.6.0", "seedrandom": "^3.0.5", "simple-statistics": "^7.7.0" }, @@ -10709,14 +10708,6 @@ "lodash": "^4.17.21" } }, - "node_modules/node-fetch": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", - "engines": { - "node": "4.x || >=6.0.0" - } - }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -24497,11 +24488,6 @@ "lodash": "^4.17.21" } }, - "node-fetch": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" - }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", diff --git a/package.json b/package.json index f81229e4..bcdfdc1f 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,6 @@ "@tensorflow/tfjs-node": "3.13.0", "lodash": "^4.17.21", "mathjs": "^10.0.0", - "node-fetch": "2.6.0", "seedrandom": "^3.0.5", "simple-statistics": "^7.7.0" }, diff --git a/src/datasets/datasets.test.ts b/src/datasets/datasets.test.ts deleted file mode 100644 index ec533015..00000000 --- a/src/datasets/datasets.test.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { loadBoston } from './datasets' - -describe('test', function () { - it('loadBoston test', async function () { - let Array2D = await loadBoston() - expect(Array2D.length).toEqual(507) - expect(Array2D[0].length).toEqual(14) - }) -}) diff --git a/src/datasets/datasets.ts b/src/datasets/datasets.ts index 32c38e4e..88b7bead 100644 --- a/src/datasets/datasets.ts +++ b/src/datasets/datasets.ts @@ -1,119 +1,9 @@ -import fetch from 'node-fetch' - export const dataUrls = { - loadBoston: 'http://scikitjs.org/data/boston.csv' -} - -/** - * Loads the Boston housing dataset (regression). Samples 506, features 13. - * @example - * ```typescript - import { loadBoston } from 'scikitjs' - - let Array2D = await loadBoston() - console.log(Array2D[0]) // Headers ['CRIM', 'ZN', ..., 'LSTAT', 'target'] - console.log(Array2D.slice(1)) // All the actual data - ``` - */ - -export async function loadBoston(): Promise>> { - let text = (await fetch(dataUrls.loadBoston) - .then((el) => el.text()) - .catch((el) => { - console.error(`Fetch failed to get url ${dataUrls.loadBoston}`) - console.error(el) - })) as string - let Array2D = text - .split('\n') - .map((el) => el.split(',').map((singleNumb) => Number(singleNumb))) - Array2D.pop() // There is a newline that ends the file and no data after - return Array2D -} - -/** - * Loads the Iris dataset (classification). - * This is a very easy multi-class classification dataset. Samples 150, Classes 3, Features 4. - * @example - * ```typescript - import { loadIris } from 'scikitjs' - - let df = await loadIris() - df.print() - ``` - */ -export function loadIris(): string { - return 'http://scikitjs.org/data/iris.csv' -} - -/** - * Loads the Wine dataset (classification). - * This is a very easy multi-class classification dataset. Samples 178, Classes 3, Features 13. - * @example - * ```typescript - import { loadWine } from 'scikitjs' - - let df = await loadWine() - df.print() - ``` - */ - -export function loadWine(): string { - return 'http://scikitjs.org/data/wine.csv' -} - -/** - * Loads the Diabetes dataset (regression). - * Samples 442, Features 10. - * @example - * ```typescript - import { loadDiabetes } from 'scikitjs' - - let df = await loadDiabetes() - df.print() - ``` - */ - -export function loadDiabetes(): string { - return 'http://scikitjs.org/data/diabetes.csv' -} - -/** - * Loads the Breast Cancer Wisconsin dataset (classification). - * Samples 569, Features 30. - * @example - * ```typescript - import { loadBreastCancer } from 'scikitjs' - - let df = await loadBreastCancer() - df.print() - ``` - */ - -export function loadBreastCancer(): string { - return 'http://scikitjs.org/data/breast_cancer.csv' -} - -/** - * Loads the Digit dataset (classification). - * Samples 1797, Features 64. Each sample is an 8x8 image - * @example - * ```typescript - import { loadDigits } from 'scikitjs' - - let df = await loadDigits() - df.print() - ``` - */ -export function loadDigits(): string { - return 'http://scikitjs.org/data/digits.csv' -} - -/** - * Loads the California housing dataset (regression). - * - * Samples 20640, Features 8. - */ - -export function fetchCaliforniaHousing(): string { - return 'http://scikitjs.org/data/california_housing.csv' + loadBoston: 'http://scikitjs.org/data/boston.csv', + loadIris: 'http://scikitjs.org/data/iris.csv', + loadWine: 'http://scikitjs.org/data/wine.csv', + loadDiabetes: 'http://scikitjs.org/data/diabetes.csv', + loadBreastCancer: 'http://scikitjs.org/data/breast_cancer.csv', + loadDigits: 'http://scikitjs.org/data/digits.csv', + fetchCaliforniaHousing: 'http://scikitjs.org/data/california_housing.csv' } diff --git a/src/index.ts b/src/index.ts index ddc10162..69172976 100644 --- a/src/index.ts +++ b/src/index.ts @@ -58,7 +58,7 @@ export { export { RobustScaler, RobustScalerParams } from './preprocessing/robustScaler' export { KMeans, KMeansParams } from './cluster/kmeans' export { Scikit1D, Scikit2D, ScikitVecOrMatrix } from './types' -export * as datasets from './datasets/datasets' +export { dataUrls } from './datasets/datasets' export { makeVotingRegressor, VotingRegressor, From 3f6654d3aa128cfc0296cd97cb4f672cb2184bc9 Mon Sep 17 00:00:00 2001 From: Dan Crescimanno Date: Mon, 18 Apr 2022 20:35:44 -0700 Subject: [PATCH 3/4] feat: fixed tests --- src/neighbors/kNeighborsClassifier.test.ts | 38 ++++++++++++---------- src/neighbors/kNeighborsRegressor.test.ts | 24 +++++++++----- src/tree/decisiontree.test.ts | 4 +-- 3 files changed, 38 insertions(+), 28 deletions(-) diff --git a/src/neighbors/kNeighborsClassifier.test.ts b/src/neighbors/kNeighborsClassifier.test.ts index 5a512e66..0226bf88 100644 --- a/src/neighbors/kNeighborsClassifier.test.ts +++ b/src/neighbors/kNeighborsClassifier.test.ts @@ -15,12 +15,7 @@ import { KNeighborsClassifier } from './kNeighborsClassifier' import { KNeighborsParams } from './kNeighborsBase' -import { - loadDigits, - loadIris, - loadWine, - loadBreastCancer -} from '../datasets/datasets' +import { dataUrls } from '../datasets/datasets' import { crossValScore } from '../model_selection/crossValScore' import { KFold } from '../model_selection/kFold' import { arrayEqual } from '../utils' @@ -31,15 +26,16 @@ type Tensor1D = tf.Tensor1D type Tensor2D = tf.Tensor2D function testWithDataset( - loadData: () => string, + loadDataUrl: string, + loadDataName: string, params: KNeighborsParams, referenceAccuracy: number ) { it( - `matches sklearn fitting ${loadData.name}`.padEnd(48) + + `matches sklearn fitting ${loadDataName}`.padEnd(48) + JSON.stringify(params), async () => { - const df = await dfd.readCSV(loadData()) + const df = await dfd.readCSV(loadDataUrl) const Xy = df.tensor as unknown as Tensor2D let [nSamples, nFeatures] = Xy.shape @@ -72,46 +68,54 @@ for (const algorithm of [ ]) { describe(`KNeighborsClassifier({ algorithm: ${algorithm} })`, () => { testWithDataset( - loadIris, + dataUrls.loadIris, + 'loadIris', { nNeighbors: 5, weights: 'distance', algorithm }, 0.0 ) testWithDataset( - loadIris, + dataUrls.loadIris, + 'loadIris', { nNeighbors: 3, weights: 'uniform', algorithm }, 0.0 ) testWithDataset( - loadWine, + dataUrls.loadWine, + 'loadWine', { nNeighbors: 5, weights: 'distance', algorithm }, 0.135 ) testWithDataset( - loadWine, + dataUrls.loadWine, + 'loadWine', { nNeighbors: 3, weights: 'uniform', algorithm }, 0.158 ) testWithDataset( - loadBreastCancer, + dataUrls.loadBreastCancer, + 'loadBreastCancer', { nNeighbors: 5, weights: 'distance', algorithm }, 0.92 ) testWithDataset( - loadBreastCancer, + dataUrls.loadBreastCancer, + 'loadBreastCancer', { nNeighbors: 3, weights: 'uniform', algorithm }, 0.916 ) if ('brute' !== algorithm) { testWithDataset( - loadDigits, + dataUrls.loadDigits, + 'loadDigits', { nNeighbors: 5, weights: 'distance', algorithm, leafSize: 256 }, 0.963 ) testWithDataset( - loadDigits, + dataUrls.loadDigits, + 'loadDigits', { nNeighbors: 3, weights: 'uniform', algorithm, leafSize: 256 }, 0.967 ) diff --git a/src/neighbors/kNeighborsRegressor.test.ts b/src/neighbors/kNeighborsRegressor.test.ts index 4b7001d2..58dd53fa 100644 --- a/src/neighbors/kNeighborsRegressor.test.ts +++ b/src/neighbors/kNeighborsRegressor.test.ts @@ -15,7 +15,7 @@ import { KNeighborsRegressor } from './kNeighborsRegressor' import { KNeighborsParams } from './kNeighborsBase' -import { fetchCaliforniaHousing, loadDiabetes } from '../datasets/datasets' +import { dataUrls } from '../datasets/datasets' import { arrayEqual } from '../utils' import { crossValScore } from '../model_selection/crossValScore' import { KFold } from '../model_selection/kFold' @@ -28,15 +28,16 @@ type Tensor1D = tf.Tensor1D type Tensor2D = tf.Tensor2D function testWithDataset( - loadData: () => string, + loadDataUrl: string, + loadDataName: string, params: KNeighborsParams, referenceError: number ) { it( - `matches sklearn fitting ${loadData.name}`.padEnd(48) + + `matches sklearn fitting ${loadDataName}`.padEnd(48) + JSON.stringify(params), async () => { - const df = await dfd.readCSV(loadData()) + const df = await dfd.readCSV(loadDataUrl) const Xy = df.tensor as unknown as Tensor2D let [nSamples, nFeatures] = Xy.shape @@ -70,32 +71,37 @@ for (const algorithm of [ ]) { describe(`KNeighborsRegressor({ algorithm: ${algorithm} })`, function () { testWithDataset( - loadDiabetes, + dataUrls.loadDiabetes, + 'loadDiabetes', { nNeighbors: 5, weights: 'distance', algorithm }, 3570 ) testWithDataset( - loadDiabetes, + dataUrls.loadDiabetes, + 'loadDiabetes', { nNeighbors: 3, weights: 'uniform', algorithm }, 3833 ) if ('kdTree' === algorithm) { testWithDataset( - fetchCaliforniaHousing, + dataUrls.fetchCaliforniaHousing, + 'fetchCaliforniaHousing', { nNeighbors: 3, weights: 'distance', algorithm }, 1.31 ) } if ('auto' === algorithm) { testWithDataset( - fetchCaliforniaHousing, + dataUrls.fetchCaliforniaHousing, + 'fetchCaliforniaHousing', { nNeighbors: 4, weights: 'uniform', algorithm, p: 1 }, 1.19 ) } if (undefined === algorithm) { testWithDataset( - fetchCaliforniaHousing, + dataUrls.fetchCaliforniaHousing, + 'fetchCaliforniaHousing', { nNeighbors: 4, weights: 'uniform', algorithm, p: Infinity }, 1.32 ) diff --git a/src/tree/decisiontree.test.ts b/src/tree/decisiontree.test.ts index 6fd710ea..cb500392 100644 --- a/src/tree/decisiontree.test.ts +++ b/src/tree/decisiontree.test.ts @@ -1,5 +1,5 @@ import { DecisionTreeClassifier, DecisionTreeRegressor } from './decisiontree' -import { loadIris, dataUrls } from '../datasets/datasets' +import { dataUrls } from '../datasets/datasets' import * as dfd from 'danfojs-node' describe('DecisionTree', function () { @@ -424,7 +424,7 @@ describe('DecisionTree', function () { } ] /*[[[end]]]*/ - let df = await dfd.readCSV(loadIris()) + let df = await dfd.readCSV(dataUrls.loadIris) let y = df['target'].values let X = df.drop({ columns: 'target' }).values From 3c9e7f8e2f8dadf619c80a2824a4b5983f09f9be Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 19 Apr 2022 03:49:44 +0000 Subject: [PATCH 4/4] chore(release): 1.16.0 [skip ci] # [1.16.0](https://github.com/javascriptdata/scikit.js/compare/v1.15.0...v1.16.0) (2022-04-19) ### Features * fixed loadBoston calls. Need to do the others ([05c9d9a](https://github.com/javascriptdata/scikit.js/commit/05c9d9af772c1d197798ea28fdd985e92b6fc5ac)) * fixed tests ([3f6654d](https://github.com/javascriptdata/scikit.js/commit/3f6654d3aa128cfc0296cd97cb4f672cb2184bc9)) * remove data loading logic in favor of using dfd.readCSV(url) ([3251738](https://github.com/javascriptdata/scikit.js/commit/3251738e09b9e1af9a354b225033a57b1081f573)) --- CHANGELOG.md | 9 +++++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b19b0b15..39286db6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +# [1.16.0](https://github.com/javascriptdata/scikit.js/compare/v1.15.0...v1.16.0) (2022-04-19) + + +### Features + +* fixed loadBoston calls. Need to do the others ([05c9d9a](https://github.com/javascriptdata/scikit.js/commit/05c9d9af772c1d197798ea28fdd985e92b6fc5ac)) +* fixed tests ([3f6654d](https://github.com/javascriptdata/scikit.js/commit/3f6654d3aa128cfc0296cd97cb4f672cb2184bc9)) +* remove data loading logic in favor of using dfd.readCSV(url) ([3251738](https://github.com/javascriptdata/scikit.js/commit/3251738e09b9e1af9a354b225033a57b1081f573)) + # [1.15.0](https://github.com/javascriptdata/scikit.js/compare/v1.14.0...v1.15.0) (2022-04-18) diff --git a/package-lock.json b/package-lock.json index 350ee9cc..60bfe979 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "scikitjs", - "version": "1.15.0", + "version": "1.16.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "scikitjs", - "version": "1.15.0", + "version": "1.16.0", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index a9b31f52..9cd76462 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "scikitjs", - "version": "1.15.0", + "version": "1.16.0", "description": "Scikit-Learn for JS", "output": { "node": "dist/node/index.js",