Arbres et forêts
Une suite de questions oui/non
La régression logistique trace une frontière droite entre les classes. Beaucoup de vrais problèmes ne se séparent pas par une droite. Les arbres de décision suivent une autre logique, très proche de la nôtre.
from sklearn.tree import DecisionTreeClassifier
arbre = DecisionTreeClassifier(max_depth=3, random_state=0)
arbre.fit(X_train, y_train)
Avantages : aucune mise à l'échelle nécessaire (les seuils marchent quelle que soit la taille des nombres), et un petit arbre se lit comme un organigramme, donc s'explique.
La forêt : la sagesse des foules
Un seul arbre est instable : change quelques exemples, et il pose des questions complètement différentes. L'idée géniale : au lieu d'un arbre, en construire des centaines, chacun sur un tirage au sort légèrement différent des données et des caractéristiques, puis les faire voter.
from sklearn.ensemble import RandomForestClassifier
foret = RandomForestClassifier(n_estimators=100, random_state=0)
foret.fit(X_train, y_train)
n_estimators=100 : cent arbres. La forêt aléatoire est l'un des modèles les plus utilisés au monde : robuste, efficace sans réglages, excellent sur des données en tableau comme les nôtres. Sur beaucoup de compétitions Zindi ou Kaggle avec des données tabulaires, une forêt (ou sa cousine le gradient boosting) est difficile à battre.
Exercice : Arbre contre forêt
Sur le crédit, entraîne les deux modèles et compare leur exactitude sur le test :
arbre: unDecisionTreeClassifier(max_depth=3, random_state=0);foret: unRandomForestClassifier(n_estimators=100, random_state=0);acc_arbreetacc_foret: leurs exactitudes sur le test.
Remarque : ni l'un ni l'autre n'a besoin de mise à l'échelle.
Voir une solution
import pandas as pd
from sklearn.model_selection import train_test_split
df = pd.read_csv("credit.csv")
X = df[["age", "revenu", "montant", "duree", "retards"]]
y = df["rembourse"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0, stratify=y)
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
arbre = DecisionTreeClassifier(max_depth=3, random_state=0).fit(X_train, y_train)
foret = RandomForestClassifier(n_estimators=100, random_state=0).fit(X_train, y_train)
acc_arbre = accuracy_score(y_test, arbre.predict(X_test))
acc_foret = accuracy_score(y_test, foret.predict(X_test))
print("arbre :", round(acc_arbre, 3), "| foret :", round(acc_foret, 3))Dans l'appli, ton code est exécuté et corrigé automatiquement. Faire l'exercice
Exercice : Sur quoi la forêt s'appuie-t-elle ?
Entraîne une forêt sur le crédit, puis construis importances : un dictionnaire caractéristique → importance arrondie à 3 décimales. Range dans decisif le nom de la caractéristique la plus importante.
Voir une solution
import pandas as pd
from sklearn.model_selection import train_test_split
df = pd.read_csv("credit.csv")
X = df[["age", "revenu", "montant", "duree", "retards"]]
y = df["rembourse"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0, stratify=y)
from sklearn.ensemble import RandomForestClassifier
foret = RandomForestClassifier(n_estimators=100, random_state=0).fit(X_train, y_train)
importances = {nom: round(v, 3) for nom, v in zip(X.columns, foret.feature_importances_)}
decisif = max(importances, key=importances.get)
print(importances)
print(decisif)Dans l'appli, ton code est exécuté et corrigé automatiquement. Faire l'exercice