[PYTHON] J'ai essayé de comparer la précision des modèles d'apprentissage automatique en utilisant kaggle comme thème.

1. Objet

Après avoir appris la programmation de base en python, travaillons sur kaggle! A ce moment-là, parlons du noyau! Je pense qu'il y a beaucoup d'articles et de livres, et en fait, je pense que c'est un moyen de devenir incroyablement puissant.

Cependant, du point de vue d'un vrai débutant, j'ai pensé ** "C'est trop difficile de lire le noyau et je ne comprends pas le sens ..." ** "Non, ce n'est pas une technologie aussi avancée, mais un apprentissage automatique de base pour le moment. Je voulais juste faire un modèle ... "**, et j'ai eu du mal à être moi-même.

Ainsi, dans cet article, dans quelle mesure la précision de divers modèles d'apprentissage automatique changera-t-elle en augmentant progressivement le niveau, comme ** «méthode super-basique» et «méthode légèrement conçue» **? Je souhaite vérifier **. Ce faisant, ** "Je vois, comment créer un modèle d'apprentissage automatique super basique?" "Comment puis-je augmenter un peu plus le niveau?" Que faire ** est le but de cet article.

2. Présentation

(1) Kaggle à utiliser (problème de classification)

Dans mon article sur qiita, j'utilise le jeu de données Kickstarter Projects de kaggle, que je vois souvent. https://www.kaggle.com/kemical/kickstarter-projects

(2) Modèle d'apprentissage automatique à comparer cette fois

J'ai essayé de collectionner des objets orthodoxes.

・ Retour logistique ・ SVM · Arbre de décision ・ Forêt aléatoire ・ Adaboost

(3) Stade de vérification

A: aucun ajustement (par défaut) B: (Uniquement les modèles nécessaires) Régularisation C: (Uniquement les modèles requis) Standardisation D: réglage des hyper paramètres E: sélection des fonctionnalités

Voici un résumé de (2) et (3) et les résultats de précision de tous les modèles qui seront vérifiés ultérieurement.

◆ Comment lire le tableau

Du point de vue, le modèle 1 est la version par défaut de la régression logistique avec une précision de 0,52958, le modèle 2 est la version avec seulement la régression logistique avec une précision de 0,59815, et le modèle 3 est la version avec régularisation et standardisation avec régression logistique. Et la précision est de 0,66181 ...

◆ Remarques

Fondamentalement, on suppose que la précision augmentera au fur et à mesure que le motif progresse dans chaque modèle, mais cette fois, la sélection de la quantité de caractéristiques de E utilise la méthode intégrée. → Veuillez noter que la méthode intégrée est basée sur un modèle linéaire, donc la précision n'augmente pas nécessairement (en fait, il y avait des modèles où il valait mieux ne pas faire E avec des modèles multiples).

◆ Pour les super débutants

Je pense que c'est une bonne idée de regarder d'abord la version A de chaque modèle, puis d'avancer progressivement le modèle pour chaque modèle.

modèle modèle précision
modèle 1 Retour logistique A 0.52958
Motif 2 Retour logistique B 0.59815
Modèle 3 Retour logistique B+C 0.66181
Modèle 4 Retour logistique B+C+D 0.66181
Modèle 5 Retour logistique B+C+D+E 0.66185
Modèle 6 SVM A 0.61935
Modèle 7 SVM C 0.64871
Modèle 8 SVM C+D 0.65393
Modèle 9 SVM C+D+E 0.65066
Modèle 10 Arbre de décision A 0.63727
Modèle 11 Arbre de décision D 0.66376
Modèle 12 Arbre de décision D+E 0.65732
Modèle 13 Forêt aléatoire A 0.64522
Modèle 14 Forêt aléatoire D 0.67762
Modèle 15 Forêt aléatoire D+E 0.66308
Modèle 16 Adaboost A 0.63947
Modèle 17 Adaboost D 0.67426
Modèle 18 Adaboost D+E 0.659367

(4) Référence

Pour chaque modèle d'apprentissage automatique, nous ne le mettrons en œuvre que cette fois, mais nous avons publié une série d'articles qui comprennent le contexte des mathématiques, nous espérons donc que vous pourrez également vous y référer.

[[Machine learning] Comprendre la régression logistique à partir de scikit-learn et des mathématiques] (https://qiita.com/Hawaii/items/ee2a0687ca451fe213be) [[Machine learning] Comprendre SVM à la fois à partir de scikit-learn et des mathématiques] (https://qiita.com/Hawaii/items/4688a50cffb2140f297d) [Apprentissage automatique] Comprendre les arbres de décision de scikit-learn et de mathématiques [[Machine learning] Comprendre la forêt aléatoire] (https://qiita.com/Hawaii/items/5831e667723b66b46fba)

3. Enfin, créez un modèle d'apprentissage automatique

(1) Avant cela

Je vais faire le traitement commun à tous les modèles ici.

(I) Importer

Importons tout cela en même temps. Imaginez faire ce processus commun au début de chaque modèle, puis écrire le code pour chaque modèle successivement.

#numpy,Importer des pandas
import numpy as np
import pandas as pd

#Importer pour effectuer certains traitements sur les données de date
import datetime

#Importation des données d'entraînement et fractionnement des données de test
from sklearn.model_selection import train_test_split

#Importer pour la normalisation
from sklearn.preprocessing import StandardScaler

#Importer pour la vérification de l'exactitude
from sklearn.model_selection import cross_val_score

#Importer pour le réglage des hyper paramètres
from sklearn.model_selection import train_test_split, GridSearchCV

#Importer pour la sélection des fonctionnalités
from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LassoCV

#Importer pour la régression logistique
from sklearn.linear_model import SGDClassifier
from sklearn.metrics import log_loss, accuracy_score, confusion_matrix

#Importer pour SVM
from sklearn.svm import SVC

#Importer pour l'arbre de décision
from sklearn.tree import DecisionTreeClassifier, export_graphviz

#Importer pour Random Forest
from sklearn.ensemble import RandomForestClassifier

#Importer pour Adaboost
from sklearn.ensemble import AdaBoostClassifier

(Ii) Lecture des données


df = pd.read_csv(r"C:~~\ks-projects-201801.csv")

(Iii) Apparence des données

De ce qui suit, vous pouvez voir qu'il s'agit de l'ensemble de données de (378661, 15). Étant donné que la quantité de données est assez importante, les modèles qui prennent beaucoup de temps à traiter sont entraînés à l'aide de certaines de ces données.

df.shape

Jetons également un coup d'œil aux données dans .head.

df.head()

(Iv) Mise en forme des données

◆ Nombre de jours de recrutement

Je vais omettre les détails, mais puisque l'heure de début du recrutement et l'heure de fin du financement cloud sont dans les données, nous allons convertir 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

◆ À propos de la variable objectif

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)

