コード例 #1
0
        private static AbstractClassifier LoadClassifier(string ClassifierType)
        {
            AbstractClassifier cls = null;
            var  assm    = Assembly.LoadFrom("PtProject.Classifier.dll");
            Type clsType = assm.GetType(ClassifierType);

            cls = (AbstractClassifier)Activator.CreateInstance(clsType);
            return(cls);
        }
コード例 #2
0
        private void btnStart_Click(object sender, EventArgs e)
        {
            int SamplingFreq;
            int SubWindowLength;
            int SubWindowShift;
            int SuperWindowLength;
            int SuperWindowShift;

            if (!int.TryParse(txtSampFreq.Text, out SamplingFreq))
            {
                return;
            }
            if (!int.TryParse(txtSubWindowLength.Text, out SubWindowLength))
            {
                return;
            }
            if (!int.TryParse(txtSubWindowShift.Text, out SubWindowShift))
            {
                return;
            }
            if (!int.TryParse(txtFeatWindow.Text, out SuperWindowLength))
            {
                return;
            }
            if (!int.TryParse(txtFeatShift.Text, out SuperWindowShift))
            {
                return;
            }


            Classifier = (AbstractClassifier)cbxClassifier.SelectedItem;
            Classifier.ClassificationComplete += new EmoClassifier.AbstractClassifier.ClassifComplete(Classifier_ClassificationComplete);

            Classifier.SubWindowLength   = SubWindowLength;
            Classifier.SubWindowShift    = SubWindowShift;
            Classifier.SuperWindowLength = SuperWindowLength;
            Classifier.SuperWindowShift  = SuperWindowShift;
            Classifier.SamplingFrequency = SamplingFreq;


            waveInStream                = new WaveIn();
            waveInStream.WaveFormat     = new WaveFormat(SamplingFreq, 8, 1);
            waveInStream.DataAvailable += new EventHandler <WaveInEventArgs>(waveInStream_DataAvailable);

            waveInStream.StartRecording();
            btnStart.Enabled = false;
            btnStop.Enabled  = true;
        }
コード例 #3
0
        public static void Main(string[] args)
        {
            string dataPath       = ConfigReader.Read("DataPath");
            string confPath       = ConfigReader.Read("ConfPath");
            int    bucketSize     = int.Parse(ConfigReader.Read("BucketSize"));
            string classifierType = ConfigReader.Read("ClassifierType");
            string idName         = ConfigReader.Read("IdName");
            string targetName     = ConfigReader.Read("TargetName");

            Logger.Log("DataPath = " + dataPath);
            Logger.Log("ConfPath = " + confPath);
            Logger.Log("BucketSize = " + bucketSize);
            Logger.Log("ClassifierType = " + classifierType);
            Logger.Log("IdName = " + idName);
            Logger.Log("TargetName = " + targetName);

            try
            {
                // loading modifier
                DataModifier modifier = null;
                if (confPath != null)
                {
                    modifier = new DataModifier(File.ReadAllLines(confPath));
                }

                // loading classifier
                AbstractClassifier cls = LoadClassifier(classifierType);

                if (bucketSize > 0)
                {
                    // by tree bucket mode
                    Logger.Log("by tree bucket mode, BucketSize = " + bucketSize);
                    ByBucketMode(dataPath, idName, targetName, bucketSize, modifier, cls);
                }
                else
                {
                    // by client mode
                    Logger.Log("by client mode");
                    ByClientMode(dataPath, idName, targetName, modifier, cls);
                }
            }
            catch (Exception e)
            {
                Logger.Log(e);
            }
        }
コード例 #4
0
ファイル: Program.cs プロジェクト: w1r2p1/PtProject
        static void Main(string[] args)
        {
            string classifierType = ConfigReader.Read("classifierType");

            Logger.Log("classifierType:" + classifierType);

            try
            {
                AbstractClassifier cls = LoadClassifier(classifierType);

                cls.PrintParams();
                cls.LoadData();
                var result = cls.Build();

                Logger.Log("AUC = " + result.LastResult.AUC);
                Logger.Log("LogLoss = " + result.LastResult.LogLoss);
            }
            catch (Exception e)
            {
                Logger.Log(e);
            }
        }
