UNPKG

@modelx/modelx

Version:

Construct AI & ML models with JSON using Typescript & Tensorflow

231 lines (227 loc) 9.75 kB
import { ModelX, ModelTypes, EvaluateRegressionModel, EvaluateClassificationModel, } from './model'; import { Dimensions, getIsOutlier, mockDates } from './constants'; import { DataSet, } from '@modelx/data/src/index'; import { Faker, getData, getDatum, timeseriesSort, getMockClassification, getMockRegression, getMockTimeseries, } from './util'; describe('ModelX', () => { describe('evaluateClassificationAccuracy', () => { it('should return classification accuracy', () => { const testClassification = { dependent_feature_label: 'testClassification', estimatesDescaled: [1, 2, 3, 4, 5, 6, 7, 8, 9, 0].map(v => ({ testClassification: v })), actualsDescaled: [0, 2, 0, 4, 0, 6, 0, 8, 0, 0].map(v => ({ testClassification: v })), }; const m1 = new ModelX({ debug:false, model_type: ModelTypes.CLASSIFICATION, }); const evaluation = m1.evaluateClassificationAccuracy(testClassification); expect(evaluation.accuracy).toBe(0.5); // console.log('evaluation', evaluation); }); it('should return regression accuracy', () => { const testRegression = { dependent_feature_label: 'testRegression', estimatesDescaled: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100].map(v => ({ testRegression: v })), actualsDescaled: [9, 20, 31, 40, 49, 60, 71, 80, 89, 101].map(v => ({ testRegression: v })), }; const m1 = new ModelX({ debug:false, model_type: ModelTypes.REGRESSION, }); const evaluation = m1.evaluateRegressionAccuracy(testRegression); expect(evaluation.accuracyPercentage).toBeGreaterThanOrEqual(0.98); // console.log('evaluation', evaluation); }); }); describe('async predictModel', () => { const regressionData = getMockRegression(); const classificationData = getMockClassification(); const timeseriesData = getMockTimeseries(); it('should handle regression predictions', async () => { const { prediction_inputs, independent_variables, dependent_variables, data, } = regressionData; const m1 = new ModelX({ debug:false, model_type: ModelTypes.REGRESSION, prediction_inputs, independent_variables, dependent_variables, training_options: { fit: { batchSize: data.length, epochs: 300, } }, trainingData: data, }); expect(m1.status.trained).toBe(false); const predictions = await m1.predictModel({ includeEvaluation: false, includeInputs: true }); expect(m1.status.trained).toBe(true); expect(m1.Model.trained).toBe(true); // console.log({ predictions }); expect(predictions.length).toBe(prediction_inputs.length); expect(predictions[0].input_1).toBe(prediction_inputs[0].input_1); expect(predictions[0].output_1).toBeLessThanOrEqual(predictions[predictions.length - 1].output_1); // console.log('data.length',data.length) }, 15000); it('should handle timeseries predictions', async () => { const { prediction_inputs, independent_variables, dependent_variables,timeseriesData:data, } = timeseriesData; const m1 = new ModelX({ debug:false, model_type: ModelTypes.TIMESERIES_REGRESSION_FORECAST, prediction_inputs, independent_variables, dependent_variables, training_options: { fit: { batchSize: data.length, epochs: 300, } }, trainingData: data, }); expect(m1.status.trained).toBe(false); const predictions = await m1.predictModel({ includeEvaluation: false, includeInputs: true }); expect(m1.status.trained).toBe(true); expect(m1.Model.trained).toBe(true); console.log({ predictions }); // expect(predictions.length).toBe(prediction_inputs.length); // expect(predictions[0].input_1).toBe(prediction_inputs[0].input_1); // expect(predictions[0].output_1).toBeLessThanOrEqual(predictions[predictions.length - 1].output_1); // console.log('data.length',data.length) }, 15000); it('should handle classification predictions', async () => { const { prediction_inputs, independent_variables, dependent_variables, data, } = classificationData; const m1 = new ModelX({ debug:false, model_type: ModelTypes.CLASSIFICATION, prediction_inputs, independent_variables, dependent_variables, training_options: { fit: { batchSize: data.length, epochs: 300, } }, trainingData: data, }); expect(m1.status.trained).toBe(false); const predictions = await m1.predictModel({ includeEvaluation: false, includeInputs: true }); // console.log('m1.trainDataSet',m1.trainDataSet); expect(m1.status.trained).toBe(true); expect(m1.Model.trained).toBe(true); // console.log({ predictions }); expect(predictions.length).toBe(prediction_inputs.length); expect(predictions[0].animal).toBe('dog'); expect(predictions[1].animal).toBe('cat'); // expect(predictions[0].output_1).toBeLessThan(predictions[predictions.length - 1].output_1); // console.log('data.length',data.length) },15000); it('should accept traningData via options', async () => { const {data, }=getMockRegression(); const m1 = new ModelX({ debug:false, model_type: ModelTypes.REGRESSION, }); expect(m1.trainingData.length).toBe(0); await m1.getTrainingData({trainingData:data}); expect(m1.trainingData.length).toBe(data.length); }); it('should get trainingData via a getDataPromise function', async () => { const {data, }=getMockRegression(); const m1 = new ModelX({ debug:false, model_type: ModelTypes.REGRESSION, }); expect(m1.trainingData.length).toBe(0); async function getDataPromise() { return data; } await m1.getTrainingData({getDataPromise,}); expect(m1.trainingData.length).toBe(data.length); }); }); describe('async evaluateModel', () => { const regressionData = getMockRegression(); const classificationData = getMockClassification(); it('should handle regression evaluations', async () => { const { prediction_inputs, independent_variables, dependent_variables, data, } = regressionData; const m1 = new ModelX({ debug:false, model_type: ModelTypes.REGRESSION, prediction_inputs, independent_variables, dependent_variables, training_options: { fit: { batchSize: data.length, epochs: 300, } }, trainingData: data, }); expect(m1.status.trained).toBe(false); const evaluation = await m1.evaluateModel({}) as EvaluateRegressionModel; // console.log({ evaluation }); expect(m1.status.trained).toBe(true); expect(m1.Model.trained).toBe(true); expect(evaluation.output_1.standardError).toBeGreaterThan(0); // console.log({ predictions }); // expect(predictions.length).toBe(prediction_inputs.length); // expect(predictions[0].input_1).toBe(prediction_inputs[0].input_1); // expect(predictions[0].output_1).toBeLessThanOrEqual(predictions[predictions.length - 1].output_1); // console.log('data.length',data.length) },15000); it('should handle classification evaluations', async () => { const { prediction_inputs, independent_variables, dependent_variables, data, } = classificationData; const m1 = new ModelX({ debug:false, model_type: ModelTypes.CLASSIFICATION, prediction_inputs, independent_variables, dependent_variables, training_options: { fit: { batchSize: data.length, epochs: 300, } }, trainingData: data, }); expect(m1.status.trained).toBe(false); const evaluation = await m1.evaluateModel({}) as EvaluateClassificationModel; // console.log('evaluation.animal',evaluation.animal); expect(m1.status.trained).toBe(true); expect(m1.Model.trained).toBe(true); expect(evaluation.animal.accuracy).toBeGreaterThan(0); // expect(predictions.length).toBe(prediction_inputs.length); // expect(predictions[0].animal).toBe('dog'); // expect(predictions[1].animal).toBe('cat'); // expect(predictions[0].output_1).toBeLessThan(predictions[predictions.length - 1].output_1); // console.log('data.length',data.length) },15000); it('should accept traningData via options', async () => { const {data, }=getMockRegression(); const m1 = new ModelX({ debug:false, model_type: ModelTypes.REGRESSION, }); expect(m1.trainingData.length).toBe(0); await m1.getTrainingData({trainingData:data}); expect(m1.trainingData.length).toBe(data.length); }); it('should get trainingData via a getDataPromise function', async () => { const {data, }=getMockRegression(); const m1 = new ModelX({ debug:false, model_type: ModelTypes.REGRESSION, }); expect(m1.trainingData.length).toBe(0); async function getDataPromise() { return data; } await m1.getTrainingData({getDataPromise,}); expect(m1.trainingData.length).toBe(data.length); }); }); });