◆ Supprimer les lignes inutiles

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)

◆ Traitement des variables de catégorie

Effectuez le traitement des variables catégorielles avec pd.get_dummies.

df = pd.get_dummies(df,drop_first = True)

(2) Modèles 1 à 5 [Régression logistique]

(I) Motif 1 ~ Par défaut ~

Je souhaite mettre en place une régression logistique sans aucun ajustement.

Commencez par le diviser en données d'entraînement et données de test.

y = df["state"].values
X = df.drop("state", axis=1).values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1234)

Ensuite, créez un modèle pour la forêt aléatoire. La raison pour laquelle je mets un argument dans SGDClassifier en disant que je ne fais rien est que je ne peux pas faire un modèle de régression logistique à moins que la perte ne soit log, et après cela je vérifierai l'exactitude quand il y aura régularisation, donc La pénalité est fixée à aucune ici.

clf = SGDClassifier(loss = "log", penalty = "none",random_state=1234)
clf.fit(X_train,y_train)

Enfin, vérifions l'exactitude avec les données de test.

clf.score(X_test, y_test)

Ensuite, la précision est devenue ** 0,52958 **.

(Ii) Modèle 2-Mise en œuvre de la régularisation uniquement-

Je vais omettre ce qu'est la régularisation ici, mais je vérifierai avec la régularisation L1 et la régularisation L2 si la précision s'améliorera si seule la régularisation est effectuée.

Commencez par le diviser en données d'entraînement et données de test.

y = df["state"].values
X = df.drop("state", axis=1).values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1234)

◆ Régularisation L1 Réglez la pénalité sur l1 et vérifiez la précision.

clf_L1 = SGDClassifier(loss = "log", penalty = "l1", random_state=1234)
clf_L1.fit(X_train,y_train)

clf_L1.score(X_test, y_test)

Ensuite, la précision était de ** 0,52958 **, ce qui était le même qu'auparavant.

◆ Régularisation L2 De même, réglez la pénalité sur l2 et vérifiez la précision.

clf_L2 = SGDClassifier(loss = "log", penalty = "l2", random_state=1234)
clf_L2.fit(X_train,y_train)
clf_L2.score(X_test, y_test)

Ensuite, la précision était de ** 0,59815 **, ce qui était supérieur à celui du motif 1. La régularisation L2 peut être plus appropriée pour ces données.

(Iii) Modèle 3 ~ Régularisation + Mise en œuvre de la normalisation ~

Vérifions quel type de précision sera obtenu en ajoutant un traitement de standardisation à la régularisation ci-dessus. Après avoir effectué le processus de standardisation, nous ajouterons la régularisation L1 et la régularisation L2.

Commencez par le diviser en données d'entraînement et données de test.

y = df["state"].values
X = df.drop("state", axis=1).values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1234)

Ensuite, standardisez. Étant donné que le nombre d'entités est faible cette fois, seuls les objectifs et les jours qui devraient être normalisés sont normalisés, et les colonnes qui ont été traitées avec des variables catégorielles par get_dumiies ne sont pas normalisées. Cependant, il semble qu'il n'y ait pas de problème même si toutes les données sont standardisées (j'ai demandé au professeur du cours d'apprentissage automatique que je suis).

stdsc = StandardScaler()
df["goal"] = stdsc.fit_transform(df[["goal"]].values)
df["days"] = stdsc.fit_transform(df[["days"]].values)

Après cela, le traitement de régularisation L1, le traitement de régularisation L2 et la vérification de l'exactitude sont effectués.

#Régularisation et précision L1
clf_L1 = SGDClassifier(loss = "log", penalty = "l1", random_state=1234)
clf_L1.fit(X_train,y_train)
clf_L1.score(X_test, y_test)

#Régularisation et précision L2

clf_L2 = SGDClassifier(loss = "log", penalty = "l2", random_state=1234)
clf_L2.fit(X_train,y_train)
clf_L2.score(X_test, y_test)

La précision de la régularisation L1 est de ** 0,66181 ** et la précision de la régularisation L2 est de ** 0,65750 **, améliorant la précision immédiatement. Après la normalisation, la régularisation L1 semble être un meilleur match. Ici, je garderai un enregistrement de ** 0,66181 ** de régularisation L1, qui avait une bonne précision.

(Iv) Pattern 4-Regularization + Standardization + Hyper Parameter Tuning-

Effectuons un réglage supplémentaire des hyper paramètres sur le modèle 3. Le réglage des hyper-paramètres fait référence à l'exploration et au choix des valeurs numériques que nous devons décider nous-mêmes pour créer un modèle d'apprentissage automatique.

