Si vous voulez essayer l'apprentissage automatique, n'importe qui peut utiliser scicit-learn etc. pour l'implémenter relativement facilement. Cependant, afin d'obtenir des résultats au travail ou d'améliorer votre niveau ** Vous pouvez voir qu'il est clairement faible dans l'explication de "Je ne connais pas le contexte, mais j'ai obtenu ce résultat" **.
Dans le post précédent [Machine learning] Comprendre les arbres de décision à la fois de scikit-learn et de mathématiques, j'ai décrit les détails des arbres de décision. , Cette fois, je vais résumer la forêt aléatoire qui est également utilisée dans des compétitions plus pratiques et comme le kaggle.
Je ne parle pas beaucoup de mathématiques comme d'habitude cette fois, mais ** je ne pouvais comprendre que "la combinaison d'arbres de décision est une forêt aléatoire" **, alors je l'ai organisée moi-même et * * Le but de cette fois est de vous aider à comprendre "qu'est-ce qu'une forêt aléatoire" et "ce qui doit être fait pour le réglage des paramètres" tout en gardant le contexte à l'esprit **.
De plus, cette fois-ci, O'Reilly [L'apprentissage automatique à partir de Python](https://www.amazon.co.jp/Python%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81] % E3% 82% 8B% E6% A9% 9F% E6% A2% B0% E5% AD% A6% E7% BF% 92-% E2% 80% 95scikit-learn% E3% 81% A7% E5% AD% A6% E3% 81% B6% E7% 89% B9% E5% BE% B4% E9% 87% 8F% E3% 82% A8% E3% 83% B3% E3% 82% B8% E3% 83% 8B% E3% 82% A2% E3% 83% AA% E3% 83% B3% E3% 82% B0% E3% 81% A8% E6% A9% 9F% E6% A2% B0% E5% AD% A6% E7% BF% 92% E3% 81% AE% E5% 9F% BA% E7% A4% 8E-Andreas-C-Muller / dp / 4873117984 / ref = sr_1_4? adgrpid = 79259353864 & dchild = 1 & gclid = Cj0KCQjw3qzzBRDnARIsAECmrypfSaVgzur1vjdrANcvYmfbh5o4vqR0LY6sH-cKX14mFgJ95QpG5sQaAkdAEALw_wcB & hvadid = 358533815035 & hvdev = c & hvlocphy = 1009318 & hvnetw = g & hvqmt = e & hvrand = 15282066364140801380 & hvtargid = kwd-475056195101 & hydadcr = 27269_11561183 & jp-ad-ap = 0 & mots-clés = python% E3% 81% A7% E3% 81% AF% E3 82% 8B% E6% A9% 9F% E6% A2% B0% E5% AD% A6% E7% BF% 92 & qid = 1584146942 & sr = 8-4).
Pour comprendre Random Forest, nous aborderons l'apprentissage d'ensemble.
L'apprentissage d'ensemble est ** un moyen de créer un modèle plus puissant en combinant plusieurs modèles d'apprentissage automatique **.
Il existe de nombreux modèles d'apprentissage automatique tels que «régression logistique», «SVM» et «arbre de décision», mais chacun de ces modèles effectue des prédictions pour les données de manière indépendante.
Cependant, en général, je pense qu'il y a de nombreux cas où une sorte de ** décision majoritaire **, dans laquelle plusieurs personnes se réunissent pour trouver une réponse, produit de meilleurs résultats qu'une personne qui donne une réponse à sa discrétion.
L'apprentissage d'ensemble est exactement cette façon de penser, et c'est une méthode d'apprentissage qui prend une décision finale basée sur les résultats de jugement de plusieurs modèles d'apprentissage automatique. L'image est ci-dessous.
Il existe deux principaux types de méthodes d'apprentissage d'ensemble, «ensachage» et «boosting». Random forest fait des prédictions basées sur cet «ensachage».
C'est une méthode pour entraîner plusieurs modèles en parallèle en utilisant la méthode de ** boot lap **. → Lorsque de nouvelles données entreront, nous prendrons une décision majoritaire pour la classification et une prédiction moyenne pour la régression.
Une méthode d'échantillonnage de certaines données à partir des données originales par ** extraction de restauration **. Dans l'extraction de restauration, les données une fois prises sont également renvoyées aux données d'origine et échantillonnées, de sorte que les mêmes données peuvent être sélectionnées plusieurs fois.
Comment préparer plusieurs modèles et procéder à l'apprentissage en série. Nous construirons le modèle suivant en nous référant aux résultats du modèle créé précédemment.
Les modèles basés sur le boosting ont Adaboost (non mentionné cette fois).
Random Forest est une collection de nombreux arbres de décision légèrement différents basés sur la mise en sac de l'apprentissage d'ensemble **.
Les forêts aléatoires sont un moyen de résoudre ce problème, car l'arbre de décision à lui seul a l'inconvénient d'être surapprentissage.
Comme mentionné dans le bagging, chaque arbre de décision est construit avec chaque donnée surentraînée car plusieurs groupes sont échantillonnés au hasard à partir des données d'origine.
** L'idée est que si vous créez un grand nombre d'arbres de décision qui sont surappris dans différentes directions, vous pouvez réduire le degré de surapprentissage en faisant la moyenne des résultats **.
Illustrons cette idée. ÉTAPE 1: échantillonnez les données de manière aléatoire à partir des données d'origine avec boost lap et créez des groupes de données pour N groupes
ÉTAPE 2: Créez un modèle d'arbre de décision pour chacun des N groupes.
ÉTAPE 3: Faites une prédiction une fois avec le modèle d'arbre de décision de chaque groupe N.
ÉTAPE 4: Prenez un vote majoritaire de N groupes (le rendement est moyen) et faites une prédiction finale.
L'implémentation spécifique avec scicit-learn se fera à partir du suivant, mais je vais vous expliquer comment définir chaque paramètre en premier.
Cependant, en tant que principe, Random Forest est connu pour être capable de produire une précision raisonnablement bonne sans beaucoup de réglage des paramètres (il n'est pas nécessaire de convertir l'échelle telle que la normalisation des données). Par conséquent, cette fois, nous ne l'introduirons que, et dans la prochaine implémentation, nous créerons le modèle avec les paramètres par défaut.
Ici, [Machine learning commençant par Python] introduit au début (https://www.amazon.co.jp/Python%E3%81%A7%E3%81%AF%E3%81%98%E3%82% 81% E3% 82% 8B% E6% A9% 9F% E6% A2% B0% E5% AD% A6% E7% BF% 92-% E2% 80% 95scikit-learn% E3% 81% A7% E5% AD % A6% E3% 81% B6% E7% 89% B9% E5% BE% B4% E9% 87% 8F% E3% 82% A8% E3% 83% B3% E3% 82% B8% E3% 83% 8B % E3% 82% A2% E3% 83% AA% E3% 83% B3% E3% 82% B0% E3% 81% A8% E6% A9% 9F% E6% A2% B0% E5% AD% A6% E7 % BF% 92% E3% 81% AE% E5% 9F% BA% E7% A4% 8E-Andreas-C-Muller / dp / 4873117984 / ref = sr_1_4? adgrpid = 79259353864 & dchild = 1 & gclid = Cj0KCQjw3qzzBRDnARIsAECmrypfSaVgzur1vjdrANcvYmfbh5o4vqR0LY6sH-cKX14mFgJ95QpG5sQaAkdAEALw_wcB & hvadid = 358533815035 & hvdev = c & hvlocphy = 100009318 & hvnetw = g & hvqmt = e & hvrand = 152802066364140801380 & hvtargid = kwd-475056195101 & hydadcr = 27269_11561183 & jp-ad-ap = 0 & mots-clés = python% E3% 81% A7% E3% 81% AF 82% E3% 82% E3 % 8B% E6% A9% 9F% E6% A2% B0% E5% AD% A6% E7% BF% 92 & qid = 1584146942 & sr = 8-4) mentionne «paramètres importants à ajuster» à la page 87 Présentation de n_estimators, max_features.
◆n_estimators Définissez le nombre d'arbres de décision à préparer. C'est le nombre de N de "N données" montrées sur la figure. Plus c'est gros, mieux c'est (l'image est que vous pouvez obtenir un vote majoritaire de nombreuses personnes), mais si vous l'augmentez trop, cela prendra du temps et de la mémoire, donc je pense que ce sera un équilibre avec ce domaine.
◆max_features C'est la première fois que je vais le décrire ici, mais il y a en fait une dernière chose à faire lors de l'échantillonnage des données dans STEP1. Il s'agit de la "sélection du montant de la caractéristique". Toutes les fonctionnalités ne sont pas utilisées pour créer le modèle, et les fonctionnalités sont également attribuées de manière aléatoire lors de la création de l'arbre de décision dans chaque groupe. Définissez le nombre d'entités dans chaque groupe avec max_features.
L'augmentation de max_features devrait rendre chaque modèle d'arbre de décision similaire, tandis que sa diminution entraînera des modèles d'arbre de décision significativement différents, mais trop petit entraînera des arbres de décision qui ne correspondent pas aux données. Je vais finir.
Il est généralement indiqué dans "Machine learning à partir de python" que max_features doit utiliser la valeur par défaut.
Maintenant, implémentons une forêt aléatoire avec scicit-learn.
Utilisez le jeu de données Kickstarter Projects de kaggle. https://www.kaggle.com/kemical/kickstarter-projects
import pandas as pd#Importer des pandas
import datetime#Importer pour le traitement de la date des données originales
from sklearn.model_selection import train_test_split#Pour la division des données
from sklearn.ensemble import RandomForestClassifier#Forêt aléatoire
df = pd.read_csv(r"C:~~\ks-projects-201801.csv")
De ce qui suit, vous pouvez voir qu'il s'agit de l'ensemble de données de (378661, 15).
df.shape
Jetons également un coup d'œil aux données dans .head.
df.head()
Étant donné que nous nous concentrerons cette fois sur la forêt aléatoire, nous omettons les détails, mais comme l'heure de début du recrutement et l'heure de fin du financement du cloud sont dans les données, nous convertirons cela en "jours de recrutement".
df['deadline'] = pd.to_datetime(df["deadline"])
df["launched"] = pd.to_datetime(df["launched"])
df["days"] = (df["deadline"] - df["launched"]).dt.days
Je vais également omettre les détails ici, mais il y a des catégories autres que succès ("réussi") et échec ("échec") pour la variable objective "état", mais cette fois je n'utiliserai les données que pour le succès et l'échec.
df = df[(df["state"] == "successful") | (df["state"] == "failed")]
Remplacez ensuite le succès par 1 et l'échec par 0.
df["state"] = df["state"].replace("failed",0)
df["state"] = df["state"].replace("successful",1)
Avant de créer le modèle, supprimez l'identifiant et le nom dont vous pensez ne pas avoir besoin (cela devrait être conservé, mais cette fois, nous le supprimerons), et les variables que vous ne connaissez qu'après le financement du cloud. ..
df = df.drop(["ID","name","deadline","launched","backers","pledged","usd pledged","usd_pledged_real","usd_goal_real"], axis=1)
Effectuez le traitement des variables catégorielles avec pd.get_dummies.
df = pd.get_dummies(df,drop_first = True)
Commencez par le diviser en données d'entraînement et données de test.
train_data = df.drop("state", axis=1)
y = df["state"].values
X = train_data.values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1234)
clf = RandomForestClassifier(random_state=1234)
clf.fit(X_train, y_train)
print("score=", clf.score(X_test, y_test))
Si vous faites ce qui précède, vous devriez obtenir une précision d'environ 0,638. Si c'est un modèle basique, c'est tout!
Comment était-ce? Ma pensée est: "Je ne peux pas interpréter même si on me montre un code très compliqué depuis le début, donc je ne me soucie pas de la précision une fois, alors essayez d'abord d'implémenter une série de flux de base avec scicit-learn, etc." Je pense que c'est très important.
Cependant, une fois que je m'y suis habitué, je pense qu'il est très important de comprendre de l'arrière-plan comment ils fonctionnent dans les coulisses. Au fur et à mesure que j'en apprends plus, j'aimerais mettre à jour cette forêt aléatoire à un niveau plus profond.
Je pense que de nombreux contenus sont difficiles à comprendre, mais j'espère que cela aidera à approfondir ma compréhension.
Recommended Posts