none
Codification de données avec Accord.Statistics.Filters.Codification

    Question

  • Bonjour à tous,

    J'ai un tableau double de type string qui contient des données que je récupère depuis un fichier csv. je voudrais codifier ces données pour les faire passer à mon algorithme d'apprentissage.

    voici les données que contient le fichier csv :

    ssid1 bssid1              rssi1             signal1
    GLF_LAPTOP 58:b6:33:a6:a1:b8 -58 69
    GLF_ENROLLMENT 58:b6:33:e6:a1:b8 -57 70
    GLF_ENROLLMENT d8:38:fc:ff:27:d8 -49 80
    GLF_ENROLLMENT 30:87:d9:ed:f3:88 -31 95
    GLF_ENROLLMENT 74:3e:2b:f6:35:c8 -46 83
    GLF_ENROLLMENT 0c:f4:d5:cd:d5:e8 -48 81
    GLF_ENROLLMENT 30:87:d9:ed:f3:88 -36 92

    Je veux que le codificateur puisse codifier chaque colonne de chaque élément du tableau avec un type précis tel que les deux premières colonnes c'est des string et les deux dernières c'est des doubles.

    Le problème que je rencontre c'est que comment puisse-je appliquer une codification pour chaque colonne du tableau, j'ai essayé avec le code suivant

    string[][] data_input_app = input.GetColumns(0, 1, 2, 3);
    
     string[] inputNames = new[] { "ssid1", "bssid1", "rssi1", "signal1"};
    
     codebookin = new Codification(inputNames, data_input_app)
                {
    
                    CodificationVariable.Ordinal,
                    CodificationVariable.Ordinal,
                    CodificationVariable.Continuous,
                    CodificationVariable.Continuous,
               };

    mais avec ça il applique la première codification pour la première lignes (du coup le premier tableau car il s'agit d'un tableau de double ), la deuxième codification pour la deuxième ligne etc ...or ce que je cherche c'est plutôt appliquer une codification pour chaque colonne du tableau de la ligne "i" et faire de même pour toutes les lignes 

    vendredi 1 juin 2018 09:44

Réponses

  • Bonjour,

    Après une petite recherche je suppose qu'il s'agit de ça ?

    http://accord-framework.net/docs/html/T_Accord_Statistics_Filters_Codification.htm

    Comme je viens juste de voir ça je n'ai pas eu l'occasion d'éplucher les exemples qu'ils donnent, alors je l'ai fait "à l'ancienne".

    J'ai déclaré une classe

    	class DonneeImport
    	{
    		public string ssid { get; set; }
    		public string bssid { get; set; }
    		public float rssi { get; set; }
    		public float signal { get; set; }
    	}
    

    puis j'ai lancé le traitement comme ceci :

    System.IO.StreamReader file = new StreamReader(Filepath);
    DonneeImport di = new DonneeImport();
    string line = null;
    while((line = file.ReadLine())!= null)
    {
    	MessageBox.Show(line);
    	char[] sep = { ';' };
    	string[] sp = line.Split(sep);
    	di.ssid = sp[0];
    	di.bssid = sp[1];
    	di.rssi = float.Parse(sp[2]);
    	di.signal = float.Parse(sp[3]);
    }
    MessageBox.Show("Fin de traitement");
    

    Avec un point d'arrêt sur la dernière accolade j'ai pu m'assurer que les champs de di correspondaient bien aux valeurs figurant sur la ligne.

    Pour ça, bien entendu, en préparation du traitement, après avoir récupéré les valeurs dans un fichier, j'ai remplacé les tabulations par des points-virgules, et supprimé les espaces.

    Après je suppose que l'apport de la plateforme proposée est d'améliorer la productivité du développement, mais avant de me lancer là-dedans je voudrais m'assurer que nous parlons de la même chose.

    lundi 4 juin 2018 09:59
  • Bonjour, 

    Je vous remercie pour cette réponse.

    Au fait, en travaillant avec le machine learning je dois lui passer en paramètre un input de type double[][] ou int[][] et c'est la cause pour laquelle  je n'ai pas travaillé avec des classes d'objets.

    Comme la semaine passée je devais résoudre le problème au plus vite j'ai carrément récupéré mes données depuis la fichier csv dans un DataTable ce qui facilite de déterminer chaque colonne.

    le code que j'ai utilisé et le suivant: 

    public void LearningAlgorithme(DataTable dt)
            {
                codebookin = new Codification()
                {
                    { "ssid1", CodificationVariable.Ordinal},
                    { "bssid1", CodificationVariable.Ordinal},
                    { "rssi1", CodificationVariable.Continious},
                    { "signal1", CodificationVariable.Continious},
    
                    
                };
    
                codebookin.Learn(dt);
    
    
    
     int[][] inputs = codebookin.Apply(dt, "ssid1", "bssid1", "signal1",
                     "ssid2", "bssid2","signal2",
                     "ssid3", "bssid3", "signal3",
                     "ssid4", "bssid4", "signal4").ToJagged().To<int[][]>();
    
                int[] outputs = codebookin.Apply(dt, "position").ToVector().To<int[]>();
    
                var learner = new RandomForestLearning();
    
    
                var randomForest = learner.Learn(inputs, outputs);
    
    
              
             }

    lundi 4 juin 2018 12:39