Ici, nous utiliserons Gridsearch.

Ce serait bien si tous les paramètres pouvaient être recherchés dans chaque plage, mais cela prendrait trop de temps, donc cette fois nous ajusterons la pénalité et l'alpha qui semblent être importants dans le classificateur SGD.

Le premier est le traitement de normalisation + la division des données de formation et des données de test.

#Standardisation
stdsc = StandardScaler()
df["goal"] = stdsc.fit_transform(df[["goal"]].values)
df["days"] = stdsc.fit_transform(df[["days"]].values)

#Répartition des données
y = df["state"].values
X = df.drop("state", axis=1).values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1234)
parameters = {'penalty':['l1', 'l2'], 'alpha':[0.0001,0.001, 0.01, 0.1, 1, 10, 100],'loss':['log']} #Modifier ici
model = SGDClassifier(random_state=1234)
clf = GridSearchCV(model, parameters, cv=3)
clf.fit(X_train, y_train)
print(clf.best_params_)

Cette fois, je voulais comparer la précision de chaque motif indiqué dans le tableau au début, j'ai donc pris soin de ** utiliser GridSearch en incluant la valeur par défaut **. En effet, si la valeur par défaut n'est pas incluse, la comparaison de précision ne sera pas possible.

La pénalité est l1 ou l2, et alpha contient la valeur par défaut de 0,0001, ce qui est assez large. Comme précédemment, si vous ne spécifiez pas la perte dans le journal, ce ne sera pas une régression logistique en premier lieu, spécifiez-le donc dans le journal.

Ensuite, {'alpha': 0.0001, 'loss': 'log', 'penalty': 'l1'} a été affiché, et il a recherché le meilleur paramètre.

Notez que l'alpha de ce meilleur paramètre est en fait exactement la même valeur que la valeur par défaut lorsque vous regardez le site de sklearn **. De plus, dans la régularisation L1 du motif 3, la perte est définie sur log et la pénalité est définie sur l1, donc en théorie, même si une recherche d'hyper paramètre est effectuée, ** les mêmes paramètres que la régularisation L1 du motif 3 sont utilisés. **.

En d'autres termes, continuons en pensant que la précision devrait être de 0,66181, ce qui équivaut à la régularisation L1 du motif 3.

Maintenant, reconstruisons le modèle en utilisant ce meilleur paramètre. Ce qui suit signifie utiliser "** clf.best_paramas_" pour entraîner le classificateur SGD avec les meilleurs paramètres que j'ai mentionnés précédemment.

clf_2 = SGDClassifier(**clf.best_params_,random_state=1234)
clf_2.fit(X_train,y_train)

Enfin, vérifiez la précision avec les données de test.

clf_2.score(X_test, y_test)

Il est devenu ** 0,66181 **, et il est devenu le même système que le modèle 3 comme supposé.

(V) Modèle 5 ~ Régularisation + Standardisation + Réglage Hyper Paramètre + Sélection des fonctionnalités ~

Jusqu'au modèle 4, j'ai créé un modèle avec la quantité de fonctionnalités que j'ai choisie arbitrairement, mais ici, je vais essayer de sélectionner la quantité de fonctionnalités en utilisant la méthode appelée méthode intégrée.

Premièrement, standardisez et divisez les données.

#Standardisation
stdsc = StandardScaler()
df["goal"] = stdsc.fit_transform(df[["goal"]].values)
df["days"] = stdsc.fit_transform(df[["days"]].values)

#Répartition des données
y = df["state"].values
X = df.drop("state", axis=1).values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1234)

Ensuite, nous sélectionnerons le montant de la fonctionnalité par la méthode intégrée.

estimator = LassoCV(normalize = True, cv = 10, random_state = 1234)
sfm = SelectFromModel(estimator, threshold = 1e-5)
sfm.fit(X_train,y_train)

Les fonctionnalités sélectionnées seront écrasées et mises à jour avec les données d'entraînement et les données de test.

X_train_selected = sfm.transform(X_train)
X_test_selected = sfm.transform(X_test)

Vérifiez la précision du classificateur SGD avec les données d'entraînement écrasées (à ce stade, le réglage des hyperparamètres n'a pas encore été effectué).

classifier = SGDClassifier(random_state=1234)
classifier.fit(X_train_selected, y_train)

À partir de là, effectuez le réglage des hyper paramètres. La méthode est fondamentalement la même qu'avant, mais les données d'entraînement (X_train_selected) qui écrasent le contenu de .fit sont utilisées.

parameters = {'penalty':['l1', 'l2'], 'alpha':[0.0001,0.001, 0.01, 0.1, 1, 10, 100],'loss':['log']} 
model = SGDClassifier(random_state=1234)
clf = GridSearchCV(model, parameters, cv=3)
clf.fit(X_train_selected, y_train)
print(clf.best_params_)

Entraînez à nouveau le classificateur SGD avec les meilleurs paramètres que vous avez donnés.

clf_2 = SGDClassifier(**clf.best_params_,random_state=1234)
clf_2.fit(X_train_selected,y_train)

Enfin, vérifiez la précision.

clf_2.score(X_test_selected, y_test)

Avec ** 0,66185 **, nous avons pu obtenir la meilleure précision jamais atteinte.

C'est la fin de la régression logistique. Résumons l'exactitude une fois.

modèle modèle précision
modèle 1 Retour logistique A 0.52958
Motif 2 Retour logistique B 0.59815
Modèle 3 Retour logistique B+C 0.66181
Motif 4 Retour logistique B+C+D 0.66181
Modèle 5 Retour logistique B+C+D+E 0.66185
Modèle 6 SVM A
Modèle 7 SVM C
Modèle 8 SVM C+D
Modèle 9 SVM C+D+E
Modèle 10 Arbre de décision A
Modèle 11 Arbre de décision D
Modèle 12 Arbre de décision D+E
Modèle 13 Forêt aléatoire A
Modèle 14 Forêt aléatoire D
Modèle 15 Forêt aléatoire D+E
Modèle 16 Adaboost A
Modèle 17 Adaboost D
Modèle 18 Adaboost D+E

Passons maintenant à SVM.

(3) Modèles 6-9 [SVM]

J'ai également essayé SVM et j'ai réalisé qu'il était gâché, mais cela prend beaucoup de temps à traiter. Donc, comme la régression logistique, si je construisais un modèle et réglais des hyperparamètres en utilisant toutes les données d'entraînement, je n'aurais pas assez de temps, donc j'ai pris soin de réduire les données.

* Supplément-Estimé combien de temps il faudra pour traiter les données- *

J'ai entraîné toutes les données du premier coup et j'ai constaté à plusieurs reprises que cela ne se terminait pas même si cela prenait des heures, alors j'ai d'abord essayé avec un très petit nombre de données (et de paramètres), et le temps que cela a pris Faire une note du. Donc, je pense qu'il est préférable de démarrer le processus après avoir défini une ligne directrice sur le temps qu'il faudra, car ce montant est environ plusieurs fois plus élevé.

(I) Motif 6 ~ Par défaut ~

J'implémenterai SVM sans aucun ajustement. Commencez par le diviser en données d'entraînement et données de test.

y = df["state"].values
X = df.drop("state", axis=1).values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1234)

Voici les principaux changements que j'ai apportés au traitement des SVM avec d'autres modèles, mais il faut beaucoup de temps pour former les SVM avec toutes les données d'entraînement comme la régression logistique.

Par conséquent, traitons les données d'entraînement qui étaient autrefois divisées en 70% du total, puis traitons 1,5% (= 10,5% de toutes les données) comme des données d'entraînement.

Même avec 1,5%, il a fallu plus de 3 heures pour terminer le processus. ..

#1 à partir des données d'entraînement.Échantillon 50%
X_train_sample = pd.DataFrame(X_train).sample(frac = 0.15, random_state=1234)
y_train_sample = pd.DataFrame(y_train).sample(frac = 0.15, random_state=1234)

#Construction de modèles
clf = SVC(random_state=1234)
clf.fit(X_train_sample, y_train_sample) 

Maintenant que nous avons un modèle, vérifions la précision avec les données de test. Il est important de noter que les données de test ne sont pas réduites de 30% du total, mais la précision est confirmée en utilisant toutes les données de test. C'est parce que je pensais que si le nombre de données de test était réduit uniquement pour SVM, il ne serait pas possible de comparer la précision avec d'autres modèles.

clf.score(X_test,y_test)

La précision était de ** 0,61935 **.

(Ii) Modèle 7-Mise en œuvre de la normalisation uniquement-

Puisque SVM ne nécessite pas de régularisation en soi, il commence par la mise en œuvre de la normalisation.

Tout d'abord, normalisons et divisons les données. Après cela, c'est la même chose que le modèle 6.

#Standardisation
stdsc = StandardScaler()
df["goal"] = stdsc.fit_transform(df[["goal"]].values)
df["days"] = stdsc.fit_transform(df[["days"]].values)

#Répartition des données
y = df["state"].values
X = df.drop("state", axis=1).values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1234)

#1 à partir des données d'entraînement.Échantillon 50%
X_train_sample = pd.DataFrame(X_train).sample(frac = 0.15, random_state=1234)
y_train_sample = pd.DataFrame(y_train).sample(frac = 0.15, random_state=1234)

#Construction de modèles
clf = SVC(random_state=1234)
clf.fit(X_train_sample, y_train_sample)

#Évaluation de la précision
clf.score(X_test, y_test)

La précision est de ** 0,64871 **, ce qui est meilleur que le modèle 6.

(Iii) Modèle 8 ~ Standardisation + Réglage Hyper Paramètre ~

Ensuite, implémentons la normalisation + le réglage des hyper paramètres.

Le premier est la normalisation et la division des données.

stdsc = StandardScaler()
df["goal"] = stdsc.fit_transform(df[["goal"]].values)
df["days"] = stdsc.fit_transform(df[["days"]].values)

y = df["state"].values
X = df.drop("state", axis=1).values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1234)

Ensuite, effectuez le réglage des hyper paramètres. Encore une fois, la recherche en utilisant toutes les données d'entraînement prend beaucoup de temps, donc 3% (= 2,1% du total) des 70% des données d'entraînement sont utilisées pour le réglage des hyper paramètres.

A l'origine, j'aimerais utiliser plus de données pour ajuster les paramètres, mais comme le traitement n'est pas vraiment terminé, j'ai choisi cette valeur.

#Données d'entraînement 3%Échantillonnage
X_train_grid = pd.DataFrame(X_train).sample(frac = 0.03,random_state=1234)
y_train_grid = pd.DataFrame(y_train).sample(frac = 0.03,random_state=1234)

Ensuite, effectuez le réglage des hyper paramètres.

parameters = {'kernel':['linear', 'rbf'], 'C':[0.001, 0.01,0.1,1,10]} #Modifier ici
model = SVC(random_state=1234)
clf = GridSearchCV(model, parameters, cv=2,return_train_score=False)
clf.fit(X_train_grid, y_train_grid)
print(clf.best_params_, clf.best_score_)

Le point qui diffère de la régression logistique est que l'argument cv de GridSearch est défini sur 2 + return_train_score est défini sur False. À l'origine, cv était défini sur 3 et return_train_score n'était pas défini en particulier, mais comme le processus ne se termine pas éternellement, je l'ai vérifié sur le site et l'ai défini.

