| 124 | |
| 125 | // can load into DB and get marginals with SQL like: select MODEL_CHOSEN_OUTCOME,RATING,COUNT(1) from scored1 group by MODEL_CHOSEN_OUTCOME,RATING |
| 126 | public static double score(final Model model, final Iterable<BurstMap> testSource, final File resultFile) throws FileNotFoundException, IOException, ClassNotFoundException { |
| 127 | final Log log = LogFactory.getLog(LogisticScore.class); |
| 128 | final DModel<ExampleRow> sigmoidLoss = new SigmoidLossMultinomial(model.config.dim(),model.config.noutcomes()); |
| 129 | final PrintStream p; |
| 130 | if(null!=resultFile) { |
| 131 | p = new PrintStream(new FileOutputStream(resultFile)); |
| 132 | } else { |
| 133 | p = null; |
| 134 | } |
| 135 | ArrayList<String> headerFlds = null; |
| 136 | long nToCompare = 0; |
| 137 | long nRight = 0; |
| 138 | long[][] confusionMatrix = new long[model.config.noutcomes()][model.config.noutcomes()]; |
| 139 | final Ticker ticker = new Ticker("LogisticScore"); |
| 140 | for(final BurstMap row: testSource) { |
| 141 | ticker.tick(); |
| 142 | if(null==headerFlds) { |
| 143 | headerFlds = new ArrayList<String>(row.keySet()); |
| 144 | if(null!=p) { |
| 145 | for(int i=0;i<model.config.noutcomes();++i) { |
| 146 | final String cat = model.config.outcome(i); |
| 147 | if(i>0) { |
| 148 | p.print("\t"); |
| 149 | } |
| 150 | p.print("model.predict" + "." + model.config.def().resultColumn + "." + cat); |
| 151 | } |
| 152 | p.print("\t" + "model.chosen.Outcome"); |
| 153 | p.print("\t" + "model.predict.Outcome"); |
| 154 | for(final String fldi: headerFlds) { |
| 155 | p.print("\t" + fldi); |
| 156 | } |
| 157 | p.println(); |
| 158 | } |
| 159 | } |
| 160 | int catInt = -1; |
| 161 | final String resStr = row.getAsString(model.config.def().resultColumn); |
| 162 | if(resStr!=null) { |
| 163 | final Integer category = model.config.category(resStr); |
| 164 | if(category!=null) { |
| 165 | catInt = category; |
| 166 | } |
| 167 | } |
| 168 | final SparseSemiVec vector = model.config.vector(row); |
| 169 | if(null!=vector) { |
| 170 | final ExampleRow ei = new SparseExampleRow(vector,model.config.weight(row),catInt); |
| 171 | final double[] pred = sigmoidLoss.predict(model.coefs,ei); |
| 172 | final int argMax = HelperFns.argmax(pred); |
| 173 | if(null!=p) { |
| 174 | for(int i=0;i<model.config.noutcomes();++i) { // non-empty list |
| 175 | if(i!=0) { |
| 176 | p.print("\t"); |
| 177 | } |
| 178 | p.print(pred[i]); |
| 179 | } |
| 180 | p.print("\t" + model.config.outcome(argMax)); |
| 181 | p.print("\t" + pred[argMax]); |
| 182 | for(final String hiK: headerFlds) { |
| 183 | String value = row.getAsString(hiK); |