Oefening: het machine learning-model visualiseren

Voltooid

Een van de voordelen van het gebruik van een beslissingsstructuurclassificatie is de visualisatie die u kunt gebruiken om beter te begrijpen hoe het model beslissingen neemt. Met graphviz en pydotplus kunt u snel zien hoe een beslissing wordt genomen. In toekomstige herhalingen kunt u zien hoe beslissingen worden gewijzigd.

De visuele structuur maken

Om een visuele voorstelling van het model te maken, maakt u een functie die de volgende parameters gebruikt:

  • Gegevens: tree, het machine learning-model
  • Kolommen: feature_names, een lijst met de kolommen in de invoergegevens
  • Uitvoer: class_names een lijst met de opties voor classificatie (in dit geval 'yes' of 'no')
  • Bestandsnaam: png_file_to_save de naam van het bestand waarin u de visualisatie wilt opslaan

U roept de functie export_graphviz()van scikit-learn aan en retourneert dan een afbeeldingsweergave van het diagram dat scikit-learn bevat.

# Let's import a library for visualizing our decision tree.
from sklearn.tree import export_graphviz

def tree_graph_to_png(tree, feature_names,class_names, png_file_to_save):
    tree_str = export_graphviz(tree, feature_names=feature_names, class_names=class_names,
                                     filled=True, out_file=None)
    graph = pydotplus.graph_from_dot_data(tree_str)  
    return Image(graph.create_png())

Het aanroepen van deze functie is vrij eenvoudig:

  • Gegevens: tree_model, het model dat u eerder hebt getraind en getest
  • Kolommen: X.columns.values de lijst van kolommen in de invoer
  • Uitvoer: [yes, no], de twee mogelijke resultaten
  • Bestandsnaam: decision_tree.png de naam van het bestand waarin u de afbeelding wilt opslaan
# This function takes a machine learning model and visualizes it.
tree_graph_to_png(tree=tree_model, feature_names=X.columns.values,class_names=['No Launch','Launch'], png_file_to_save='decision-tree.png')

Deze functie maakt de volgende afbeelding.

Visualization of decision tree.

In totaal hebben we 240 monsters als we naar de gegevensset kijken:

  • 192 ervan zijn lanceringen die niet door zijn gegaan
  • 48 ervan zijn lanceringen

Dit resultaat is te wijten aan onze strategie voor het opschonen van gegevens, waarbij we ervan uitgingen dat alle niet-gelabelde dagen geen lanceringsdagen zijn.

Met behulp van de nieuwe labels kunnen we zeggen: "Als de windsnelheid minder dan 1,0 was, dan 191 van de 240 monsters vermoedden dat er op die dag geen lancering mogelijk was." Dit resultaat lijkt misschien vreemd, maar op basis van de gegevens is het juist. Hier volgt het bewijs: We hebben de lancering getekend versus de distributie zonder lancering voor dagen dat de windsnelheid op launch Time <= 1 voordat we de kolom eerder in dit notebook neerhalen. Het laat zien dat we voor vrijwel alle tijden niet starten:

Plot of launches versus no launches.

Meer informatie over de visualisatie

Deze eenvoudige structuur toont dat de belangrijkste functie van de gegevens Wind Speed at Launch Time is. Als de windsnelheid minder dan 1,0 was, werd er in 191 van de 240 monsters goed geraden dat er geen lancering was. We zien dat 191 van die monsters alleen nodig hadden dat de waarde van Wind Speed at Launch Time minder was dan 1,0 om het juiste resultaat te raden, terwijl er boven 1,0 meer informatie nodig is.

Dit inzicht is niet goed. We hebben eerder alle waarden die leeg waren op 0 gezet. We weten ook dat veel van de waarden met betrekking tot de tijd van de lancering 0 waren, omdat 60% van onze gegevens niet was gerelateerd aan een daadwerkelijke lancering of poging daartoe.

Als u naar de structuur kijkt, dan kunt u zien dat Max Wind Speed de volgende meest belangrijke functie van de gegevens is. Hier ziet u dat van de resterende 49 dagen, wanneer de maximale windsnelheid lager was dan 30,5, 48 dagen een juiste lanceringsuitvoer oplevert en één een uitvoer zonder lancering heeft opgeleverd.

Deze gegevens zijn mogelijk interessanter met context uit de praktijk. Er was maar één dag dat er een lancering was gepland en de waarde Max Wind Speed groter was dan 30, 5, namelijk 27 mei 2020. De lancering van de Space X Dragon is toen uitgesteld tot 30 mei 2020. Hier is het bewijs:

launch_data[(launch_data['Wind Speed at Launch Time'] > 1) & (launch_data['Max Wind Speed'] > 30.5)]

Only launch with greater than 1.0 wind speed at launch time and greater than 30 max wind speed.

De resultaten verbeteren

Met deze visualisatie kunt u zien dat bepaalde functies belangrijk werden. Maar deze nadruk is gebaseerd op onjuiste informatie.

Eén verbetering die kan worden aangebracht is om de relatie tussen Max Wind Speed en Wind Speed at Launch Time vast te stellen voor de rijen die die informatie bevatten. Vervolgens had, in plaats van Wind Speed at Launch Time op 0 in te stellen voor dagen dat er geen lancering was, het de schatting gemaakt kunnen worden van wat het zou zijn bij een gewone lanceertijd. Deze wijziging geeft mogelijk de gegevens beter weer.

Kunt u andere manieren bedenken om de gegevens te verbeteren?