Jusqu'à présent, nous avons recherché les "paramètres optimaux"! Nous nous entraînerons en utilisant les données d'entraînement avec ce paramètre optimal et en vérifierons l'exactitude avec les données de test.

#1 à partir des données d'entraînement.Échantillon 50%
X_train_sample = pd.DataFrame(X_train).sample(frac = 0.15, random_state=1234)
y_train_sample = pd.DataFrame(y_train).sample(frac = 0.15, random_state=1234)

#Formation modèle
clf = SVC(**clf.best_params_,random_state=1234)
clf.fit(X_train_sample, y_train_sample) 

#Confirmer l'exactitude avec les données de test
clf.score(X_test, y_test)

La précision était de ** 0,65393 **.

(Iv) Pattern 9-Standardization + Hyper réglage des paramètres + Sélection des fonctionnalités-

Enfin, ajoutez une sélection de fonctionnalités.

Encore une fois, les données d'apprentissage sont divisées en motif 8 pour la sélection des fonctionnalités, veillez donc à ne pas confondre les données d'apprentissage que vous utilisez pour quoi.

#Standardisation
stdsc = StandardScaler()
df["goal"] = stdsc.fit_transform(df[["goal"]].values)
df["days"] = stdsc.fit_transform(df[["days"]].values)

#Répartition des données
y = df["state"].values
X = df.drop("state", axis=1).values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1234)

#Sélection de fonctionnalité
estimator = LassoCV(normalize = True, cv = 10, random_state = 1234)
sfm = SelectFromModel(estimator, threshold = 1e-5)
sfm.fit(X_train,y_train)

#Écraser les données d'entraînement avec les fonctionnalités sélectionnées
X_train_selected = sfm.transform(X_train)
X_test_selected = sfm.transform(X_test)

C'est la sélection des fonctionnalités. Ensuite, un réglage d'hyper paramètre est effectué sur la base de la quantité de caractéristiques sélectionnée.

#3 des données d'entraînement écrasées par les fonctionnalités sélectionnées pour le réglage des hyperparamètres%Échantillonnage
X_train_grid = pd.DataFrame(X_train_selected).sample(frac = 0.03,random_state=1234)
y_train_grid = pd.DataFrame(y_train).sample(frac = 0.03,random_state=1234)

#Réglage des hyper paramètres
parameters = {'kernel':['linear', 'rbf'], 'C':[0.001, 0.01,0.1,1,10]} #Modifier ici
model = SVC(random_state=1234)
clf = GridSearchCV(model, parameters, cv=2,return_train_score=False)
clf.fit(X_train_grid, y_train_grid)
print(clf.best_params_, clf.best_score_)

À ce stade, le réglage des hyper-paramètres à l'aide des fonctionnalités sélectionnées par la méthode intégrée est terminé et les meilleurs paramètres ont été déterminés.

Entraînons le modèle SVM avec les données d'entraînement (X_train_selected) écrasées avec cette quantité de fonctionnalité sélectionnée et les meilleurs paramètres avec 1,5% des données d'entraînement de 70% du total.

#Échantillon de 30% des données d'entraînement écrasées
X_train_sample = pd.DataFrame(X_train_selected).sample(frac = 0.15, random_state=1234)
y_train_sample = pd.DataFrame(y_train).sample(frac = 0.15, random_state=1234)

#Construction du modèle avec 30% supplémentaires de données d'échantillon provenant de 70% des données d'entraînement
clf = SVC(**clf.best_params_,random_state=1234)
clf.fit(X_train_sample, y_train_sample) 

#Évaluation de la précision avec les données de test
clf.score(X_test_selected, y_test)

La précision est de ** 0,65066 **.

Ici, résumons à nouveau la précision.

modèle modèle précision
modèle 1 Retour logistique A 0.52958
Motif 2 Retour logistique B 0.59815
Modèle 3 Retour logistique B+C 0.66181
Motif 4 Retour logistique B+C+D 0.66181
Modèle 5 Retour logistique B+C+D+E 0.66185
Modèle 6 SVM A 0.61935
Modèle 7 SVM C 0.64871
Modèle 8 SVM C+D 0.65393
Modèle 9 SVM C+D+E 0.65066
Modèle 10 Arbre de décision A
Modèle 11 Arbre de décision D
Modèle 12 Arbre de décision D+E
Modèle 13 Forêt aléatoire A
Modèle 14 Forêt aléatoire D
Modèle 15 Forêt aléatoire D+E
Modèle 16 Adaboost A
Modèle 17 Adaboost D
Modèle 18 Adaboost D+E

(4) Modèles 10-12 [Arbre de décision]

Vient ensuite l'arbre de décision.

(I) Motif 10 ~ Par défaut ~

Divisez les données.

y = df["state"].values
X = df.drop("state", axis=1).values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1234)

Construisez un modèle de l'arbre de décision et vérifiez l'exactitude.

clf = DecisionTreeClassifier(random_state=1234)
clf = clf.fit(X_train, y_train)

clf.score(X_test, y_test)

La précision est maintenant de ** 0,63727 **.

(Ii) Motif 11 ~ Réglage des hyper paramètres ~

L'arbre de décision ne nécessite ni régularisation ni standardisation, nous commençons donc par le réglage des hyperparamètres.

Le premier est la division des données.

y = df["state"].values
X = df.drop("state", axis=1).values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1234)

Ensuite, effectuez une recherche de grille pour le réglage des hyper paramètres. Après cela, nous allons construire le modèle avec les meilleurs paramètres et vérifier l'exactitude des données de test.

#GridSearch
parameters = {'criterion':['gini', 'entropy'], 'max_depth':[i for i in range(1, 11)],'max_features':['auto','sqrt','log2'], 'min_samples_leaf':[i for i in range(1, 11)],'random_state':[1234]} #Modifier ici
model = DecisionTreeClassifier(random_state=1234)
clf = GridSearchCV(model, parameters, cv=3)
clf.fit(X_train, y_train)
print(clf.best_params_, clf.best_score_)

#Construisez un modèle avec les meilleurs paramètres
clf = DecisionTreeClassifier(**clf.best_params_,random_state=1234)
clf.fit(X_train, y_train)

#Vérification de l'exactitude
clf.score(X_test,y_test)

La précision était de ** 0,66376 **.

(Iii) Pattern 12 - Réglage des paramètres Hyper + sélection de fonctionnalités -

Comme toujours, commencez par le partitionnement des données.

#Répartition des données
y = df["state"].values
X = df.drop("state", axis=1).values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1234)

#Sélection de fonctionnalité
estimator = LassoCV(normalize = True, cv = 10, random_state = 1234)
sfm = SelectFromModel(estimator, threshold = 1e-5)
sfm.fit(X_train,y_train)

#Écraser les données d'entraînement avec les fonctionnalités sélectionnées
X_train_selected = sfm.transform(X_train)
X_test_selected = sfm.transform(X_test)

#Réglage des hyper paramètres
parameters = {'criterion':['gini', 'entropy'], 'max_depth':[i for i in range(1, 11)],'max_features':['auto','sqrt','log2'], 'min_samples_leaf':[i for i in range(1, 11)],'random_state':[1234]}
model = DecisionTreeClassifier(random_state=1234)
clf = GridSearchCV(model, parameters, cv=3)
clf.fit(X_train_selected, y_train)
print(clf.best_params_, clf.best_score_)

#Former les apprenants avec des paramètres optimaux
clf_2 = DecisionTreeClassifier(**clf.best_params_,random_state=1234)
clf_2.fit(X_train_selected,y_train)

#Confirmer l'exactitude avec les données de test
clf_2.score(X_test_selected, y_test)

La précision est de ** 0,65732 **.

modèle modèle précision
modèle 1 Retour logistique A 0.52958
Motif 2 Retour logistique B 0.59815
Modèle 3 Retour logistique B+C 0.66181
Modèle 4 Retour logistique B+C+D 0.66181
Modèle 5 Retour logistique B+C+D+E 0.66185
Modèle 6 SVM A 0.61935
Modèle 7 SVM C 0.64871
Modèle 8 SVM C+D 0.65393
Modèle 9 SVM C+D+E 0.65066
Modèle 10 Arbre de décision A 0.63727
Modèle 11 Arbre de décision D 0.66376
Modèle 12 Arbre de décision D+E 0.65732
Modèle 13 Forêt aléatoire A
Modèle 14 Forêt aléatoire D
Modèle 15 Forêt aléatoire D+E
Modèle 16 Adaboost A
Modèle 17 Adaboost D
Modèle 18 Adaboost D+E

(5) Modèles 13 à 15 [Random Forest]

(I) Motif 13 ~ Par défaut ~

Divisez les données.

y = df["state"].values
X = df.drop("state", axis=1).values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1234)

La construction du modèle de forêt aléatoire est effectuée et la vérification de l'exactitude est effectuée.

clf = RandomForestClassifier(random_state=1234)
clf.fit(X_train, y_train)

clf.score(X_test, y_test)

La précision est maintenant de ** 0,64522 **.

(Ii) Motif 14 ~ Réglage des hyper paramètres ~

Tout comme l'arbre de décision, les forêts aléatoires ne nécessitent ni régularisation ni standardisation.

Comme précédemment, le réglage des hyper paramètres est effectué après la division des données. La différence avec les modèles précédents est que la plage de recherche est légèrement réduite (chaque index est recherché dans une plage de 1 à 5). Cela seul a pris environ 35 minutes, donc j'ai senti qu'il serait difficile de partitionner le processus en tenant compte de mon propre temps si j'étendais davantage la gamme, alors j'ai réduit la gamme.

#Répartition des données
y = df["state"].values
X = df.drop("state", axis=1).values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1234)

#Réglage des hyper paramètres
parameters = {'max_depth':[2,4,6,None],  'min_samples_leaf':[1,3,5],'min_samples_split':[2,4,6]}
model = RandomForestClassifier(random_state=1234)
clf = GridSearchCV(model, parameters, cv=3,)
clf.fit(X_train, y_train)
print(clf.best_params_, clf.best_score_)

#Former les apprenants avec des paramètres optimaux
clf = RandomForestClassifier(**clf.best_params_,random_state=1234)
clf.fit(X_train, y_train)

#Confirmer l'exactitude avec les données de test
clf.score(X_test, y_test)

Comme il a fallu beaucoup de temps pour affiner les valeurs numériques dans la recherche d'hyper paramètre, nous sommes passés à la recherche uniquement de nombres pairs ou impairs en supposant que les valeurs par défaut sont incluses. La précision était de ** 0,67762 **.

(Iii) Pattern 15 - Réglage des paramètres Hyper + sélection des fonctionnalités -

#Répartition des données
y = df["state"].values
X = df.drop("state", axis=1).values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1234)

#Sélection de fonctionnalité
estimator = LassoCV(normalize = True, cv = 10, random_state = 1234)
sfm = SelectFromModel(estimator, threshold = 1e-5)
sfm.fit(X_train,y_train)

#Écraser les données d'entraînement avec les fonctionnalités sélectionnées
X_train_selected = sfm.transform(X_train)
X_test_selected = sfm.transform(X_test)

#Réglage des hyper paramètres
parameters = {'max_depth':[2,4,6,None],  'min_samples_leaf':[1,3,5],'min_samples_split':[2,4,6]}
model = RandomForestClassifier(random_state=1234)
clf = GridSearchCV(model, parameters, cv=3,)
clf.fit(X_train_selected, y_train)
print(clf.best_params_, clf.best_score_)

#Former les apprenants avec des paramètres optimaux
clf = RandomForestClassifier(**clf.best_params_,random_state=1234)
clf.fit(X_train_selected, y_train)

#Confirmer l'exactitude avec les données de test
clf.score(X_test_selected, y_test)

La précision est maintenant de ** 0,66308 **.

Vérifions à nouveau l'exactitude.

modèle modèle précision
modèle 1 Retour logistique A 0.52958
Motif 2 Retour logistique B 0.59815
Modèle 3 Retour logistique B+C 0.66181
Modèle 4 Retour logistique B+C+D 0.66181
Modèle 5 Retour logistique B+C+D+E 0.66185
Modèle 6 SVM A 0.61935
Modèle 7 SVM C 0.64871
Modèle 8 SVM C+D 0.65393
Modèle 9 SVM C+D+E 0.65066
Modèle 10 Arbre de décision A 0.63727
Modèle 11 Arbre de décision D 0.66376
Modèle 12 Arbre de décision D+E 0.65732
Modèle 13 Forêt aléatoire A 0.64522
Modèle 14 Forêt aléatoire D 0.67762
Modèle 15 Forêt aléatoire D+E 0.66308
Modèle 16 Adaboost A
Modèle 17 Adaboost D
Modèle 18 Adaboost D+E

(6) Modèles 16-18 [Adaboost]

(I) Motif 16 ~ Par défaut ~

Divisez les données.

#Répartition des données
y = df["state"].values
X = df.drop("state", axis=1).values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1234)

Nous construisons un modèle d'Adaboost et vérifions son exactitude.

clf = AdaBoostClassifier(DecisionTreeClassifier(random_state=1234))
clf.fit(X_train, y_train)

clf.score(X_test, y_test)

La précision est maintenant de ** 0,63947 **.

(Ii) Motif 17 ~ Réglage des hyper paramètres ~

#Répartition des données
y = df["state"].values
X = df.drop("state", axis=1).values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1234)

#Réglage des hyper paramètres
parameters = {'learning_rate':[0.1,0.5,1.0]}
model = AdaBoostClassifier(random_state=1234)
clf = GridSearchCV(model, parameters, cv=3,)
clf.fit(X_train, y_train)
print(clf.best_params_, clf.best_score_)

#Former les apprenants avec des paramètres optimaux
clf = AdaBoostClassifier(**clf.best_params_,random_state=1234)
clf.fit(X_train, y_train)

#Confirmer l'exactitude avec les données de test
clf.score(X_test, y_test)

La précision était de ** 0,67426 **.

(Iii) Pattern 18 - Réglage des paramètres Hyper + sélection des fonctionnalités

#Répartition des données
y = df["state"].values
X = df.drop("state", axis=1).values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1234)

#Sélection de fonctionnalité
estimator = LassoCV(normalize = True, cv = 10, random_state = 1234)
sfm = SelectFromModel(estimator, threshold = 1e-5)
sfm.fit(X_train,y_train)

#Écraser les données d'entraînement avec les fonctionnalités sélectionnées
X_train_selected = sfm.transform(X_train)
X_test_selected = sfm.transform(X_test)

#Réglage des hyper paramètres
parameters = {'learning_rate':[0.1,0.5,1.0]}
model = AdaBoostClassifier(random_state=1234)
clf = GridSearchCV(model, parameters, cv=3)
clf.fit(X_train_selected, y_train)
print(clf.best_params_, clf.best_score_)

#Former les apprenants avec des paramètres optimaux
clf = AdaBoostClassifier(**clf.best_params_,random_state=1234)
clf.fit(X_train_selected, y_train)

#Confirmer l'exactitude avec les données de test
clf.score(X_test_selected, y_test)

La précision était de ** 0,659367 **.

modèle modèle précision
modèle 1 Retour logistique A 0.52958
Motif 2 Retour logistique B 0.59815
Modèle 3 Retour logistique B+C 0.66181
Modèle 4 Retour logistique B+C+D 0.66181
Modèle 5 Retour logistique B+C+D+E 0.66185
Modèle 6 SVM A 0.61935
Modèle 7 SVM C 0.64871
Modèle 8 SVM C+D 0.65393
Modèle 9 SVM C+D+E 0.65066
Modèle 10 Arbre de décision A 0.63727
Modèle 11 Arbre de décision D 0.66376
Modèle 12 Arbre de décision D+E 0.65732
Modèle 13 Forêt aléatoire A 0.64522
Modèle 14 Forêt aléatoire D 0.67762
Modèle 15 Forêt aléatoire D+E 0.66308
Modèle 16 Adaboost A 0.63947
Modèle 17 Adaboost D 0.67426
Modèle 18 Adaboost D+E 0.659367

4. Conclusion

Qu'as-tu pensé.

Étonnamment, je pense qu'il y a peu de sites qui introduisent des méthodes de création de modèles super basiques, et je pense toujours: "Je ne veux pas connaître des choses aussi avancées, je veux juste créer un modèle une fois!" J'ai fait.

Cet article se concentre sur mes propres problèmes, j'espère donc qu'il aidera à approfondir ma compréhension.

Recommended Posts

