Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Konfigurationsparameter für approximative Verfahren #269

Closed
michael-rapp opened this issue Oct 23, 2020 · 4 comments · Fixed by #278
Closed

Konfigurationsparameter für approximative Verfahren #269

michael-rapp opened this issue Oct 23, 2020 · 4 comments · Fixed by #278
Labels
approximate conditions Affects the approximate condition finding algorithm boosting Affects the subproject "boosting" enhancement New feature or request seco Affects the subproject "seco"

Comments

@michael-rapp
Copy link
Collaborator

michael-rapp commented Oct 23, 2020

Um die approximativen Verfahren aus #226 verwenden zu können, wird eine Möglichkeit benötigt um den Algorithmus so zu konfigurieren dass diese verwendet werden. Hierfür sind folgende Änderungen notwendig:

  • Damit aus dem Cython-Code heraus, die neuen C++-Klassen verwendet werden können, müssen entsprechende Deklarationen hinzugefügt werden:

    • In thresholds.pxd muss im Block cdef extern from "cpp/thresholds.h", analog zu der Klasse ExactThresholdsImpl, eine Deklaration für die Klasse ApproximateThresholdsImpl hinzugefügt werden.
    • In einem neuen File binning.pxd muss das selbe für die Klassen IBinning, EqualFrequencyBinning und EqualWidthBinning gemacht werden.
  • Es werden Cython-Wrapper-Klassen für die neuen C++-Klassen benötigt, die aus dem Python-Code heraus instanziiert werden können.

    • In binning.pxd müssen neue Cython-Klassen Binning, EqualWidthBinning und EqualFrequencyBinning definiert werden, die dann in einer neuen Datei binning.pyx implementiert werden. Eine gute Vorlage hierfür sind die Klassen InstanceSubSampling, Bagging und RandomInstanceSubsetSelection aus sub_sampling.pxd/pyx.
    • In thresholds.pxd muss, analog zur Klasse ExactThresholdsFactory, eine neue Cython-Klasse ApproximateThresholdsFactory definiert werden, die dann in thresholds.pyx implementiert wird. Diese Klasse muss ein Objekt der Cython-Klasse Binning und die Anzahl zu verwendender Bins als Konstruktorargumente entgegen nehmen und als Klassenattribute speichern so dass sie in der create-Funktion an das zu erzeugende Objekt der C++-Klasse ApproximateThresholdsImpl übergeben werden können.
  • Es muss ein neues Kommandozeilenargument zu der Klasse ArgumentParserBuilder in args.py hinzugefügt werden. Da die Verfahren prinzipiell sowohl für den Boosting-Regellerner, als auch für den SeCo-Regellerner verwendet werden können, sollte das neue Argument innerhalb der Funktion add_rule_learner_arguments hinzugefügt werden. Als Name für das Argument, würde sich --feature-binning anbieten. Der Typ muss optional_string sein. Außerdem kann es nichts schaden, das neue Argument in der Readme-Datei zu dokumentieren. Das Argument --instance-sub-sampling hat eine ähnliche Semantik. Insbesondere, dass man zusätzliche, optionale Argumente als Python-Dictionary angeben kann so wie es in der Readme für dieses Argument beschrieben wird. Das ist in unserem Fall praktisch um zusätzlich zum Namen der zu verwendenden Binning-Methode auf die Anzahl-Bins angeben zu können.

  • In rule_learners.py muss eine neue Funktion create_thresholds_factory hinzugefügt werden, die ein Objekt der Cython-Klasse ThresholdsFactory zurückgibt. Als Vorlage eignet sich die Funktion create_instance_sub_sampling. Mit Hilfe der Funktion parse_prefix_and_dict kann der Wert des oben definierten Kommandozeilenarguments abgefragt werden und anschließend, falls der Wert equal-width oder equal-frequency ist, außerdem der Wert für ein zusätzliches, optionales argument num_bins ermittelt werden. Dieser Wert kann dann zur Instanziierung eines neuen Objekts der Cython-Klasse Binning genutzt werden, das wiederum als Konstruktorarugment an ein neues Objekt vom Typ ApproximateThresholdsFactory übergeben wird. Falls der Wert None an die create_thresholds_factory-Methode übergeben wird, muss stattdessen ein Objekt vom Typ ExactThresholdsFactory zurück gegeben werden.

  • In boosting_learners.py und seco_learners.py gibt es jeweils eine Funktion _create_sequential_rule_induction in der aktuell ein Objekt vom Typ ExactThresholdsFactory initialisiert wird. Statt diesem Objekt muss der Rückgabewert der neuen Funktion create_thresholds_factory verwendet werden.

@michael-rapp michael-rapp added enhancement New feature or request boosting Affects the subproject "boosting" seco Affects the subproject "seco" approximate conditions Affects the approximate condition finding algorithm labels Oct 23, 2020
@LukasEberle
Copy link

Hallo,

ich habe gerade folgendes Problem:
Ich weiß nicht genau wie ich den FeatureVector importieren soll. Ich finde auch keine Stelle an der er importiert wurde. Außerdem muss ich irgendwie auch auf den Typ Entry zugreifen, der in dem FeatureVector liegt (In cpp im Namespace FeatureVector::Entry) auch da bin ich mir nicht so sicher, wie man das macht oder wo ich ein Beispiel finde wie das gemacht wird.

@mrapp-ke
Copy link
Owner

Ich weiß nicht genau wie ich den FeatureVector importieren soll. Ich finde auch keine Stelle an der er importiert wurde.

Du meinst im Cython-Code? Zu welchem Zweck brauchst du das denn dort? Ich war eigentlich der Meinung, dass das nur im C++-Code gebraucht wird und tatsächlich wird dieser Typ auch bisher nirgendwo sonst verwendet.

Du musst übrigens in Cython-Wrappern (cdef cppclass ...) nicht alle Funktionen, Klassenattribute, etc. deklarieren. Du brauchst nur solche, die auch im Cython-Code aufgerufen werden. Das sind meistens nur die Konstruktoren.

@LukasEberle
Copy link

Ah okay, dann brauch ich ja zum Beispiel createBins(...) gar nicht anzugeben, da das ja nicht von Python, sondern nur innerhalb der CPP Implementation aufgerufen wird.

@mrapp-ke
Copy link
Owner

Genau.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
approximate conditions Affects the approximate condition finding algorithm boosting Affects the subproject "boosting" enhancement New feature or request seco Affects the subproject "seco"
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants