/// <summary> /// Plate by plate classification /// </summary> /// <param name="NeutralClass">Neutral class</param> /// <param name="IdxClassifier">Classifier Index (0:J48), (1:SVM), (2:NN), (3:KNN)</param> private void ClassificationPlateByPlate(int NeutralClass, int IdxClassifier) { int NumberOfPlates = cGlobalInfo.CurrentScreening.ListPlatesActive.Count; for (int PlateIdx = 0; PlateIdx < NumberOfPlates; PlateIdx++) { cPlate CurrentPlateToProcess = cGlobalInfo.CurrentScreening.ListPlatesActive.GetPlate(cGlobalInfo.CurrentScreening.ListPlatesActive[PlateIdx].GetName()); cInfoClass InfoClass = CurrentPlateToProcess.GetNumberOfClassesBut(NeutralClass); // return; if (InfoClass.NumberOfClass <= 1) { richTextBoxInfoClassif.AppendText(CurrentPlateToProcess.GetName() + " not processed.\n"); continue; } weka.core.Instances insts = CurrentPlateToProcess.CreateInstancesWithClasses(InfoClass, NeutralClass); Classifier ClassificationModel = null; string Text = ""; switch (IdxClassifier) { case 0: // J48 ClassificationModel = new weka.classifiers.trees.J48(); weka.classifiers.trees.J48 J48Model = (weka.classifiers.trees.J48)ClassificationModel; J48Model.setMinNumObj((int)cGlobalInfo.OptionsWindow.numericUpDownJ48MinNumObjects.Value); Text = "J48 - "; break; case 1: // SVM ClassificationModel = new weka.classifiers.functions.SMO(); Text = "SVM - "; break; case 2: // NN ClassificationModel = new weka.classifiers.functions.MultilayerPerceptron(); Text = "Neural Network - "; break; case 3: // KNN ClassificationModel = new weka.classifiers.lazy.IBk((int)cGlobalInfo.OptionsWindow.numericUpDownKofKNN.Value); Text = "K-Nearest Neighbor(s) - "; break; case 4: // Random Forest ClassificationModel = new weka.classifiers.trees.RandomForest(); Text = "Random Forest - "; break; default: break; } richTextBoxInfoClassif.AppendText(Text + InfoClass.NumberOfClass + " classes - Plate: "); richTextBoxInfoClassif.AppendText(CurrentPlateToProcess.GetName() + " OK \n"); weka.core.Instances train = new weka.core.Instances(insts, 0, insts.numInstances()); ClassificationModel.buildClassifier(train); cGlobalInfo.ConsoleWriteLine(ClassificationModel.ToString()); weka.classifiers.Evaluation evaluation = new weka.classifiers.Evaluation(insts); evaluation.crossValidateModel(ClassificationModel, insts, 2, new java.util.Random(1)); cGlobalInfo.ConsoleWriteLine(evaluation.toSummaryString()); cGlobalInfo.ConsoleWriteLine(evaluation.toMatrixString()); // update classification information of the current plate switch (IdxClassifier) { case 0: // J48 weka.classifiers.trees.J48 CurrentClassifier = (weka.classifiers.trees.J48)(ClassificationModel); CurrentPlateToProcess.GetInfoClassif().StringForTree = CurrentClassifier.graph().Remove(0, CurrentClassifier.graph().IndexOf("{") + 2); break; /*case 1: // SVM break; case 2: // NN break; case 3: // KNN break;*/ default: break; } CurrentPlateToProcess.GetInfoClassif().StringForQuality = evaluation.toSummaryString(); CurrentPlateToProcess.GetInfoClassif().ConfusionMatrix = evaluation.toMatrixString(); foreach (cWell TmpWell in CurrentPlateToProcess.ListActiveWells) { weka.core.Instance currentInst = TmpWell.CreateInstanceForNClasses(InfoClass).instance(0); double predictedClass = ClassificationModel.classifyInstance(currentInst); TmpWell.SetClass(InfoClass.ListBackAssociation[(int)predictedClass]); } } return; }
/// <summary> /// Global classification /// </summary> /// <param name="NeutralClass">Neutral class</param> /// <param name="IdxClassifier">Classifier Index (0:J48), (1:SVM), (2:NN), (3:KNN)</param> private void ClassificationGlobal(int NeutralClass, int IdxClassifier) { cInfoClass InfoClass = cGlobalInfo.CurrentScreening.GetNumberOfClassesBut(NeutralClass); if (InfoClass.NumberOfClass <= 1) { richTextBoxInfoClassif.AppendText("Screening not processed.\n"); return; } cExtendedTable TrainingTable = cGlobalInfo.CurrentScreening.ListPlatesActive.GetListActiveWells().GetAverageDescriptorValues(cGlobalInfo.CurrentScreening.ListDescriptors.GetActiveDescriptors(), false, true); weka.core.Instances insts = cGlobalInfo.CurrentScreening.CreateInstancesWithClasses(InfoClass, NeutralClass); Classifier ClassificationModel = null; switch (IdxClassifier) { case 0: // J48 ClassificationModel = new weka.classifiers.trees.J48(); weka.classifiers.trees.J48 J48Model = (weka.classifiers.trees.J48)ClassificationModel; J48Model.setMinNumObj((int)cGlobalInfo.OptionsWindow.numericUpDownJ48MinNumObjects.Value); richTextBoxInfoClassif.AppendText("\nC4.5 : " + InfoClass.NumberOfClass + " classes"); break; case 1: // SVM ClassificationModel = new weka.classifiers.functions.SMO(); break; case 2: // NN ClassificationModel = new weka.classifiers.functions.MultilayerPerceptron(); break; case 3: // KNN ClassificationModel = new weka.classifiers.lazy.IBk((int)cGlobalInfo.OptionsWindow.numericUpDownKofKNN.Value); break; case 4: // Random Forest ClassificationModel = new weka.classifiers.trees.RandomForest(); break; default: break; } weka.core.Instances train = new weka.core.Instances(insts, 0, insts.numInstances()); ClassificationModel.buildClassifier(train); cGlobalInfo.ConsoleWriteLine(ClassificationModel.ToString()); weka.classifiers.Evaluation evaluation = new weka.classifiers.Evaluation(insts); evaluation.crossValidateModel(ClassificationModel, insts, 2, new java.util.Random(1)); cGlobalInfo.ConsoleWriteLine(evaluation.toSummaryString()); cGlobalInfo.ConsoleWriteLine(evaluation.toMatrixString()); // update classification information of the current plate string Text = ""; switch (IdxClassifier) { case 0: // J48 Text = "J48 - "; break; case 1: // SVM // ClassificationModel = new weka.classifiers.functions.SMO(); Text = "SVM - "; break; case 2: // NN // ClassificationModel = new weka.classifiers.functions.MultilayerPerceptron(); Text = "Neural Network - "; break; case 3: // KNN // ClassificationModel = new weka.classifiers.lazy.IBk((int)CompleteScreening.GlobalInfo.OptionsWindow.numericUpDownKofKNN.Value); Text = "K-Nearest Neighbor(s) - "; break; default: break; } richTextBoxInfoClassif.AppendText(Text + InfoClass.NumberOfClass + " classes."); // CurrentPlateToProcess.GetInfoClassif().StringForQuality = evaluation.toSummaryString(); // CurrentPlateToProcess.GetInfoClassif().ConfusionMatrix = evaluation.toMatrixString(); foreach (cPlate CurrentPlateToProcess in cGlobalInfo.CurrentScreening.ListPlatesActive) { foreach (cWell TmpWell in CurrentPlateToProcess.ListActiveWells) { // return; weka.core.Instance currentInst = TmpWell.CreateInstanceForNClasses(InfoClass).instance(0); double predictedClass = ClassificationModel.classifyInstance(currentInst); double[] ClassConfidence = ClassificationModel.distributionForInstance(currentInst); double ConfidenceValue = ClassConfidence[(int)predictedClass]; TmpWell.SetClass(InfoClass.ListBackAssociation[(int)predictedClass], ConfidenceValue); } } return; }