* * @param {object} data * @param {object} trainOpts * @param {number} [k] * @returns { * { * avgs: { * error: number, * trainTime: number, * testTime: number, * iterations: number, * trainError: number * }, * stats: { *
(data, trainOpts = {}, k = 4)
| 79 | * } |
| 80 | */ |
| 81 | train(data, trainOpts = {}, k = 4) { |
| 82 | if (data.length <= k) { |
| 83 | throw new Error(`Training set size is too small for ${ data.length } k folds of ${ k }`); |
| 84 | } |
| 85 | let size = data.length / k; |
| 86 | |
| 87 | if (data.constructor === Array) { |
| 88 | this.shuffleArray(data); |
| 89 | } else { |
| 90 | let newData = {}; |
| 91 | this.shuffleArray(Object.keys(data)).forEach((key) => { |
| 92 | newData[key] = data[key]; |
| 93 | }); |
| 94 | data = newData; |
| 95 | } |
| 96 | |
| 97 | let avgs = { |
| 98 | error: 0, |
| 99 | trainTime: 0, |
| 100 | testTime: 0, |
| 101 | iterations: 0, |
| 102 | trainError: 0 |
| 103 | }; |
| 104 | |
| 105 | let stats = { |
| 106 | truePos: 0, |
| 107 | trueNeg: 0, |
| 108 | falsePos: 0, |
| 109 | falseNeg: 0, |
| 110 | total: 0 |
| 111 | }; |
| 112 | |
| 113 | let results = []; |
| 114 | let stat; |
| 115 | let sum; |
| 116 | |
| 117 | for (let i = 0; i < k; i++) { |
| 118 | let dclone = data.slice(0); |
| 119 | let testSet = dclone.splice(i * size, size); |
| 120 | let trainSet = dclone; |
| 121 | let result = this.testPartition(trainOpts, trainSet, testSet); |
| 122 | for (stat in avgs) { |
| 123 | if (stat in avgs) { |
| 124 | sum = avgs[stat]; |
| 125 | avgs[stat] = sum + result[stat]; |
| 126 | } |
| 127 | } |
| 128 | |
| 129 | for (stat in stats) { |
| 130 | if (stat in stats) { |
| 131 | sum = stats[stat]; |
| 132 | stats[stat] = sum + result[stat]; |
| 133 | } |
| 134 | } |
| 135 | |
| 136 | results.push(result); |
| 137 | } |
| 138 |
no test coverage detected