コード例 #5
0
        static void GetClassifiersFromPaths(List <string> ModelPaths,
                                            out List <AbstractClassifier> Models)
        {
            Models = new List <AbstractClassifier>();

            foreach (string path in ModelPaths)
            {
                AbstractClassifier classifier = ModelBuilder.CreateModel(File.ReadAllText(path));
                if (classifier != null)
                {
                    classifier.Name = path.Split('\\').Last().Split('.').First();
                    Models.Add(classifier);
                }
                else
                {
                    Console.ForegroundColor = ConsoleColor.Black;
                    Console.BackgroundColor = ConsoleColor.Yellow;
                    Console.WriteLine("Invalid model file found: \"" + path + "\"");
                    Console.WriteLine("Skipping model creation.");
                    Console.ResetColor();
                }
            }
        }
コード例 #6
0
        private static void ByClientMode(string dataPath, string ids, string target, DataModifier modifier, AbstractClassifier cls)
        {
            try
            {
                cls.LoadClassifier();

                // loading data
                var loader = target == null ? new DataLoader() : new DataLoader(target);
                loader.AddIdsString(ids);
                loader.Load(dataPath);

                using (var sw = new StreamWriter(new FileStream(dataPath + "_calc.csv", FileMode.Create, FileAccess.Write)))
                {
                    if (target != null)
                    {
                        sw.WriteLine(loader.IdName + ";prob;target");
                    }
                    else
                    {
                        sw.WriteLine(loader.IdName + ";prob");
                    }

                    int idx = 0;
                    // calculating prob for each row
                    foreach (var row in loader.Rows)
                    {
                        idx++;
                        double[] mvals = GetRowValues(modifier, loader, row);
                        var      prob  = cls.PredictProba(mvals);

                        string targStr = target != null ? (";" + row.Target) : null;
                        string oinfo   = prob.ObjectInfo != null ? (";" + prob.ObjectInfo) : null;
                        sw.WriteLine(row.Id + ";" + prob.Probs[1] + targStr + oinfo);

                        if (idx % 123 == 0)
                        {
                            Logger.Log(idx + " lines writed;");
                            sw.Flush();
                        }
                    }

                    Logger.Log(idx + " lines writed; done;");

                    sw.Close();
                }
            }
            catch (Exception e)
            {
                Logger.Log(e);
            }
        }
コード例 #7
0
        private static void ByBucketMode(string dataPath, string ids, string target, int bucketsize, DataModifier modifier, AbstractClassifier acls)
        {
            try
            {
                // classifier
                var cls = acls as DecisionForest;
                if (cls == null)
                {
                    Logger.Log("classifier is not DecisionForest");
                    return;
                }

                // loading data
                var loader = target == null ? new DataLoader() : new DataLoader(target);
                loader.AddIdsString(ids);
                loader.Load(dataPath);

                int cnt        = 0;
                int idx        = 0;
                int totaltrees = 0;
                var probDict   = new Dictionary <string, double>();
                do
                {
                    Logger.Log("Processing bucket #" + idx);

                    cls.Clear();
                    cnt = cls.LoadClassifier();
                    if (cnt > 0)
                    {
                        totaltrees += cls.CountAllTrees;

                        // calculating prob for each row
                        foreach (var row in loader.Rows)
                        {
                            var mvals = GetRowValues(modifier, loader, row);
                            var prob  = cls.PredictCounts(mvals);

                            if (!probDict.ContainsKey(row.Id))
                            {
                                probDict.Add(row.Id, 0);
                            }
                            probDict[row.Id] += prob[1];
                        }

                        idx++;
                    }
                }while (cnt >= bucketsize);

                using (var sw = new StreamWriter(new FileStream(dataPath + "_calc.csv", FileMode.Create, FileAccess.Write)))
                {
                    if (target != null)
                    {
                        sw.WriteLine(loader.IdName + ";prob;target");
                    }
                    else
                    {
                        sw.WriteLine(loader.IdName + ";prob");
                    }

                    foreach (var row in loader.Rows)
                    {
                        double prob    = probDict[row.Id] / totaltrees;
                        string targStr = target != null ? (";" + row.Target) : null;
                        sw.WriteLine(row.Id + ";" + prob + targStr);
                    }

                    sw.Close();
                }
            }
            catch (Exception e)
            {
                Logger.Log(e);
            }
        }
