Einen Entscheidungsbaum in Tikz replizieren

Einen Entscheidungsbaum in Tikz replizieren

Ich versuche, einige Änderungen an einem Entscheidungsbaummodell vorzunehmen, das tikzausHier. Der Code, den ich verwende, ist genau der gleiche wie in diesem Beitrag, mit der einzigen Änderung in\documentclass[]{article}

Code:

\documentclass[]{article}

\usepackage{forest}
\usetikzlibrary{fit,positioning}

\tikzset{
  font=\Large\sffamily\bfseries,
  red arrow/.style={
    midway,red,sloped,fill, minimum height=3cm, single arrow, single arrow head extend=.5cm, single arrow head indent=.25cm,xscale=0.3,yscale=0.15,
    allow upside down
  },
  black arrow/.style 2 args={-stealth, shorten >=#1, shorten <=#2},
  black arrow/.default={1mm}{1mm},
  tree box/.style={draw, rounded corners, inner sep=1em},
  node box/.style={white, draw=black, text=black, rectangle, rounded corners},
}

\begin{document}
\begin{forest}
  for tree={l sep=3em, s sep=3em, anchor=center, inner sep=0.7em, fill=blue!50, circle, where level=2{no edge}{}}
  [
  Training Data, node box
  [sample and feature bagging, node box, alias=bagging, above=4em
  [,red!70,alias=a1[[,alias=a2][]][,red!70,edge label={node[above=1ex,red arrow]{}}[[][]][,red!70,edge label={node[above=1ex,red arrow]{}}[,red!70,edge label={node[below=1ex,red arrow]{}}][,alias=a3]]]]
  [,red!70,alias=b1[,red!70,edge label={node[below=1ex,red arrow]{}}[[,alias=b2][]][,red!70,edge label={node[above=1ex,red arrow]{}}]][[][[][,alias=b3]]]]
  [~~$\dots$~,scale=2,no edge,fill=none,yshift=-4em]
  [,red!70,alias=c1[[,alias=c2][]][,red!70,edge label={node[above=1ex,red arrow]{}}[,red!70,edge label={node[above=1ex,red arrow]{}}[,alias=c3][,red!70,edge label={node[above=1ex,red arrow]{}}]][,alias=c4]]]]
  ]
  \node[tree box, fit=(a1)(a2)(a3)](t1){};
  \node[tree box, fit=(b1)(b2)(b3)](t2){};
  \node[tree box, fit=(c1)(c2)(c3)(c4)](tn){};
  \node[below right=0.5em, inner sep=0pt] at (t1.north west) {Tree 1};
  \node[below right=0.5em, inner sep=0pt] at (t2.north west) {Tree 2};
  \node[below right=0.5em, inner sep=0pt] at (tn.north west) {Tree $n$};
  \path (t1.south west)--(tn.south east) node[midway,below=4em, node box] (mean) {mean in regression or majority vote in classification};
  \node[below=3em of mean, node box] (pred) {prediction};
  \draw[black arrow={5mm}{4mm}] (bagging) -- (t1.north);
  \draw[black arrow] (bagging) -- (t2.north);
  \draw[black arrow={5mm}{4mm}] (bagging) -- (tn.north);
  \draw[black arrow={5mm}{5mm}] (t1.south) -- (mean);
  \draw[black arrow] (t2.south) -- (mean);
  \draw[black arrow={5mm}{5mm}] (tn.south) -- (mean);
  \draw[black arrow] (mean) -- (pred);
\end{forest}
\end{document}

Ich habe versucht, ein paar Dinge zu tun:

  1. Passen Sie das tikzDiagramm in ein \documentclass[]{article}statt in ein\documentclass[tikz]{standalone}
  2. Ich habe versucht, die Farben so zu ändern, dass sie zum folgenden Baum passen

Bildbeschreibung hier eingeben

Dabei sind die Endknoten grün und rot gefärbt und alle anderen Knoten haben die gleiche Farbe, aber ich scheine diesen Teil nicht herauszufinden (derzeit sind die Bäume im Code rot, wenn die Pfeile rot sind. Ich würde die Pfeile gerne beibehalten, aber einfach alle Farben gleich machen – abgesehen von den Endknoten).

  1. Ich kann das circle„zu“ ändern rectangle, indem ich die folgende Zeile modifiziere for tree={l sep=3em, s sep=3em, anchor=center, inner sep=0.7em, fill=blue!50, rectangle, where level=2{no edge}{}}, aber es stellt sich als Quadrat heraus.

BEARBEITEN:

Bildbeschreibung hier eingeben

Antwort1

  1. Nun, es ist zu breit, also müssen Sie es schmaler machen. Zum Beispiel indem Sie die reduzieren s sep.

  2. Die Farbe der Knoten und die Farbe der Pfeile sind nicht miteinander verbunden. Wenn ein Knoten rot ist, liegt das daran, dass Sie ,red!70für diesen bestimmten Knoten etwas hinzugefügt haben. Sie müssen also einfach viele dieser ,red!70s entfernen.

  3. Breite und Höhe müssen Sie separat einstellen:

      inner sep=0,
      minimum width=1em,
      minimum height=0.5em,
    

Nein inner sep, es gibt also keine Auffüllung. Setzen Sie dann minimum width/ heightauf geeignete Werte. Sie können diese ändern.

Ich habe auch s sepden sample and feature bagging,Knoten eingefügt, um die Teilbäume etwas weiter auseinander zu setzen, und ich habe zwei phantomKnoten hinzugefügt, um mehr Platz zwischen dem zweiten und dritten zu schaffen. Und ich habe den letzteren hinzugefügt , indem ich einen Knoten in der Mitte zwischen und \dotsplatziert habe .t2tn

Ich würde den mean in regression..Knoten wahrscheinlich direkt darunter setzen t2, aber das überlasse ich Ihnen.

Der Rahmen in diesem Screenshot wird vom showframePaket erstellt und gibt die Breite des Textblocks an.

Bildbeschreibung hier eingeben

\documentclass[]{article}

\usepackage{
  forest,
 % showframe
 }
\usetikzlibrary{fit,positioning}

\tikzset{
  font=\large\sffamily\bfseries,
  red arrow/.style={
    midway,red,sloped,fill, minimum height=3cm, single arrow, single arrow head extend=.5cm, single arrow head indent=.25cm,xscale=0.3,yscale=0.15,
    allow upside down
  },
  black arrow/.style 2 args={-stealth, shorten >=#1, shorten <=#2},
  black arrow/.default={1mm}{1mm},
  tree box/.style={draw, rounded corners, inner sep=1em},
  node box/.style={white, draw=black, text=black, rectangle, rounded corners},
}

\begin{document}
\begin{center}
\begin{forest}
  for tree={
     l sep=2em,
     s sep=2mm,
     anchor=center,
     inner sep=0,
     minimum width=1em,
     minimum height=0.5em,
     fill=blue!50,
     rectangle,
     where level=2{no edge}{}}
  [
  Training Data, node box
  [sample and feature bagging, node box, alias=bagging, above=4em,s sep=1.1cm
  [,alias=a1[[,alias=a2][]][,edge label={node[above=1ex,red arrow]{}}[[][]]
  [,edge label={node[above=1ex,red arrow]{}}[,red!70,edge label={node[below=1ex,red arrow]{}}][,alias=a3]]]]
  [,alias=b1[,edge label={node[below=1ex,red arrow]{}}[[,alias=b2][]][,red!70,edge label={node[above=1ex,red arrow]{}}]][[][[][,alias=b3]]]]
  [,phantom]
  [,phantom]
  [,alias=c1[[,alias=c2][]][,edge label={node[above=1ex,red arrow]{}}[,edge label={node[above=1ex,red arrow]{}}[,alias=c3][,red!70,edge label={node[above=1ex,red arrow]{}}]][,alias=c4]]]]
  ]
  \node[tree box, fit=(a1)(a2)(a3)](t1){};
  \node[tree box, fit=(b1)(b2)(b3)](t2){};
  \node[tree box, fit=(c1)(c2)(c3)(c4)](tn){};
  \begin{scope}[every node/.append style={below right=0.5em, inner sep=0pt, font=\normalsize\sffamily\bfseries}]
  \node at (t1.north west) {Tree 1};
  \node at (t2.north west) {Tree 2};
  \node at (tn.north west) {Tree $n$};
  \end{scope}
  \path (t1.south west)--(tn.south east) node[midway,below=4em, node box] (mean) {mean in regression or majority vote in classification};
  \node[below=3em of mean, node box] (pred) {prediction};
  \draw[black arrow={5mm}{4mm}] (bagging) -- (t1.north);
  \draw[black arrow] (bagging) -- (t2.north);
  \draw[black arrow={5mm}{4mm}] (bagging) -- (tn.north);
  \draw[black arrow={5mm}{5mm}] (t1.south) -- (mean);
  \draw[black arrow] (t2.south) -- (mean);
  \draw[black arrow={5mm}{5mm}] (tn.south) -- (mean);
  \draw[black arrow] (mean) -- (pred);
  \path (t2) -- node {\dots} (tn); % <-- new node
\end{forest}
\end{center}
\end{document}

verwandte Informationen