J'ai essayé de comparer la précision des modèles d'apprentissage automatique en utilisant kaggle comme thème.
J'ai essayé de compresser l'image en utilisant l'apprentissage automatique
[Apprentissage automatique] J'ai essayé de résumer la théorie d'Adaboost
J'ai essayé de comprendre attentivement la fonction d'apprentissage dans le réseau de neurones sans utiliser la bibliothèque d'apprentissage automatique (première moitié)
J'ai essayé l'histoire courante de l'utilisation du Deep Learning pour prédire la moyenne Nikkei
J'ai essayé de prédire la présence ou l'absence de neige par apprentissage automatique.
J'ai essayé de notifier la mise à jour de "Devenir romancier" en utilisant "IFTTT" et "Devenir un romancier API"
J'ai essayé d'utiliser Tensorboard, un outil de visualisation pour l'apprentissage automatique
[TF] J'ai essayé de visualiser le résultat de l'apprentissage en utilisant Tensorboard
Application correspondante, j'ai essayé de prendre des statistiques de personnes fortes et j'ai essayé de créer un modèle d'apprentissage automatique
J'ai essayé de vérifier la classification yin et yang des membres hololive par apprentissage automatique
J'ai essayé d'automatiser la construction d'un environnement pratique à l'aide de l'API SoftLayer d'IBM Cloud
J'ai essayé d'obtenir une base de données sur les courses de chevaux en utilisant Pandas
J'ai essayé d'obtenir l'index de la liste en utilisant la fonction énumérer
J'ai essayé de créer une expression régulière de "temps" en utilisant Python
J'ai essayé de créer une expression régulière de "date" en utilisant Python
J'ai essayé d'obtenir une liste de noms AMI en utilisant Boto3
[Kaggle] J'ai fait une collection de problèmes en utilisant le didacticiel Titanic
[Bouclier d'épée Pokémon] J'ai essayé de visualiser la base de jugement de l'apprentissage en profondeur en utilisant la classification des trois familles comme exemple
[Kaggle] J'ai essayé l'apprentissage d'ensemble avec LightGBM
J'ai essayé de créer Othello AI avec tensorflow sans comprendre la théorie de l'apprentissage automatique ~ Introduction ~
J'étais frustré par Kaggle, alors j'ai essayé de trouver une bonne propriété locative en grattant et en apprentissage automatique
J'ai essayé de créer Othello AI avec tensorflow sans comprendre la théorie de l'apprentissage automatique ~ Implémentation ~
J'ai essayé de transformer l'image du visage en utilisant sparse_image_warp de TensorFlow Addons
J'ai essayé d'obtenir les résultats de Hachinai en utilisant le traitement d'image
J'ai essayé d'appeler l'API de prédiction du modèle d'apprentissage automatique de WordPress
J'ai essayé d'améliorer la précision de mon propre réseau neuronal
J'ai essayé de classer les accords de guitare en temps réel en utilisant l'apprentissage automatique
J'ai essayé d'extraire et d'illustrer l'étape de l'histoire à l'aide de COTOHA
J'ai essayé d'analyser la négativité de Nono Morikubo. [Comparer avec Posipa]
J'ai essayé de visualiser le modèle avec la bibliothèque d'apprentissage automatique low-code "PyCaret"
J'ai essayé d'effectuer une analyse de cluster de clients à l'aide des données d'achat
J'ai essayé d'afficher la valeur d'altitude du DTM dans un graphique
En utilisant COTOHA, j'ai essayé de suivre le cours émotionnel de la course aux meros.
J'ai essayé de vérifier le résultat du test A / B avec le test du chi carré
J'ai essayé l'histoire courante de prédire la moyenne Nikkei à l'aide du Deep Learning (backtest)
[Fabric] J'étais accro à l'utilisation de booléen comme argument, alors notez les contre-mesures.
(Apprentissage automatique) J'ai essayé de comprendre attentivement l'algorithme EM dans la distribution gaussienne mixte avec l'implémentation.
J'ai essayé de comprendre attentivement la fonction d'apprentissage dans le réseau de neurones sans utiliser la bibliothèque d'apprentissage automatique (deuxième moitié)
Django super introduction par les débutants Python! Partie 2 J'ai essayé d'utiliser les fonctions pratiques du modèle
J'ai essayé de créer Othello AI avec tensorflow sans comprendre la théorie de l'apprentissage automatique ~ Battle Edition ~
J'ai essayé de corriger la forme trapézoïdale de l'image
J'ai essayé d'utiliser le filtre d'image d'OpenCV
J'ai créé un jeu ○ ✕ avec TensorFlow
J'ai essayé de vectoriser les paroles de Hinatazaka 46!
J'ai essayé de prédire la détérioration de la batterie lithium-ion en utilisant le SDK Qore
J'ai essayé de notifier la mise à jour de "Hameln" en utilisant "Beautiful Soup" et "IFTTT"
[Python] J'ai essayé de juger l'image du membre du groupe d'idols en utilisant Keras
[Python] Deep Learning: J'ai essayé d'implémenter Deep Learning (DBN, SDA) sans utiliser de bibliothèque.
[Azure] J'ai essayé de créer une machine virtuelle Linux avec Azure de Microsoft Learn
J'ai essayé de prédire l'évolution de la quantité de neige pendant 2 ans par apprentissage automatique
J'ai essayé d'implémenter diverses méthodes d'apprentissage automatique (modèle de prédiction) en utilisant scicit-learn
J'ai essayé de traiter et de transformer l'image et d'élargir les données pour l'apprentissage automatique
[Python] J'ai essayé d'obtenir le nom du type sous forme de chaîne de caractères à partir de la fonction type
J'ai fait un script pour enregistrer la fenêtre active en utilisant win32gui de Python
J'ai essayé de créer un modèle avec l'exemple d'Amazon SageMaker Autopilot
J'ai essayé de comparer la précision de la classification des phrases BERT japonaises et japonaises Distil BERT avec PyTorch et introduction de la technique d'amélioration de la précision BERT