"""
Use a decisiontree classifier to predict handwritten digits

- This is an example of a supervised ML algorithm
    - it has labels on the training data
    - you tell the model: this is class X during training
"""

import matplotlib.pyplot as plt

from sklearn import datasets
from sklearn.tree import DecisionTreeClassifier
from sklearn import tree

# load the digits dataset
digits = datasets.load_digits()
# get a feel for it
print(digits.data.size)
print(digits.target.size)
print(digits.feature_names)
print(digits.target_names)

# use a decision tree classifier
# set max_depth to 5 otherwise the tree will get huge
classifier = DecisionTreeClassifier(max_depth=5)
# use all but the last sample for training
classifier.fit(digits.data[:-1], digits.target[:-1])

# use the model to predict the last data sample
last_sample = digits.data[-1:]
last_target = digits.target[-1:]
print(f"predicted: {classifier.predict(last_sample)} vs real: {last_target}")

# print the tree for visual inspection
fig, ax = plt.subplots(figsize=(20, 10))
tree.plot_tree(
    classifier,
    feature_names=digits.feature_names,
    class_names=[str(i) for i in digits.target_names],
    filled=True,
    rounded=True,
    ax=ax,
)
fig.savefig("decisiontree_digits.png", dpi=500, bbox_inches="tight")