コード例 #8
0
        public static void GenerarModelo()
        {
            // Fuente de datos
            DataSource source = new DataSource(DirectorioDatosPrueba());

            // convertimos a instancias
            Instances data = source.getDataSet();

            // generamos una copia
            Instances dataCopy = new Instances(data);

            // hay qeu decirle cual es el atributo de clase
            if (data.classIndex() == -1)
            {
                data.setClassIndex(data.numAttributes() - 1);
            }


            #region Discretizacion

            //// DISCRETIZACION
            //bool bHasNonNominal = true;
            //bool bHasMissingValues = true;

            //weka.filters.unsupervised.attribute.Discretize unSupervised = new weka.filters.unsupervised.attribute.Discretize();
            //weka.filters.supervised.attribute.Discretize supervised = new weka.filters.supervised.attribute.Discretize();

            ////Instances dataCopy = new Instances(data);

            //// Quitamos las missing classes de las instancias
            ////data.deleteWithMissingClass();

            ////
            ////data = NormalizeDataset(data);

            //// si no hay missing values
            //if (bHasNonNominal)
            //{

            //    // Para los que son nominales y no son missing values
            //    weka.filters.supervised.attribute.Discretize supervised2 = new weka.filters.supervised.attribute.Discretize();
            //    bool k = supervised2.getUseKononenko();
            //    supervised2.setUseKononenko(true);
            //    k = supervised2.getUseKononenko();
            //    k= supervised2.setInputFormat(data);
            //    data = weka.filters.Filter.useFilter(data, supervised2);
            //}

            //// si hay missing valyes
            //if (bHasMissingValues)
            //{
            //    //System.err.println("Warning: filling in missing values in data set");
            //    weka.filters.unsupervised.attribute.ReplaceMissingValues m_MissingValuesFilter = new weka.filters.unsupervised.attribute.ReplaceMissingValues();
            //    m_MissingValuesFilter.setInputFormat(data);
            //    data = weka.filters.Filter.useFilter(data, m_MissingValuesFilter);
            //}

            //// EQUAL FREQUENCIES

            //// creamos el objeto para discretizar
            //weka.filters.unsupervised.attribute.Discretize discretizer = new weka.filters.unsupervised.attribute.Discretize();

            //// Le decimos que use el metodo equal frequecies
            //discretizer.setUseEqualFrequency(true);

            //// ponemos el numero de bins que nos salga de las narices
            //discretizer.setBins(3);

            //// Este metodo es de la clase PotentialClassIgnorer
            //discretizer.setIgnoreClass(true);//Set the IgnoreClass value. Set this to true if the class index is to be unset before the filter is applied.

            //// Sets the format of the input instances.
            //bool val = discretizer.setInputFormat(data);

            //// Aplicamos la discretizacion
            //data = Filter.useFilter(data, discretizer);

            //// FIND NUM BINS

            //// creamos el discretizador
            //weka.filters.unsupervised.attribute.Discretize discretizer2 = new weka.filters.unsupervised.attribute.Discretize();

            //// le decimos que use este metodo
            //discretizer2.setFindNumBins(true);

            //// esto es opcional
            //discretizer2.setIgnoreClass(true);

            ////
            //discretizer2.setInputFormat(data);

            ////
            //data = Filter.useFilter(data, discretizer2);

            #endregion

            #region Modelos

            #region Cadenas de texto
            // hay qeu decirle cual es el atributo de clase
            if (data.classIndex() == -1)
            {
                data.setClassIndex(data.numAttributes() - 1);
            }

            string k2                     = "weka.classifiers.bayes.BayesNet -D -Q weka.classifiers.bayes.net.search.local.K2 -- -P 1 -S BAYES -E weka.classifiers.bayes.net.estimate.SimpleEstimator -- -A 0.5";
            string HillClimber            = "weka.classifiers.bayes.BayesNet -D -Q weka.classifiers.bayes.net.search.local.HillClimber -- -P 1 -S BAYES -E weka.classifiers.bayes.net.estimate.SimpleEstimator -- -A 0.5";
            string TAN                    = "weka.classifiers.bayes.BayesNet -D -Q weka.classifiers.bayes.net.search.local.TAN -- -S BAYES -E weka.classifiers.bayes.net.estimate.SimpleEstimator -- -A 0.5";
            string bayesNetworkNaiveBayes = "weka.classifiers.bayes.NaiveBayes";

            string j48 = "weka.classifiers.trees.J48 -C 0.25 -M 2";
            string rF  = "weka.classifiers.trees.RandomForest -P 100 -I 100 -num-slots 1 -K 0 -M 1.0 -V 0.001 -S 1";

            string knn = "weka.classifiers.lazy.IBk -K " + 1.ToString() + " -W 0 -A \"weka.core.neighboursearch.LinearNNSearch -A \\\"weka.core.EuclideanDistance -R first-last\\\"\"";

            string ann = "weka.classifiers.functions.MultilayerPerceptron -L 0.3 -M 0.2 -N 500 -V 0 -S 0 -E 20 -H a";

            string polykernel = "weka.classifiers.functions.SMO -C 1.0 -L 0.001 -P 1.0E-12 -N 0 -V -1 -W 1 -K \"weka.classifiers.functions.supportVector.PolyKernel -E 1.0 -C 250007\" -calibrator \"weka.classifiers.functions.Logistic -R 1.0E-8 -M -1 -num-decimal-places 4\"";
            string rbfkernell = "weka.classifiers.functions.SMO -C 1.0 -L 0.001 -P 1.0E-12 -N 0 -V -1 -W 1 -K \"weka.classifiers.functions.supportVector.RBFKernel -G 0.01 -C 250007\" -calibrator \"weka.classifiers.functions.Logistic -R 1.0E-8 -M -1 -num-decimal-places 4\"";
            string normalized = "weka.classifiers.functions.SMO -C 1.0 -L 0.001 -P 1.0E-12 -N 0 -V -1 -W 1 -K \"weka.classifiers.functions.supportVector.NormalizedPolyKernel -E 2.0 -C 250007\" -calibrator \"weka.classifiers.functions.Logistic -R 1.0E-8 -M -1 -num-decimal-places 4\"";
            string puk        = "weka.classifiers.functions.SMO -C 1.0 -L 0.001 -P 1.0E-12 -N 0 -V -1 -W 1 -K \"weka.classifiers.functions.supportVector.Puk -O 1.0 -S 1.0 -C 250007\" -calibrator \"weka.classifiers.functions.Logistic -R 1.0E-8 -M -1 -num-decimal-places 4\"";

            #endregion

            #region Clasificador

            // Separamos la cadena de texto del clasificador en un array
            string[] options   = Utils.splitOptions("weka.classifiers.functions.SMO -C 1.0 -L 0.001 -P 1.0E-12 -N 0 -V -1 -W 1 -K \"weka.classifiers.functions.supportVector.PolyKernel -E 1.0 -C 250007\" -calibrator \"weka.classifiers.functions.Logistic -R 1.0E-8 -M -1 -num-decimal-places 4\"");
            string   className = options[0];
            options[0] = string.Empty;

            // Creamos el clasificador
            weka.classifiers.Classifier scheme = (Classifier)Utils.forName(java.lang.Class.forName("weka.classifiers.Classifier"), className, options);

            #endregion

            #region Evaluar

            #region Percentage split

            // porcentaje que queremos para predecir
            int trainingPercent = 80;

            // sacamos el numero de isntancias que se corresponden a ese procentaje
            int trainSize = (int)Math.Round(data.numInstances() * ((double)trainingPercent / (double)100));

            // sacamos el porentajhe que queremos para probar
            int testSize = data.numInstances() - trainSize;

            // aleatoreizamos el dataset para asegurarnos que las instancias no estan ordenadas
            data.randomize(new java.util.Random(DateTime.Now.Ticks));

            // Separamos las instancias en 2 grupos (entrenar con unas y predecri con otras)
            Instances train = new Instances(data, 0, trainSize);
            Instances test  = new Instances(data, trainSize, testSize);

            // Generamos el clasificador con el training y lo evaluamos con el test
            Classifier clsCopyTest = AbstractClassifier.makeCopy(scheme);
            clsCopyTest.buildClassifier(train);
            Evaluation evalTest = new Evaluation(data);
            evalTest.evaluateModel(clsCopyTest, test);

            Console.WriteLine();
            Console.WriteLine("Correct % = " + evalTest.pctCorrect());
            Console.WriteLine("Incorrect % = " + evalTest.pctIncorrect());
            Console.WriteLine("AUC = " + evalTest.areaUnderROC(1));
            Console.WriteLine("kappa = " + evalTest.kappa());
            Console.WriteLine("MAE = " + evalTest.meanAbsoluteError());
            Console.WriteLine("RMSE = " + evalTest.rootMeanSquaredError());
            Console.WriteLine("RAE = " + evalTest.relativeAbsoluteError());
            Console.WriteLine("RRSE = " + evalTest.rootRelativeSquaredError());
            Console.WriteLine("Precision = " + evalTest.precision(1));
            Console.WriteLine("Recall = " + evalTest.recall(1));
            Console.WriteLine("fMeasure = " + evalTest.fMeasure(1));
            Console.WriteLine("Error Rate = " + evalTest.errorRate());
            double[][] conf = evalTest.confusionMatrix();
            #endregion

            #region Cross Validation

            long seed  = DateTime.Now.Ticks;
            int  folds = 15;

            // randomizamos los datos en funcion de la semilla
            java.util.Random rand = new java.util.Random(seed);
            data.randomize(rand);

            // estratificamso el dataset
            if (data.classAttribute().isNominal())
            {
                data.stratify(folds);
            }

            // crear evaluador
            Evaluation eval3 = new Evaluation(data);

            // iteramos en funcion de los diferentes folds con los que querams hacer el CV para ver si mejora con mas folds
            for (int n = 0; n < folds; n++)
            {
                //dividimos aleatroiamente el numero de instancias en train y test en funcion de la validacion
                Instances train2 = data.trainCV(folds, n);
                Instances test2  = data.testCV(folds, n);

                // creamos y evaluamos el clasificador
                Classifier clsCopy = AbstractClassifier.makeCopy(scheme);
                clsCopy.buildClassifier(train);
                eval3.evaluateModel(clsCopy, test);
            }

            // output evaluation
            Console.WriteLine();
            //Console.WriteLine(eval3.toMatrixString("=== Confusion matrix for fold " + (n + 1) + "/" + folds + " ===\n"));
            Console.WriteLine("Correct % = " + eval3.pctCorrect());
            Console.WriteLine("Incorrect % = " + eval3.pctIncorrect());
            Console.WriteLine("AUC = " + eval3.areaUnderROC(1));
            Console.WriteLine("kappa = " + eval3.kappa());
            Console.WriteLine("MAE = " + eval3.meanAbsoluteError());
            Console.WriteLine("RMSE = " + eval3.rootMeanSquaredError());
            Console.WriteLine("RAE = " + eval3.relativeAbsoluteError());
            Console.WriteLine("RRSE = " + eval3.rootRelativeSquaredError());
            Console.WriteLine("Precision = " + eval3.precision(1));
            Console.WriteLine("Recall = " + eval3.recall(1));
            Console.WriteLine("fMeasure = " + eval3.fMeasure(1));
            Console.WriteLine("Error Rate = " + eval3.errorRate());

            // Matriz de confusion
            Console.WriteLine(eval3.toMatrixString("=== Overall Confusion Matrix ===\n"));

            #endregion

            #region Predecir

            #region Clasificar

            // Le decimos cual es la clase sobre la que tiene que predecir
            data.setClassIndex(data.numAttributes() - 1);

            // Cogemos el numero de clases de ese atributo
            int numClasses = data.numClasses();

            // Pintamos por consola cuales son las clases de un atributo
            for (int i = 0; i < numClasses; i++)
            {
                // Pintamos por consola
                String classValue = data.classAttribute().value(i);
                Console.WriteLine("Class Value " + i + " is " + classValue);
            }

            //creamos el clasificador
            scheme.buildClassifier(data);

            // TODO: aqui deberiamos cargar los nuevos datosque queremos que el modelo clasifique
            // nosotors lo hacemos con el Dtaset almacenado en la variable data2 que es el mismo que data


            // Le decimos que prediga sobre la ultima clase
            //data2.setClassIndex(data2.numAttributes() - 1);

            // Pintamos la cabecera
            Console.WriteLine("===================");
            Console.WriteLine("Actual Class, Predicted Class");

            // Clasificamos cada instancia del dataset data2
            for (int i = 0; i < data.numInstances(); i++)
            {
                // coge el numero de la clase a la que pertenece esa instancia para un atributo (en el caso de Beta 0-1-2-3)
                double actualClass = data.instance(i).classValue();

                //valor para esa clase en concreto (en el caso de B cogeria el intervalo correspondiente a la clase dentro de los 4 intervalos en los que puede estar)
                String actual = data.classAttribute().value((int)actualClass);

                // cogemos la instancia completa dle nuevo dataser
                Instance newInst = (Instance)data.instance(i).copy();
                newInst.setClassMissing();

                // TODO: hay que llamar a esto de forma recursiva, llamar  a un metodo desde el otro
                // claificamso la instancia
                double   predNB       = scheme.classifyInstance(newInst);
                double[] distribution = scheme.distributionForInstance(newInst);

                // cogemos la clase a la que se ha predicho que pretende la instancia
                String predString = data.classAttribute().value((int)predNB);

                Console.WriteLine(actual + ", " + predString);
            }

            #endregion

            #region Regresion

            ////set class index to the last attribute
            //data.setClassIndex(data.numAttributes() - 1);

            ////build model
            //SMOreg smo = new SMOreg();
            //smo.buildClassifier(data);

            ////output model
            //Console.WriteLine(smo);

            //// Cargar nuevos datos para predecir

            ////set class index to the last attribute
            //data2.setClassIndex(data2.numAttributes() - 1);

            ////loop through the new dataset and make predictions
            //Console.WriteLine("===================");
            //Console.WriteLine("Actual Class, SMO Predicted");

            //for (int i = 0; i < data2.numInstances(); i++)
            //{
            //    //get class double value for current instance
            //    double actualValue = data2.instance(i).classValue();

            //    //get Instance object of current instance
            //    Instance newInst = data2.instance(i);
            //    //call classifyInstance, which returns a double value for the class
            //    double predSMO = smo.classifyInstance(newInst);

            //    Console.WriteLine(actualValue + ", " + predSMO);
            //}

            #endregion

            #endregion

            #endregion


            // Lo construimos
            scheme.buildClassifier(data);

            // Pintar datos en consola
            //Console.WriteLine(eval.toSummaryString());
            //Console.WriteLine(System.Environment.NewLine);
            //Console.WriteLine(eval.toClassDetailsString());

            #endregion
        }