Ich habe eine Regellernbibliothek namens [skope-rules] gefunden (https://github.com/scikit-learn-contrib/skope-rules). Dies ist ein Scikit-Learn-Contrib-Projekt. Wenn Sie als Test den Beispielcode des Iris-Datasets ausführen, den jeder liebt, erhalten Sie die folgende Regel.
Rules for iris virginica
('petal_length > 4.75 and petal_width > 1.75', (0.9743589743589743, 0.9047619047619048, 1))
('petal_width > 1.6500000357627869', (0.9514316093263462, 0.9218081435472739, 3))
('petal_length > 5.049999952316284', (0.9696691176470589, 0.8007518796992481, 2))
Es gibt eine Regel pro Zeile, zum Beispiel hat die erste Regel "Blütenblattlänge> 4,75 und Blütenblattbreite> 1,75" eine Genauigkeit von ungefähr 0,97, einen Rückruf von ungefähr 0,90 und die Anzahl der Vorkommen in dem Entscheidungsbaum, aus dem sie gelernt wurde. Lies es einmal. Aha.
Übrigens, sollten wir normalerweise nach dem Entscheidungsbaum im obigen "ursprünglichen Entscheidungsbaum" klassifizieren? Rechte und linke Ehemänner, die dachten, ja, wenn Sie sich in einer Umgebung befinden, in der Sie mit einem komplizierten Entscheidungsbaum schließen können, sollten Sie XGBoost oder LightGBM verwenden, um Genauigkeit zu erhalten. Es gibt jedoch einige Websites, auf denen dies nicht der Fall ist.
--Komplizierter Entscheidungsbaum kann nicht in die Kante integriert werden
Es ist ein Fall, in dem einfache Regeln erforderlich sind, die eher interpretiert werden können als Genauigkeit. Da es viele Funktionen gibt und es für Menschen schwierig ist, durch Erraten Versuch und Irrtum zu machen, denke ich, dass ein solches Lernen von Regeln süchtig macht, wenn Sie meine lernen möchten.
Der Umriss des Algorithmus wird zitiert, da die Abbildung von README leicht zu verstehen ist.
Mit anderen Worten, es geht darum, viele Entscheidungsbäume zu lernen, sie zu zerlegen, um eine große Anzahl von Regelkandidaten zu erhalten, ähnliche zu filtern und auszuschließen und dann genaue auszugeben. Der Zweck dieses Artikels besteht darin, dieses Detail aus dem Code zu lesen. Der Hauptteil besteht jedoch aus einer Datei mit weniger als 700 Zeilen, sodass der Ablauf leicht zu verfolgen ist.
Bagging estimator
Zunächst [Absacken] des Klassifizierungsbaums und des Rückgabebaums (http://ibisforest.org/index.php?%E3%83%90%E3%82%AE%E3%83%B3%E3%82%B0) ), Und erstellen Sie viele originelle Entscheidungsbäume, während Sie die Tiefeneinstellung ändern. Obwohl Skope-Regeln die binäre Klassifizierung behandeln, wird sie auch als Pseudo-Regressionsproblem behandelt, indem Stichprobengewichte übergeben werden. Wenn jedoch kein Gewicht übergeben wird, wird der Rückgabebaum ebenfalls bei 0/1 gelernt. Es ist unklar, wie viel Lernen nicht nur der Klassifizierungsbaum, sondern auch der Rückgabebaum zur endgültigen Regel beiträgt, aber die ungenaue Regel wird später fallengelassen. Daher ist es vorerst eine Atmosphäre, in der ich mich beeilen kann, die Anzahl der Regelkandidaten zu erhöhen. Ich fühle.
Als Code
for max_depth in self._max_depths:
bagging_clf = BaggingClassifier(
base_estimator=DecisionTreeClassifier(
max_depth=max_depth,
...
bagging_reg = BaggingRegressor(
base_estimator=DecisionTreeRegressor(
max_depth=max_depth,
skope-rules / skrules / skope_rules.py * Formatted forable Zitiert
Mit diesem Gefühl verwende ich die Entscheidungsbaumklasse Scikit-Learn. Daher wurden die Nachteile, nicht mit kategorialen Variablen und fehlenden Werten umgehen zu können, so übernommen, wie sie sind .... Es scheint, dass dieser Bereich von kategorialen Variablen in scikit-learn selbst unterstützt wird, sodass er möglicherweise bald behoben wird. https://github.com/scikit-learn/scikit-learn/pull/12866
-> Set of logical rules
Folgen Sie dem Entscheidungsbaum von der Wurzel bis zu den Blättern und verbinden Sie die Verzweigungsbedingungen mit UND für jeden Pfad, um eine Regel zu erstellen.
def recurse(node, base_name):
if tree_.feature[node] != _tree.TREE_UNDEFINED:
name = feature_name[node]
symbol = '<='
symbol2 = '>'
threshold = tree_.threshold[node]
text = base_name + ["{} {} {}".format(name, symbol, threshold)]
recurse(tree_.children_left[node], text)
text = base_name + ["{} {} {}".format(name, symbol2, threshold)]
recurse(tree_.children_right[node], text)
else:
rule = str.join(' and ', base_name)
rule = (rule if rule != '' else ' == '.join([feature_names[0]] * 2))
rules.append(rule)
skope-rules/skrules/skope_rules.py
Dies ist eine Suche mit Tiefenpriorität, da auf eine rekursive Funktion folgt.
-> High performing rules
Berechnen Sie für jede Regel [Out-of-Bag] des ursprünglichen Entscheidungsbaums (https://qiita.com/kenmatsu4/items/1152d6e5634921d9246e) die Genauigkeit und den Rückruf für die Daten und aus dem festgelegten Mindestwert Lass nur die hohen Regeln.
Interessant ist hier, dass anstelle der Verwendung des ursprünglichen Entscheidungsbaums, um festzustellen, ob die Regel wahr ist,
def _eval_rule_perf(self, rule, X, y):
detected_index = list(X.query(rule).index)
skope-rules/skrules/skope_rules.py
Ich füttere pandas.DataFrame.query
als. In Skope-Regeln werden die Regeln als Zeichenfolgen wie "Blütenblattlänge> 4,75" und Blütenblattbreite> 1,75 "beibehalten, sodass sie als Abfragen behandelt werden können. Da die Zeichenfolge jedoch bei der Auflistung der später beschriebenen Merkmalsmengen erneut geteilt wird, besteht das Gefühl, dass sie nicht implementiert werden kann.
Semantic Rule Deduplication
Gruppieren Sie ähnliche Regeln, die oben überlebt haben, um die besten Regeln für F1-Ergebnisse für jede Gruppe zu erhalten. Ohne dies würde eine Reihe von Regeln mit leicht unterschiedlichen Schwellenwerten ausgegeben.
Ob sie ähnlich sind oder nicht
def split_with_best_feature(rules, depth, exceptions=[]):
...
for rule in rules:
if (most_represented_term + ' <=') in rule[0]:
rules_splitted[0].append(rule)
elif (most_represented_term + ' >') in rule[0]:
rules_splitted[1].append(rule)
else:
rules_splitted[2].append(rule)
new_exceptions = exceptions+[most_represented_term]
return [split_with_best_feature(ruleset, depth-1, exceptions=new_exceptions)
for ruleset in rules_splitted]
skope-rules/skrules/skope_rules.py
Wenn man die häufig verwendeten Merkmalsgrößen und ihre Ungleichheitszahlen der Reihe nach betrachtet, fühlt es sich so an, als würden sie in dieselbe Gruppe sortiert, wenn sie bis zur festgelegten Tiefe zusammen sind.
Skope-Regeln sind jetzt in dem von Microsoft Research entwickelten Paket lnterpretML enthalten. Nennen wir es also auch von dort aus. Eine Klasse namens "DecisionListClassifier" ist ein Wrapper für Skope-Regeln.
from interpret.glassbox import DecisionListClassifier
from interpret import show
from sklearn.datasets import load_iris
import pandas as pd
iris = load_iris()
dlc = DecisionListClassifier()
dlc.fit(pd.DataFrame(iris.data, columns=iris.feature_names),
iris.target == iris.target_names.tolist().index('virginica'))
show(dlc.explain_global())
Es gibt nur ein Paket für Interpretierbarkeit und es sieht gut aus.
Vor kurzem interessiere ich mich für die Interpretierbarkeit von Modellen des maschinellen Lernens. Der aktuelle Stand der Interpretierbarkeit ist in "Erläuterung der Beurteilungsgrundlage für das Modell des maschinellen Lernens (Ver.2)" beschrieben. Es gibt verschiedene Gründe, nach Interpretierbarkeit zu fragen, aber in interpret / README von lnterpretML,
--Debug: Warum haben Sie die Folgerung entfernt?
Ist geschrieben. Ich denke, dass sich die Punkte je nach Arbeit ändern werden, aber meine persönliche Motivation ist, dass ich auch das vom Modell entdeckte Wissen erwerben möchte und das Wissen durch Einbeziehung meiner eigenen Gedanken und Intuition arrangiere und umlenke. Ich habe das Gefühl, dass ich es tun möchte. Zu diesem Zweck denke ich, dass wir von Anfang an "ein lesbares Modell lernen sollten, das keiner Erklärung bedarf", anstatt ein kompliziertes Modell zu verwalten. Aber wie viele Methoden können in diesem Fall verwendet werden? In Interpretierbares maschinelles Lernen - Kapitel 4 Interpretierbare Modelle], lineare Regression, logistische Regression, verallgemeinertes lineares Modell, verallgemeinertes additives Modell ・ Entscheidungsbaum ・ RuleFit ・ Naive Bayes ・ k Die Nachbarschaftsmethode wird erwähnt. RuleFit ruft wie Skope-Regeln Regeln aus Entscheidungsbäumen ab, außer dass sie als Features für die lineare Regression verwendet werden. Hier sollte es natürlich einen Kompromiss zwischen Modellgenauigkeit und Interpretierbarkeit geben. "[Das Labyrinth der Erklärbarkeit des maschinellen Lernens (Interpretierbarkeit)](https://tjo.hatenablog.com/entry/2019/12/ Die in "19/190000) eingeführte Zahl" Erklärbare künstliche Intelligenz (XAI): Konzepte, Taxonomien, Chancen und Herausforderungen für eine verantwortungsvolle KI "ist ein Gefühl. Ich werde es zitieren, weil es leicht zu verstehen ist.
Daher muss es einen kargen Bereich geben, selbst wenn Sie nach perfekter Interpretierbarkeit suchen. In Bereichen wie Bildern und natürlichen Sprachen, in denen tiefes Lernen erfolgreich war, ist der Gegner die kognitive Fähigkeit des Menschen. Daher ist es nicht verwunderlich, dass das Modell kompliziert und seltsam wird. Ich frage mich, ob, aber ich habe eine hoffnungsvolle Beobachtung, dass eine ausgewogenere Methode darin besteht, im physischen oder technischen Bereich zu schlafen, der das Phänomen traditionell mit einer schönen Formel erfasst. Ich bin. Vor ungefähr zehn Jahren "[Künstliche Intelligenz, die die Gesetze der Physik selbst entdeckte](https://wired.jp/2009/04/15/%e3%80%8c%e7%89%a9%e7%90%86" % e6% b3% 95% e5% 89% 87% e3% 82% 92% e8% 87% aa% e5% 8a% 9b% e3% 81% a7% e7% 99% ba% e8% a6% 8b% e3 % 80% 8d% e3% 81% 97% e3% 81% 9f% e4% ba% ba% e5% b7% a5% e7% 9f% a5% e8% 83% bd /) ”Genetische Programmierung wurde ein heißes Thema, aber ich wünschte, ich könnte ein kleines Berechnungsdiagramm wie dieses lernen. Wenn Sie es zur Erzeugung von Merkmalsmengen wie "Erzeugung von Merkmalsmengen durch genetische Programmierung" verwenden, kann es mit verschiedenen Methoden kombiniert werden, sodass ich davon ausgehe, dass hier kein Weg vorbei ist. Es ist ungefähr um diese Zeit heute.