Toutes les réponses

  • Bonjour,

    Après une petite recherche je suppose qu'il s'agit de ça ?

    http://accord-framework.net/docs/html/T_Accord_Statistics_Filters_Codification.htm

    Comme je viens juste de voir ça je n'ai pas eu l'occasion d'éplucher les exemples qu'ils donnent, alors je l'ai fait "à l'ancienne".

    J'ai déclaré une classe

    	class DonneeImport
    	{
    		public string ssid { get; set; }
    		public string bssid { get; set; }
    		public float rssi { get; set; }
    		public float signal { get; set; }
    	}
    

    puis j'ai lancé le traitement comme ceci :

    System.IO.StreamReader file = new StreamReader(Filepath);
    DonneeImport di = new DonneeImport();
    string line = null;
    while((line = file.ReadLine())!= null)
    {
    	MessageBox.Show(line);
    	char[] sep = { ';' };
    	string[] sp = line.Split(sep);
    	di.ssid = sp[0];
    	di.bssid = sp[1];
    	di.rssi = float.Parse(sp[2]);
    	di.signal = float.Parse(sp[3]);
    }
    MessageBox.Show("Fin de traitement");
    

    Avec un point d'arrêt sur la dernière accolade j'ai pu m'assurer que les champs de di correspondaient bien aux valeurs figurant sur la ligne.

    Pour ça, bien entendu, en préparation du traitement, après avoir récupéré les valeurs dans un fichier, j'ai remplacé les tabulations par des points-virgules, et supprimé les espaces.

    Après je suppose que l'apport de la plateforme proposée est d'améliorer la productivité du développement, mais avant de me lancer là-dedans je voudrais m'assurer que nous parlons de la même chose.

    lundi 4 juin 2018 09:59
  • string[][] data_input_app = input.GetColumns(0, 1, 2, 3);

    C'est bizarre, ça, qu'avec quatre colonnes on s'attende à avoir deux dimensions dans le tableau ?

    lundi 4 juin 2018 10:37
  • Bonjour, 

    Je vous remercie pour cette réponse.

    Au fait, en travaillant avec le machine learning je dois lui passer en paramètre un input de type double[][] ou int[][] et c'est la cause pour laquelle  je n'ai pas travaillé avec des classes d'objets.

    Comme la semaine passée je devais résoudre le problème au plus vite j'ai carrément récupéré mes données depuis la fichier csv dans un DataTable ce qui facilite de déterminer chaque colonne.

    le code que j'ai utilisé et le suivant: 

    public void LearningAlgorithme(DataTable dt)
            {
                codebookin = new Codification()
                {
                    { "ssid1", CodificationVariable.Ordinal},
                    { "bssid1", CodificationVariable.Ordinal},
                    { "rssi1", CodificationVariable.Continious},
                    { "signal1", CodificationVariable.Continious},
    
                    
                };
    
                codebookin.Learn(dt);
    
    
    
     int[][] inputs = codebookin.Apply(dt, "ssid1", "bssid1", "signal1",
                     "ssid2", "bssid2","signal2",
                     "ssid3", "bssid3", "signal3",
                     "ssid4", "bssid4", "signal4").ToJagged().To<int[][]>();
    
                int[] outputs = codebookin.Apply(dt, "position").ToVector().To<int[]>();
    
                var learner = new RandomForestLearning();
    
    
                var randomForest = learner.Learn(inputs, outputs);
    
    
              
             }

    lundi 4 juin 2018 12:39
  • Désolée car ce n'est pas bien expliqué.

    En effet, le input depuis lequel je récupère les 4 colonnes est déjà un tableau double. 

    lundi 4 juin 2018 12:43
  • Est-ce qu'il y a une page de conseillée pour démarrer avec ça, ou c'est celle dont j'ai donné l'adresse ?

    lundi 4 juin 2018 12:50
  • Moi perso j'ai suivi sur celle que vous avez donné
    lundi 4 juin 2018 13:10
  • OK merci.

    lundi 4 juin 2018 13:18
  • Merci à vous :)
    lundi 4 juin 2018 13:22