import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.metrics import (
    accuracy_score,
    confusion_matrix, ConfusionMatrixDisplay
)


# ]ʂ̕\
def eval_and_print(name, y_true, y_pred, target_names=None):
    print(f"[{name}]")
    print("Accuracy :", accuracy_score(y_true, y_pred))

    # s
    cm = confusion_matrix(y_true, y_pred)
    ConfusionMatrixDisplay(
        confusion_matrix=cm, display_labels=target_names,
    ).plot(cmap="Greys")
    plt.title(f"Confusion Matrix - {name}")
    plt.show()


# 1) f[^ǂݍ݂ƕ
iris = load_iris()
X, y = iris.data, iris.target
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, stratify=y, random_state=42
)


# x[XCiŕpNX\j
majority_class = pd.Series(y_train).mode()[0]
y_pred_base = [majority_class] * len(y_test)
print("[Baseline] Most frequent class =",
      iris.target_names[majority_class])
print("[Baseline] Accuracy:", accuracy_score(y_test, y_pred_base), "\n")


# 2) pCvCiDecisionTreeClassifierj
pipe = Pipeline([
  ("dt", DecisionTreeClassifier(random_state=42))
])


# 3) ؂ŊwKƕ]
pipe.fit(X_train, y_train)
y_pred = pipe.predict(X_test)
eval_and_print("Decision Tree",
    y_test, y_pred, target_names=iris.target_names)


# 4) ʏdvx
df_importances = pd.DataFrame({
  "feature": iris.feature_names,
  "importance": pipe.named_steps["dt"].feature_importances_
}).sort_values("importance", ascending=False)
print(df_importances,"\n")


# 5) ؂̉
plt.figure()
plot_tree(pipe.named_steps["dt"],
    feature_names=iris.feature_names,
    class_names=iris.target_names, filled=False
)
plt.show()