# Lesson 5: decision trees and random forests
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier, export_text
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, recall_score

df = pd.read_csv("customers.csv")
X = pd.get_dummies(df.drop(columns=["customer_id", "churned"]), columns=["contract"], drop_first=True, dtype=int)
y = df["churned"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=7, stratify=y)

tree = DecisionTreeClassifier(max_depth=3, random_state=0).fit(X_train, y_train)
print("A tree you can read:")
print(export_text(tree, feature_names=list(X.columns)))
print(f"Tree accuracy: {accuracy_score(y_test, tree.predict(X_test)):.1%}")

deep = DecisionTreeClassifier(random_state=0).fit(X_train, y_train)
print(f"Unlimited tree: train {accuracy_score(y_train, deep.predict(X_train)):.1%}, test {accuracy_score(y_test, deep.predict(X_test)):.1%}  <- overfitting")

forest = RandomForestClassifier(n_estimators=300, max_depth=6, random_state=0).fit(X_train, y_train)
fp = forest.predict(X_test)
print(f"Random forest accuracy: {accuracy_score(y_test, fp):.1%}, recall {recall_score(y_test, fp):.1%}")
imp = pd.Series(forest.feature_importances_, index=X.columns).sort_values(ascending=False)
print("\nWhat matters most:")
print(imp.round(3).to_string())
