[PYTHON] Ein Kommentar zum Boruta-Algorithmus

Unterlassung

Boruta ist eine der Methoden zur Merkmalsauswahl, bei der die Bedeutung von Merkmalen verwendet wird.

Ich habe anhand der Erklärung auf der folgenden Seite studiert. Es ist eine sehr leicht verständliche Erklärung und bei Experimenten sehr hilfreich.

Kommentar

Der Algorithmus von Boruta verwendet die Nullhypothese, um zu bestimmen, ob ein Merkmal für die Vorhersage gültig ist. Die Wichtigkeit dieses Merkmalsbetrags entspricht der Wichtigkeit des Merkmalsbetrags, der nicht zur Diskriminierung (Rückgabe) beiträgt. ", Und führen Sie den Test durch. Wenn die Nullhypothese korrekt ist, sollten die Wichtigkeit eines Merkmals und die Kapazität von Merkmalen, die nicht zur Diskriminierung (Rückkehr) beitragen, zufällig sein, und die Wahrscheinlichkeit, dass ein Merkmal wichtiger wird, beträgt $ p = 0,5. Es sollte der Binomialverteilung von $ folgen.

Was mich hier interessiert hat, ist nicht ein Schatten-Feature, sondern die gleiche Nummer wie die ursprüngliche Feature-Dimension. Dann wird der Größenvergleich durch "die höchste Wichtigkeit eines bestimmten Merkmals VS Schattenmerkmal" durchgeführt.

スクリーンショット 2020-05-16 0.07.35.png Das obige Bild stammt aus [Charakteristische Auswahlmethode Boruta unter Verwendung eines zufälligen Waldes und Tests](https://aotamasaki.hatenablog.com/entry/2019/01/05/195813)

So sieht auch Implementierung von boruta_py aus.

    def _do_tests(self, dec_reg, hit_reg, _iter):
        active_features = np.where(dec_reg >= 0)[0]
        hits = hit_reg[active_features]
        # get uncorrected p values based on hit_reg
        to_accept_ps = sp.stats.binom.sf(hits - 1, _iter, .5).flatten()
        to_reject_ps = sp.stats.binom.cdf(hits, _iter, .5).flatten()
        ...

Wenn jedoch die Wahrscheinlichkeitsvariable, die die maximale Merkmalsbedeutung des Schattenmerkmals darstellt, $ S_ {\ mathrm {max}} $ ist,

S_{\mathrm{max}} \leq F_1 \Leftrightarrow S_1\leq F_1 \wedge S_2\leq F_1 \wedge S_3\leq F_1 \wedge S_4\leq F_1 

Deshalb,

\mathrm{Pr}(S_{\mathrm{max}} \leq F_1) = \mathrm{Pr}(S_1 \leq F_1)\mathrm{Pr}(S_2 \leq F_1)\mathrm{Pr}(S_3 \leq F_1)\mathrm{Pr}(S_4 \leq F_1) = \left(\frac{1}{2}\right)^4

Wenn die Nullhypothese korrekt ist, sollte die Wahrscheinlichkeit, dass ein Merkmal größer als die maximale Merkmalsbedeutung des Schattenmerkmals ist, der Binomialverteilung von $ p = (1/2) ^ 4 $ folgen.

%matplotlib inline 
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import binom

plt.rcParams['font.family'] = 'IPAPGothic' 
plt.rcParams["figure.figsize"] = [12, 6]
plt.rcParams['font.size'] = 20 
plt.rcParams['xtick.labelsize'] = 15
plt.rcParams['ytick.labelsize'] = 15

#Anzahl von Versuchen
N = 100
#Anzahl der Vorkommen während der Anzahl der Versuche(Array)   
k = np.arange(N+1)

#Diagramm grafisch darstellen
fig, ax = plt.subplots(1,1)
ax.plot(k, binom.pmf(k, N, p=0.5), 'bo', ms=8, label='p=0.5')
ax.vlines(k, 0, binom.pmf(k, N, p), colors='b', lw=1, alpha=0.2)
ax.plot(k, binom.pmf(k, N, p=0.5**4), 'x', ms=8, color='r', label='p=0.5^4')
ax.vlines(k, 0, binom.pmf(k, N, p=0.5**4), colors='r', lw=1, alpha=0.2)
ax.set_xlabel('iterarion')
ax.set_ylabel('probability')
ax.legend()
plt.show()
スクリーンショット 2020-05-16 1.36.19.png

Wie Sie in der Grafik sehen können, unterscheidet es sich erheblich vom Ablehnungsbereich.

Gras

Ich habe bisher geschrieben, aber wenn ich tatsächlich "Boruta" benutze, funktioniert es dann richtig? Stimmt etwas mit der Denkweise nicht?

Recommended Posts

Ein Kommentar zum Boruta-Algorithmus
Ein * Algorithmus (Python Edition)
Erstellen Sie ein Klassenzimmer auf Jupyterhub
Erstellen einer Python-Umgebung auf einem Mac
matplotlib: Kommentar in Zeitachsendiagramm einfügen
Algorithmus Gymnastik 24 Eine verknüpfte Liste umkehren
Erstellen einer Python-Umgebung unter Ubuntu
Erstellen Sie eine Python-Umgebung auf dem Mac (2017/4)
Installieren Sie Arch Linux auf DeskMini A300
Schreiben Sie A * (A-Stern) -Algorithmen in Python
Führen Sie einen Linux-Server mit GCP aus
Erstellen Sie einen SlackBot-Dienst für Pepper
Implementieren Sie die Django-App auf Hy
Führen Sie Matplotlib auf einem Docker-Container aus
Erstellen Sie eine Linux-Umgebung unter Windows 10
Erstellen Sie eine Python-Umgebung in Centos
Führen Sie Headless-Chrome auf einem Debian-basierten Image aus
Kommentar zur Pull-Anfrage von CircleCI
Verwenden einer seriellen Konsole unter Ubuntu 20.04
Führen Sie TensorFlow2 auf dem VPS-Server aus
Implementierung eines einfachen Algorithmus in Python 2
Führen Sie einen einfachen Algorithmus in Python aus
Registrieren Sie das Paket bei PyPI
Erstellen Sie eine Python3-Umgebung unter CentOS7
Algorithmusgymnastik 22 Quadrieren eines sortierten Arrays
Verursacht einen Busfehler auf x86