nlptoolkit-classification 1.0.8 → 1.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Attribute/Attribute.js +6 -16
- package/dist/Attribute/Attribute.js.map +1 -1
- package/dist/Attribute/AttributeType.js +22 -32
- package/dist/Attribute/AttributeType.js.map +1 -1
- package/dist/Attribute/BinaryAttribute.js +14 -24
- package/dist/Attribute/BinaryAttribute.js.map +1 -1
- package/dist/Attribute/ContinuousAttribute.js +46 -55
- package/dist/Attribute/ContinuousAttribute.js.map +1 -1
- package/dist/Attribute/DiscreteAttribute.js +38 -48
- package/dist/Attribute/DiscreteAttribute.js.map +1 -1
- package/dist/Attribute/DiscreteIndexedAttribute.js +47 -55
- package/dist/Attribute/DiscreteIndexedAttribute.js.map +1 -1
- package/dist/DataSet/DataDefinition.js +115 -123
- package/dist/DataSet/DataDefinition.js.map +1 -1
- package/dist/DataSet/DataSet.js +268 -245
- package/dist/DataSet/DataSet.js.map +1 -1
- package/dist/DistanceMetric/DistanceMetric.js +2 -12
- package/dist/DistanceMetric/EuclidianDistance.js +27 -37
- package/dist/DistanceMetric/EuclidianDistance.js.map +1 -1
- package/dist/DistanceMetric/MahalanobisDistance.js +27 -36
- package/dist/DistanceMetric/MahalanobisDistance.js.map +1 -1
- package/dist/Experiment/BootstrapRun.js +31 -40
- package/dist/Experiment/BootstrapRun.js.map +1 -1
- package/dist/Experiment/Experiment.js +46 -53
- package/dist/Experiment/Experiment.js.map +1 -1
- package/dist/Experiment/KFoldRun.js +45 -54
- package/dist/Experiment/KFoldRun.js.map +1 -1
- package/dist/Experiment/KFoldRunSeparateTest.js +48 -58
- package/dist/Experiment/KFoldRunSeparateTest.js.map +1 -1
- package/dist/Experiment/MultipleRun.js +2 -12
- package/dist/Experiment/MxKFoldRun.js +31 -40
- package/dist/Experiment/MxKFoldRun.js.map +1 -1
- package/dist/Experiment/MxKFoldRunSeparateTest.js +35 -44
- package/dist/Experiment/MxKFoldRunSeparateTest.js.map +1 -1
- package/dist/Experiment/SingleRun.js +2 -12
- package/dist/Experiment/SingleRunWithK.js +39 -48
- package/dist/Experiment/SingleRunWithK.js.map +1 -1
- package/dist/Experiment/StratifiedKFoldRun.js +26 -36
- package/dist/Experiment/StratifiedKFoldRun.js.map +1 -1
- package/dist/Experiment/StratifiedKFoldRunSeparateTest.js +30 -40
- package/dist/Experiment/StratifiedKFoldRunSeparateTest.js.map +1 -1
- package/dist/Experiment/StratifiedMxKFoldRun.js +29 -39
- package/dist/Experiment/StratifiedMxKFoldRun.js.map +1 -1
- package/dist/Experiment/StratifiedMxKFoldRunSeparateTest.js +34 -43
- package/dist/Experiment/StratifiedMxKFoldRunSeparateTest.js.map +1 -1
- package/dist/Experiment/StratifiedSingleRunWithK.js +27 -36
- package/dist/Experiment/StratifiedSingleRunWithK.js.map +1 -1
- package/dist/FeatureSelection/BackwardSelection.js +26 -36
- package/dist/FeatureSelection/BackwardSelection.js.map +1 -1
- package/dist/FeatureSelection/FeatureSubSet.js +72 -82
- package/dist/FeatureSelection/FeatureSubSet.js.map +1 -1
- package/dist/FeatureSelection/FloatingSelection.js +25 -35
- package/dist/FeatureSelection/FloatingSelection.js.map +1 -1
- package/dist/FeatureSelection/ForwardSelection.js +25 -35
- package/dist/FeatureSelection/ForwardSelection.js.map +1 -1
- package/dist/FeatureSelection/SubSetSelection.js +69 -78
- package/dist/FeatureSelection/SubSetSelection.js.map +1 -1
- package/dist/Filter/DiscreteToContinuous.js +50 -60
- package/dist/Filter/DiscreteToContinuous.js.map +1 -1
- package/dist/Filter/DiscreteToIndexed.js +40 -50
- package/dist/Filter/DiscreteToIndexed.js.map +1 -1
- package/dist/Filter/FeatureFilter.js +23 -32
- package/dist/Filter/FeatureFilter.js.map +1 -1
- package/dist/Filter/LaryFilter.js +46 -55
- package/dist/Filter/LaryFilter.js.map +1 -1
- package/dist/Filter/LaryToBinary.js +48 -58
- package/dist/Filter/LaryToBinary.js.map +1 -1
- package/dist/Filter/Normalize.js +33 -41
- package/dist/Filter/Normalize.js.map +1 -1
- package/dist/Filter/Pca.js +86 -96
- package/dist/Filter/Pca.js.map +1 -1
- package/dist/Filter/TrainedFeatureFilter.js +14 -24
- package/dist/Filter/TrainedFeatureFilter.js.map +1 -1
- package/dist/Instance/CompositeInstance.js +46 -56
- package/dist/Instance/CompositeInstance.js.map +1 -1
- package/dist/Instance/Instance.js +145 -154
- package/dist/Instance/Instance.js.map +1 -1
- package/dist/InstanceList/InstanceList.js +466 -443
- package/dist/InstanceList/InstanceList.js.map +1 -1
- package/dist/InstanceList/InstanceListOfSameClass.js +23 -32
- package/dist/InstanceList/InstanceListOfSameClass.js.map +1 -1
- package/dist/InstanceList/Partition.js +167 -177
- package/dist/InstanceList/Partition.js.map +1 -1
- package/dist/Model/DecisionTree/DecisionCondition.js +71 -80
- package/dist/Model/DecisionTree/DecisionCondition.js.map +1 -1
- package/dist/Model/DecisionTree/DecisionNode.js +302 -311
- package/dist/Model/DecisionTree/DecisionNode.js.map +1 -1
- package/dist/Model/DecisionTree/DecisionStump.js +22 -32
- package/dist/Model/DecisionTree/DecisionStump.js.map +1 -1
- package/dist/Model/DecisionTree/DecisionTree.js +89 -98
- package/dist/Model/DecisionTree/DecisionTree.js.map +1 -1
- package/dist/Model/DummyModel.js +64 -73
- package/dist/Model/DummyModel.js.map +1 -1
- package/dist/Model/Ensemble/BaggingModel.js +34 -44
- package/dist/Model/Ensemble/BaggingModel.js.map +1 -1
- package/dist/Model/Ensemble/RandomForestModel.js +31 -41
- package/dist/Model/Ensemble/RandomForestModel.js.map +1 -1
- package/dist/Model/Ensemble/TreeEnsembleModel.js +55 -64
- package/dist/Model/Ensemble/TreeEnsembleModel.js.map +1 -1
- package/dist/Model/Model.js +130 -140
- package/dist/Model/Model.js.map +1 -1
- package/dist/Model/NeuralNetwork/DeepNetworkModel.js +162 -169
- package/dist/Model/NeuralNetwork/DeepNetworkModel.js.map +1 -1
- package/dist/Model/NeuralNetwork/LinearPerceptronModel.js +69 -78
- package/dist/Model/NeuralNetwork/LinearPerceptronModel.js.map +1 -1
- package/dist/Model/NeuralNetwork/MultiLayerPerceptronModel.js +112 -120
- package/dist/Model/NeuralNetwork/MultiLayerPerceptronModel.js.map +1 -1
- package/dist/Model/NeuralNetwork/NeuralNetworkModel.js +197 -201
- package/dist/Model/NeuralNetwork/NeuralNetworkModel.js.map +1 -1
- package/dist/Model/NonParametric/KnnInstance.js +21 -29
- package/dist/Model/NonParametric/KnnInstance.js.map +1 -1
- package/dist/Model/NonParametric/KnnModel.js +101 -108
- package/dist/Model/NonParametric/KnnModel.js.map +1 -1
- package/dist/Model/Parametric/GaussianModel.js +82 -91
- package/dist/Model/Parametric/GaussianModel.js.map +1 -1
- package/dist/Model/Parametric/KMeansModel.js +59 -67
- package/dist/Model/Parametric/KMeansModel.js.map +1 -1
- package/dist/Model/Parametric/LdaModel.js +83 -91
- package/dist/Model/Parametric/LdaModel.js.map +1 -1
- package/dist/Model/Parametric/NaiveBayesModel.js +119 -132
- package/dist/Model/Parametric/NaiveBayesModel.js.map +1 -1
- package/dist/Model/Parametric/QdaModel.js +70 -79
- package/dist/Model/Parametric/QdaModel.js.map +1 -1
- package/dist/Model/RandomModel.js +85 -92
- package/dist/Model/RandomModel.js.map +1 -1
- package/dist/Model/ValidatedModel.js +21 -31
- package/dist/Model/ValidatedModel.js.map +1 -1
- package/dist/Parameter/ActivationFunction.js +9 -19
- package/dist/Parameter/ActivationFunction.js.map +1 -1
- package/dist/Parameter/BaggingParameter.js +24 -33
- package/dist/Parameter/BaggingParameter.js.map +1 -1
- package/dist/Parameter/C45Parameter.js +34 -42
- package/dist/Parameter/C45Parameter.js.map +1 -1
- package/dist/Parameter/DeepNetworkParameter.js +48 -56
- package/dist/Parameter/DeepNetworkParameter.js.map +1 -1
- package/dist/Parameter/KMeansParameter.js +29 -38
- package/dist/Parameter/KMeansParameter.js.map +1 -1
- package/dist/Parameter/KnnParameter.js +25 -34
- package/dist/Parameter/KnnParameter.js.map +1 -1
- package/dist/Parameter/LinearPerceptronParameter.js +56 -62
- package/dist/Parameter/LinearPerceptronParameter.js.map +1 -1
- package/dist/Parameter/MultiLayerPerceptronParameter.js +38 -46
- package/dist/Parameter/MultiLayerPerceptronParameter.js.map +1 -1
- package/dist/Parameter/Parameter.js +21 -30
- package/dist/Parameter/Parameter.js.map +1 -1
- package/dist/Parameter/RandomForestParameter.js +25 -34
- package/dist/Parameter/RandomForestParameter.js.map +1 -1
- package/dist/Performance/ClassificationPerformance.js +24 -33
- package/dist/Performance/ClassificationPerformance.js.map +1 -1
- package/dist/Performance/ConfusionMatrix.js +149 -158
- package/dist/Performance/ConfusionMatrix.js.map +1 -1
- package/dist/Performance/DetailedClassificationPerformance.js +23 -32
- package/dist/Performance/DetailedClassificationPerformance.js.map +1 -1
- package/dist/Performance/ExperimentPerformance.js +184 -161
- package/dist/Performance/ExperimentPerformance.js.map +1 -1
- package/dist/Performance/Performance.js +21 -30
- package/dist/Performance/Performance.js.map +1 -1
- package/dist/StatisticalTest/Combined5x2F.js +41 -51
- package/dist/StatisticalTest/Combined5x2F.js.map +1 -1
- package/dist/StatisticalTest/Combined5x2t.js +42 -52
- package/dist/StatisticalTest/Combined5x2t.js.map +1 -1
- package/dist/StatisticalTest/Paired5x2t.js +40 -50
- package/dist/StatisticalTest/Paired5x2t.js.map +1 -1
- package/dist/StatisticalTest/PairedTest.js +31 -41
- package/dist/StatisticalTest/PairedTest.js.map +1 -1
- package/dist/StatisticalTest/Pairedt.js +38 -48
- package/dist/StatisticalTest/Pairedt.js.map +1 -1
- package/dist/StatisticalTest/Sign.js +50 -60
- package/dist/StatisticalTest/Sign.js.map +1 -1
- package/dist/StatisticalTest/StatisticalTestResult.js +65 -73
- package/dist/StatisticalTest/StatisticalTestResult.js.map +1 -1
- package/dist/StatisticalTest/StatisticalTestResultType.js +11 -21
- package/dist/StatisticalTest/StatisticalTestResultType.js.map +1 -1
- package/dist/index.js +95 -101
- package/dist/index.js.map +1 -1
- package/package.json +7 -6
- package/tsconfig.json +4 -3
- package/source/tsconfig.json +0 -13
|
@@ -1,44 +1,34 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
* @param parameters Parameters of the bagging trees algorithm. ensembleSize returns the number of trees in the random forest.
|
|
24
|
-
*/
|
|
25
|
-
train(trainSet, parameters) {
|
|
26
|
-
let forestSize = parameters.getEnsembleSize();
|
|
27
|
-
this.forest = new Array();
|
|
28
|
-
for (let i = 0; i < forestSize; i++) {
|
|
29
|
-
let bootstrap = trainSet.bootstrap(i);
|
|
30
|
-
let tree = new DecisionTree_1.DecisionTree(new DecisionNode_1.DecisionNode(new InstanceList_1.InstanceList(bootstrap.getSample()), undefined, parameters, false));
|
|
31
|
-
this.forest.push(tree);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Loads the random forest model from an input file.
|
|
36
|
-
* @param fileName File name of the random forest model.
|
|
37
|
-
*/
|
|
38
|
-
loadModel(fileName) {
|
|
39
|
-
this.constructor2(fileName);
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RandomForestModel = void 0;
|
|
4
|
+
const TreeEnsembleModel_1 = require("./TreeEnsembleModel");
|
|
5
|
+
const InstanceList_1 = require("../../InstanceList/InstanceList");
|
|
6
|
+
const DecisionTree_1 = require("../DecisionTree/DecisionTree");
|
|
7
|
+
const DecisionNode_1 = require("../DecisionTree/DecisionNode");
|
|
8
|
+
class RandomForestModel extends TreeEnsembleModel_1.TreeEnsembleModel {
|
|
9
|
+
/**
|
|
10
|
+
* Training algorithm for random forest classifier. Basically the algorithm creates K distinct decision trees from
|
|
11
|
+
* K bootstrap samples of the original training set.
|
|
12
|
+
*
|
|
13
|
+
* @param trainSet Training data given to the algorithm
|
|
14
|
+
* @param parameters Parameters of the bagging trees algorithm. ensembleSize returns the number of trees in the random forest.
|
|
15
|
+
*/
|
|
16
|
+
train(trainSet, parameters) {
|
|
17
|
+
let forestSize = parameters.getEnsembleSize();
|
|
18
|
+
this.forest = new Array();
|
|
19
|
+
for (let i = 0; i < forestSize; i++) {
|
|
20
|
+
let bootstrap = trainSet.bootstrap(i);
|
|
21
|
+
let tree = new DecisionTree_1.DecisionTree(new DecisionNode_1.DecisionNode(new InstanceList_1.InstanceList(bootstrap.getSample()), undefined, parameters, false));
|
|
22
|
+
this.forest.push(tree);
|
|
40
23
|
}
|
|
41
24
|
}
|
|
42
|
-
|
|
43
|
-
|
|
25
|
+
/**
|
|
26
|
+
* Loads the random forest model from an input file.
|
|
27
|
+
* @param fileName File name of the random forest model.
|
|
28
|
+
*/
|
|
29
|
+
loadModel(fileName) {
|
|
30
|
+
this.constructor2(fileName);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
exports.RandomForestModel = RandomForestModel;
|
|
44
34
|
//# sourceMappingURL=RandomForestModel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RandomForestModel.js","sourceRoot":"","sources":["../../../source/Model/Ensemble/RandomForestModel.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"RandomForestModel.js","sourceRoot":"","sources":["../../../source/Model/Ensemble/RandomForestModel.ts"],"names":[],"mappings":";;;AAAA,2DAAsD;AACtD,kEAA6D;AAG7D,+DAA0D;AAC1D,+DAA0D;AAE1D,MAAa,iBAAkB,SAAQ,qCAAiB;IAEpD;;;;;;OAMG;IACH,KAAK,CAAC,QAAsB,EAAE,UAAqB;QAC/C,IAAI,UAAU,GAA4B,UAAW,CAAC,eAAe,EAAE,CAAC;QACxE,IAAI,CAAC,MAAM,GAAG,IAAI,KAAK,EAAgB,CAAC;QACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAC,CAAC;YACjC,IAAI,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACtC,IAAI,IAAI,GAAG,IAAI,2BAAY,CAAC,IAAI,2BAAY,CAAC,IAAI,2BAAY,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC,EAAE,SAAS,EAA0B,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;YAC7I,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,SAAS,CAAC,QAAgB;QACtB,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAA;IAC/B,CAAC;CAEJ;AA3BD,8CA2BC"}
|
|
@@ -1,70 +1,61 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TreeEnsembleModel = void 0;
|
|
4
|
+
const Model_1 = require("../Model");
|
|
5
|
+
const DecisionTree_1 = require("../DecisionTree/DecisionTree");
|
|
6
|
+
const DiscreteDistribution_1 = require("nlptoolkit-math/dist/DiscreteDistribution");
|
|
7
|
+
const FileContents_1 = require("nlptoolkit-util/dist/FileContents");
|
|
8
|
+
const DecisionNode_1 = require("../DecisionTree/DecisionNode");
|
|
9
|
+
class TreeEnsembleModel extends Model_1.Model {
|
|
10
|
+
forest;
|
|
11
|
+
/**
|
|
12
|
+
* A constructor which sets the {@link Array} of {@link DecisionTree} with given input.
|
|
13
|
+
*
|
|
14
|
+
* @param forest An {@link Array} of {@link DecisionTree}.
|
|
15
|
+
*/
|
|
16
|
+
constructor1(forest) {
|
|
17
|
+
this.forest = forest;
|
|
5
18
|
}
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const FileContents_1 = require("nlptoolkit-util/dist/FileContents");
|
|
17
|
-
const DecisionNode_1 = require("../DecisionTree/DecisionNode");
|
|
18
|
-
class TreeEnsembleModel extends Model_1.Model {
|
|
19
|
-
/**
|
|
20
|
-
* A constructor which sets the {@link Array} of {@link DecisionTree} with given input.
|
|
21
|
-
*
|
|
22
|
-
* @param forest An {@link Array} of {@link DecisionTree}.
|
|
23
|
-
*/
|
|
24
|
-
constructor1(forest) {
|
|
25
|
-
this.forest = forest;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Loads a tree ensemble model such as Random Forest model or Bagging model from an input model file.
|
|
29
|
-
* @param fileName Model file name.
|
|
30
|
-
*/
|
|
31
|
-
constructor2(fileName) {
|
|
32
|
-
let input = new FileContents_1.FileContents(fileName);
|
|
33
|
-
let numberOfTrees = parseInt(input.readLine());
|
|
34
|
-
this.forest = new Array();
|
|
35
|
-
for (let i = 0; i < numberOfTrees; i++) {
|
|
36
|
-
this.forest.push(new DecisionTree_1.DecisionTree(new DecisionNode_1.DecisionNode(input)));
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* The predict method takes an {@link Instance} as an input and loops through the {@link ArrayList} of {@link DecisionTree}s.
|
|
41
|
-
* Makes prediction for the items of that ArrayList and returns the maximum item of that ArrayList.
|
|
42
|
-
*
|
|
43
|
-
* @param instance Instance to make prediction.
|
|
44
|
-
* @return The maximum prediction of a given Instance.
|
|
45
|
-
*/
|
|
46
|
-
predict(instance) {
|
|
47
|
-
let distribution = new DiscreteDistribution_1.DiscreteDistribution();
|
|
48
|
-
for (let tree of this.forest) {
|
|
49
|
-
distribution.addItem(tree.predict(instance));
|
|
50
|
-
}
|
|
51
|
-
return distribution.getMaxItem();
|
|
19
|
+
/**
|
|
20
|
+
* Loads a tree ensemble model such as Random Forest model or Bagging model from an input model file.
|
|
21
|
+
* @param fileName Model file name.
|
|
22
|
+
*/
|
|
23
|
+
constructor2(fileName) {
|
|
24
|
+
let input = new FileContents_1.FileContents(fileName);
|
|
25
|
+
let numberOfTrees = parseInt(input.readLine());
|
|
26
|
+
this.forest = new Array();
|
|
27
|
+
for (let i = 0; i < numberOfTrees; i++) {
|
|
28
|
+
this.forest.push(new DecisionTree_1.DecisionTree(new DecisionNode_1.DecisionNode(input)));
|
|
52
29
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* The predict method takes an {@link Instance} as an input and loops through the {@link ArrayList} of {@link DecisionTree}s.
|
|
33
|
+
* Makes prediction for the items of that ArrayList and returns the maximum item of that ArrayList.
|
|
34
|
+
*
|
|
35
|
+
* @param instance Instance to make prediction.
|
|
36
|
+
* @return The maximum prediction of a given Instance.
|
|
37
|
+
*/
|
|
38
|
+
predict(instance) {
|
|
39
|
+
let distribution = new DiscreteDistribution_1.DiscreteDistribution();
|
|
40
|
+
for (let tree of this.forest) {
|
|
41
|
+
distribution.addItem(tree.predict(instance));
|
|
64
42
|
}
|
|
65
|
-
|
|
43
|
+
return distribution.getMaxItem();
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Calculates the posterior probability distribution for the given instance according to ensemble tree model.
|
|
47
|
+
* @param instance Instance for which posterior probability distribution is calculated.
|
|
48
|
+
* @return Posterior probability distribution for the given instance.
|
|
49
|
+
*/
|
|
50
|
+
predictProbability(instance) {
|
|
51
|
+
let distribution = new DiscreteDistribution_1.DiscreteDistribution();
|
|
52
|
+
for (let tree of this.forest) {
|
|
53
|
+
distribution.addItem(tree.predict(instance));
|
|
66
54
|
}
|
|
55
|
+
return distribution.getProbabilityDistribution();
|
|
56
|
+
}
|
|
57
|
+
saveTxt(fileName) {
|
|
67
58
|
}
|
|
68
|
-
|
|
69
|
-
|
|
59
|
+
}
|
|
60
|
+
exports.TreeEnsembleModel = TreeEnsembleModel;
|
|
70
61
|
//# sourceMappingURL=TreeEnsembleModel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeEnsembleModel.js","sourceRoot":"","sources":["../../../source/Model/Ensemble/TreeEnsembleModel.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"TreeEnsembleModel.js","sourceRoot":"","sources":["../../../source/Model/Ensemble/TreeEnsembleModel.ts"],"names":[],"mappings":";;;AAAA,oCAA+B;AAE/B,+DAA0D;AAC1D,oFAA+E;AAC/E,oEAA+D;AAC/D,+DAA0D;AAE1D,MAAsB,iBAAkB,SAAQ,aAAK;IAEvC,MAAM,CAAqB;IAErC;;;;OAIG;IACH,YAAY,CAAC,MAA2B;QACpC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACxB,CAAC;IAED;;;OAGG;IACH,YAAY,CAAC,QAAgB;QACzB,IAAI,KAAK,GAAG,IAAI,2BAAY,CAAC,QAAQ,CAAC,CAAA;QACtC,IAAI,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAA;QAC9C,IAAI,CAAC,MAAM,GAAG,IAAI,KAAK,EAAgB,CAAA;QACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAC,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,2BAAY,CAAC,IAAI,2BAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAC/D,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,OAAO,CAAC,QAAkB;QACtB,IAAI,YAAY,GAAG,IAAI,2CAAoB,EAAE,CAAC;QAC9C,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC3B,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,YAAY,CAAC,UAAU,EAAE,CAAC;IACrC,CAAC;IAED;;;;OAIG;IACH,kBAAkB,CAAC,QAAkB;QACjC,IAAI,YAAY,GAAG,IAAI,2CAAoB,EAAE,CAAC;QAC9C,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC3B,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,YAAY,CAAC,0BAA0B,EAAE,CAAC;IACrD,CAAC;IAED,OAAO,CAAC,QAAgB;IACxB,CAAC;CAEJ;AAzDD,8CAyDC"}
|
package/dist/Model/Model.js
CHANGED
|
@@ -1,153 +1,143 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
* Given an array of class labels, returns the maximum occurred one.
|
|
25
|
-
*
|
|
26
|
-
* @param classLabels An array of class labels.
|
|
27
|
-
* @return The class label that occurs most in the array of class labels (mod of class label list).
|
|
28
|
-
*/
|
|
29
|
-
static getMaximum(classLabels) {
|
|
30
|
-
let frequencies = new CounterHashMap_1.CounterHashMap();
|
|
31
|
-
for (let label of classLabels) {
|
|
32
|
-
frequencies.put(label);
|
|
33
|
-
}
|
|
34
|
-
return frequencies.max();
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Model = void 0;
|
|
4
|
+
const Instance_1 = require("../Instance/Instance");
|
|
5
|
+
const CounterHashMap_1 = require("nlptoolkit-datastructure/dist/CounterHashMap");
|
|
6
|
+
const InstanceList_1 = require("../InstanceList/InstanceList");
|
|
7
|
+
const Matrix_1 = require("nlptoolkit-math/dist/Matrix");
|
|
8
|
+
const DiscreteDistribution_1 = require("nlptoolkit-math/dist/DiscreteDistribution");
|
|
9
|
+
const DiscreteAttribute_1 = require("../Attribute/DiscreteAttribute");
|
|
10
|
+
const DiscreteIndexedAttribute_1 = require("../Attribute/DiscreteIndexedAttribute");
|
|
11
|
+
const ConfusionMatrix_1 = require("../Performance/ConfusionMatrix");
|
|
12
|
+
const DetailedClassificationPerformance_1 = require("../Performance/DetailedClassificationPerformance");
|
|
13
|
+
class Model {
|
|
14
|
+
/**
|
|
15
|
+
* Given an array of class labels, returns the maximum occurred one.
|
|
16
|
+
*
|
|
17
|
+
* @param classLabels An array of class labels.
|
|
18
|
+
* @return The class label that occurs most in the array of class labels (mod of class label list).
|
|
19
|
+
*/
|
|
20
|
+
static getMaximum(classLabels) {
|
|
21
|
+
let frequencies = new CounterHashMap_1.CounterHashMap();
|
|
22
|
+
for (let label of classLabels) {
|
|
23
|
+
frequencies.put(label);
|
|
35
24
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
return instance;
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Loads a discrete distribution from an input model file
|
|
60
|
-
* @param input Input model file.
|
|
61
|
-
* @return Discrete distribution read from an input model file.
|
|
62
|
-
*/
|
|
63
|
-
static loadDiscreteDistribution(input) {
|
|
64
|
-
let distribution = new DiscreteDistribution_1.DiscreteDistribution();
|
|
65
|
-
let size = parseInt(input.readLine());
|
|
66
|
-
for (let i = 0; i < size; i++) {
|
|
67
|
-
let line = input.readLine();
|
|
68
|
-
let items = line.split(" ");
|
|
69
|
-
let count = parseInt(items[1]);
|
|
70
|
-
for (let j = 0; j < count; j++) {
|
|
71
|
-
distribution.addItem(items[0]);
|
|
72
|
-
}
|
|
25
|
+
return frequencies.max();
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Loads a single instance from a single line.
|
|
29
|
+
* @param line Line containing the instance.
|
|
30
|
+
* @param attributeTypes Type of the attributes of the instance. If th attribute is discrete, it is "DISCRETE",
|
|
31
|
+
* otherwise it is "CONTINUOUS".
|
|
32
|
+
* @return Instance read from the line.
|
|
33
|
+
*/
|
|
34
|
+
loadInstance(line, attributeTypes) {
|
|
35
|
+
let items = line.split(",");
|
|
36
|
+
let instance = new Instance_1.Instance(items[items.length - 1]);
|
|
37
|
+
for (let i = 0; i < items.length - 1; i++) {
|
|
38
|
+
switch (attributeTypes[i]) {
|
|
39
|
+
case "DISCRETE":
|
|
40
|
+
instance.addAttribute(items[i]);
|
|
41
|
+
break;
|
|
42
|
+
case "CONTINUOUS":
|
|
43
|
+
instance.addAttribute(parseFloat(items[i]));
|
|
44
|
+
break;
|
|
73
45
|
}
|
|
74
|
-
return distribution;
|
|
75
46
|
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
47
|
+
return instance;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Loads a discrete distribution from an input model file
|
|
51
|
+
* @param input Input model file.
|
|
52
|
+
* @return Discrete distribution read from an input model file.
|
|
53
|
+
*/
|
|
54
|
+
static loadDiscreteDistribution(input) {
|
|
55
|
+
let distribution = new DiscreteDistribution_1.DiscreteDistribution();
|
|
56
|
+
let size = parseInt(input.readLine());
|
|
57
|
+
for (let i = 0; i < size; i++) {
|
|
58
|
+
let line = input.readLine();
|
|
59
|
+
let items = line.split(" ");
|
|
60
|
+
let count = parseInt(items[1]);
|
|
61
|
+
for (let j = 0; j < count; j++) {
|
|
62
|
+
distribution.addItem(items[0]);
|
|
87
63
|
}
|
|
88
|
-
return instanceList;
|
|
89
64
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
return matrix;
|
|
65
|
+
return distribution;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Loads an instance list from an input model file.
|
|
69
|
+
* @param input Input model file.
|
|
70
|
+
* @return Instance list read from an input model file.
|
|
71
|
+
*/
|
|
72
|
+
loadInstanceList(input) {
|
|
73
|
+
let types = input.readLine().split(" ");
|
|
74
|
+
let instanceCount = parseInt(input.readLine());
|
|
75
|
+
let instanceList = new InstanceList_1.InstanceList();
|
|
76
|
+
for (let i = 0; i < instanceCount; i++) {
|
|
77
|
+
instanceList.add(this.loadInstance(input.readLine(), types));
|
|
106
78
|
}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
79
|
+
return instanceList;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Loads a matrix from an input model file.
|
|
83
|
+
* @param input Input model file.
|
|
84
|
+
* @return Matrix read from the input model file.
|
|
85
|
+
*/
|
|
86
|
+
loadMatrix(input) {
|
|
87
|
+
let items = input.readLine().split(" ");
|
|
88
|
+
let matrix = new Matrix_1.Matrix(parseInt(items[0]), parseInt(items[1]));
|
|
89
|
+
for (let j = 0; j < matrix.getRow(); j++) {
|
|
90
|
+
let line = input.readLine();
|
|
91
|
+
items = line.split(" ");
|
|
92
|
+
for (let k = 0; k < matrix.getColumn(); k++) {
|
|
93
|
+
matrix.setValue(j, k, parseFloat(items[k]));
|
|
119
94
|
}
|
|
120
|
-
return true;
|
|
121
95
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
96
|
+
return matrix;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Checks given instance's attribute and returns true if it is a discrete indexed attribute, false otherwise.
|
|
100
|
+
*
|
|
101
|
+
* @param instance Instance to check.
|
|
102
|
+
* @return True if instance is a discrete indexed attribute, false otherwise.
|
|
103
|
+
*/
|
|
104
|
+
discreteCheck(instance) {
|
|
105
|
+
for (let i = 0; i < instance.attributeSize(); i++) {
|
|
106
|
+
if (instance.getAttribute(i) instanceof DiscreteAttribute_1.DiscreteAttribute &&
|
|
107
|
+
!(instance.getAttribute(i) instanceof DiscreteIndexedAttribute_1.DiscreteIndexedAttribute)) {
|
|
108
|
+
return false;
|
|
134
109
|
}
|
|
135
|
-
return new DetailedClassificationPerformance_1.DetailedClassificationPerformance(confusion);
|
|
136
110
|
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* TestClassification an instance list with the current model.
|
|
115
|
+
*
|
|
116
|
+
* @param testSet Test data (list of instances) to be tested.
|
|
117
|
+
* @return The accuracy (and error) of the model as an instance of Performance class.
|
|
118
|
+
*/
|
|
119
|
+
test(testSet) {
|
|
120
|
+
let classLabels = testSet.getUnionOfPossibleClassLabels();
|
|
121
|
+
let confusion = new ConfusionMatrix_1.ConfusionMatrix(classLabels);
|
|
122
|
+
for (let i = 0; i < testSet.size(); i++) {
|
|
123
|
+
let instance = testSet.get(i);
|
|
124
|
+
confusion.classify(instance.getClassLabel(), this.predict(instance));
|
|
149
125
|
}
|
|
126
|
+
return new DetailedClassificationPerformance_1.DetailedClassificationPerformance(confusion);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Runs current classifier with the given train and test data.
|
|
130
|
+
*
|
|
131
|
+
* @param parameter Parameter of the classifier to be trained.
|
|
132
|
+
* @param trainSet Training data to be used in training the classifier.
|
|
133
|
+
* @param testSet Test data to be tested after training the model.
|
|
134
|
+
* @return The accuracy (and error) of the trained model as an instance of Performance class.
|
|
135
|
+
* @throws DiscreteFeaturesNotAllowed Exception for discrete features.
|
|
136
|
+
*/
|
|
137
|
+
singleRun(parameter, trainSet, testSet) {
|
|
138
|
+
this.train(trainSet, parameter);
|
|
139
|
+
return this.test(testSet);
|
|
150
140
|
}
|
|
151
|
-
|
|
152
|
-
|
|
141
|
+
}
|
|
142
|
+
exports.Model = Model;
|
|
153
143
|
//# sourceMappingURL=Model.js.map
|
package/dist/Model/Model.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Model.js","sourceRoot":"","sources":["../../source/Model/Model.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Model.js","sourceRoot":"","sources":["../../source/Model/Model.ts"],"names":[],"mappings":"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"}
|