https://ift.tt/2PUtYFJ
Le langage de programmation Python gagne en popularité parmi les SEO pour sa facilité d’utilisation pour automatiser les tâches quotidiennes et routinières. Il peut gagner du temps et générer un apprentissage automatique sophistiqué pour résoudre des problèmes plus importants qui peuvent aider votre marque et votre carrière. En plus des automatisations, cet article aidera ceux qui veulent en savoir plus sur la science des données et comment Python peut aider.
Dans l’exemple suivant, j’utilise un ensemble de données de commerce électronique pour créer un modèle de régression. J’explique également comment déterminer si le modèle révèle quelque chose de statistiquement significatif et comment les valeurs aberrantes peuvent fausser ses résultats.
J’utilise des blocs-notes Python 3 et Jupyter pour générer des graphiques et des équations avec régression linéaire dans Données Kaggle J’ai vérifié les corrélations et construit un modèle d’apprentissage automatique de base avec cet ensemble de données. Avec cette configuration, j’ai maintenant une équation pour prédire ma variable cible.
Avant de construire mon modèle, je veux prendre du recul pour proposer une définition facile à comprendre de la régression linéaire et pourquoi l’analyse des données est vitale. [19659005] Qu’est-ce que la régression linéaire?
La régression linéaire est un algorithme d’apprentissage automatique de base qui est utilisé pour prédire une variable en fonction de sa relation linéaire entre d’autres variables indépendantes. Regardons un simple graphique de régression linéaire:
Si vous connaissez l’équation ici, vous pouvez également connaître les valeurs de y par rapport aux valeurs de x. & # 39; & # 39; à & # 39; & # 39; est le coefficient de & # 39; & # 39; x & # 39; & # 39; ainsi que la pente de la ligne, & # 39; & # 39; b & # 39; & # 39; est d’intercepter, ce qui signifie que lorsque x = 0, b = y.
Mon ensemble de données de commerce électronique
J’ai utilisé cet ensemble de données de Kaggle . Il n’est pas très compliqué ni détaillé, mais il suffit d’étudier le concept de régression linéaire.
Si vous êtes nouveau et n’avez pas utilisé Jupyter Notebook auparavant, voici un petit conseil:
- Démarrez le terminal et tapez cette commande: jupyter notebook
Une fois entrée, cette commande démarrera automatiquement votre navigateur Web par défaut avec un nouveau bloc-notes. Cliquez sur Nouveau et Python 3.
Il est maintenant temps d’utiliser des codes Python sophistiqués.
montant matplotlib.pyplot en tant que plt
montant numpy en tant que np
montant pandas en tant que pd
à partir de sklearn.linear_model import LinearRegression
à partir de sklearn.model_selection import train_test_split [194590atststs
importez statsmodels.api sous forme de sm
à partir de statsmodels.tools.eval_measures importez mse, rmse [mnss19]
pd.options.display.float_format = & # 39; {: .5f} & # 39;. Format
import warnings
import maths
import scipy.stats as stats
import scipy
from sklearn.preprocessing import scale
warnings.filterwarnings (& # 39; ignore & # 39 ;)
df = pd.read_csv ("Ecom_Customers.csv")
df.head ()
Ma variable cible sera Montant annuel dépensé et j’essaierai de trouver sa relation entre Autres variables Ce serait formidable si je pouvais dire que les utilisateurs dépenseront autant, par exemple, si Le temps dans l’application augmente d’une minute de plus. C’est le principal objectif de l’étude.
- Analyse des données exploratoires
Commençons par vérifier la carte thermique de corrélation:
df_kor = df.corr ()
plt.figure (figsize = (10,10) )
sns.heatmap (df_kor, vmin = -1, vmax = 1, cmap = "viridis", annot = True, largeur de ligne = 0,1)
Cette carte thermique montre les corrélations entre chaque variable donnant un poids de – 1 à +1.
Les violets signifient une corrélation négative, les jaunes signifient une corrélation positive et approchant 1 ou -1 signifie que vous avez quelque chose d’important là-bas, analysez-le. Par exemple:
- La durée de l’adhésion a une corrélation positive et élevée avec Montant annuel dépensé. (81%)
- Temps d’application a également une corrélation mais pas puissante comme Durée de l’adhésion. (50%)
Examinons ces relations en détail. Mon intrigue préférée est sns.pairplot . Une seule ligne de code et vous verrez toutes les distributions.
sns.pairplot (df)
Ce graphique montre toutes les distributions entre chaque variable, dessine tous les graphiques pour vous. Pour comprendre les données qu’ils contiennent, vérifiez les noms des axes gauche et inférieur. (S’ils sont identiques, vous verrez un simple graphique à barres de distribution).
Regardez les graphiques de dernière ligne, Montant annuel dépensé (ma cible sur l’axe de gauche) par rapport à d’autres variables. [19659002] La durée de l’adhésion a une linéarité vraiment parfaite, il est tellement évident que si je peux fidéliser les clients, ils dépenseront plus! Mais combien? Y a-t-il un nombre ou un coefficient pour le spécifier? Pouvons-nous le prévoir? Nous allons le résoudre.
Avant de construire un modèle, vous devez vérifier la présence de cellules vides dans votre ensemble de données. Il n’est pas possible de continuer avec ces valeurs NaN car de nombreux algorithmes d’apprentissage automatique ne prennent pas en charge les données avec eux.
Voici mon code pour voir les valeurs manquantes:
df.isnull (). Sum ()
isnull () détecte les valeurs de NaN et sum () les compte.
Je n’ai pas de valeurs NaN, ce qui est bien. Si je l’avais fait, j’aurais dû les remplir ou les retirer.
Par exemple, pour éliminer toutes les valeurs de NaN, utilisez ceci:
df.dropna (inplace = True)
Pour terminer, vous pouvez utiliser fillna ():
] df ["Time on App"] .fillna (df ["Time on App"] .mean (), inplace = True)
Ma suggestion ici est de lire cet excellent article sur la façon de gérer les valeurs perdues dans leur ensemble des données. C’est un autre problème à résoudre et vous avez besoin d’approches différentes si vous les avez.
Création d’un modèle de régression linéaire
Jusqu’à présent, j’ai exploré en détail l’ensemble de données et je me suis familiarisé avec celui-ci. Il est maintenant temps de créer le modèle et de voir si je peux prédire Montant annuel dépensé.
Définissons X et Y. Je vais d’abord ajouter toutes les autres variables à X et analyser les résultats plus tard. [19659002] Y = df ["Yearly Amount Spent"]
X = df [[ “Length of Membership”, “Time on App”, “Time on Website”, ‘Avg. Session Length’]]
Ensuite, je diviserai mon ensemble de données en données de formation et de test, ce qui signifie que je sélectionnerai au hasard 20% des données et les séparerai du données d’entraînement (test_size affiche le pourcentage des données de test – 20%) (Si vous ne spécifiez pas random_state dans votre code, chaque fois que vous exécutez (exécutez) votre code, une nouvelle valeur aléatoire est générée et les ensembles de données d’entraînement et de test auraient des valeurs différentes à chaque fois.)
X_train, X_test, y_train, y_test = train_test_split (X, Y, test_size = 0.2, random_state = 465)
print (& # 39; Training Data Nombre: {} & # 39;. Format (X_train.shape [0]))
print (& # 39; Test data count: {} & # 39;. Format (X_test.shape [0]) )
Maintenant, construisons le modèle: [19659002] X_train = sm.add_constant (X_train)
results = sm.OLS (y_train, X_train) .fit ()
results.summary ()
Compréhension des résultats du modèle: est-ce statistiquement significatif
Alors, que signifient vraiment tous ces chiffres?
Avant de continuer, il vaudra mieux expliquer ces termes statistiques de base ici car je déciderai si mon modèle est suffisant ou non en regardant ces chiffres.
La valeur P ou la valeur de probabilité montre une signification statistique. Supposons que vous ayez l’hypothèse que le CTR moyen de vos mots clés de marque est de 70% ou plus et que sa valeur p est de 0,02. Cela signifie qu’il y a 2% de chances que vous voyiez les CTR de vos mots clés de marque en dessous de % 70. Est-ce statistiquement significatif? Généralement, 0,05 est utilisé pour la limite maximale (niveau de confiance de 95%), donc s’il a une valeur p inférieure à 0,05, oui! C’est important. Plus la valeur de p est petite, meilleurs sont ses résultats!
Voyons maintenant le tableau récapitulatif. Mes 4 variables ont des valeurs de p qui montrent leurs relations, qu’elles soient significatives ou insignifiantes avec Montant annuel dépensé . Comme vous pouvez le voir, L’heure sur le site Web est statistiquement insignifiante avec elle car sa valeur de p est de 0,180. Par conséquent, il vaudra mieux le laisser tomber.
- Qu’est-ce que R au carré et R au carré?
R au carré est une métrique simple mais puissante qui montre à quel point la variance est expliquée par le modèle. Comptez toutes les variables que vous avez définies dans X et donnez un pourcentage d’explication. C’est quelque chose comme les capacités de votre modèle.
Ajusté R au carré est également similaire au R au carré mais ne compte que les variables statistiquement significatives. C’est pourquoi il est préférable de regarder en permanence le carré R ajusté.
Dans mon modèle, 98,4% de la variance peut être expliquée, ce qui est vraiment élevé.
Ce sont des coefficients des variables qui nous donnent l’équation du modèle.
Alors c’est fini? Non! J’ai Temps sur le site Web variable dans mon modèle qui est statistiquement non significative.
Maintenant, je vais construire un autre modèle et publier L’heure sur le site Web variable:
X2 = df [["Length of Membership", "Time on App", 'Avg. Session Length']]
X2_train, X2_test, y2_train, y2_test = train_test_split (X2, Et, test_size = 0,2, random_state = 465)
print (& # 39; Training data count: & # 39;, X2_train.shape [0])
print (& # 39; Counting data test :: & # 39;, X2_test.shape [0]) [19659063] X2_train = sm.add_constant (X2_train)
results2 = sm.OLS (y2_train, X2_train) .fit ()
results2.summary ( )
R au carré est toujours bon et je n’ai pas de variable dont la valeur p est supérieure à 0,05.
Regardons le tableau des modèles ici:
X2_test = sm.add_constant (X2_test)
and2_preds = results2.predict (X2_test)
plt.figure (dpi = 75)
plt .scatter (y2_test, y2_preds)
plt.plot (y2_test, y2_test, color = « red »)
plt.xlabel (« Scores réels », fontdict = ex_font)
plt.ylabel (« Scores estimés « , fontdict = ex_font)
plt.title ( » Modèle: Scores réels vs estimés « , fontdict = header_font)
plt.show ()
Il semble que je prédise de très bonnes valeurs! Les scores et prévisions réels ont une linéarité presque parfaite.
Enfin, je vais vérifier les erreurs.
Lors de la construction de modèles, les comparer et décider lequel est le meilleur est une étape cruciale. Vous devriez essayer beaucoup de choses, puis analyser les résumés. Supprimez certaines variables, ajoutez-les ou multipliez-les et réessayez. Après avoir terminé la série d’analyses, vous vérifierez les valeurs de p, les erreurs et R au carré. Le meilleur modèle aura:
- Valeurs P inférieures à 0,05
- Erreurs mineures
- R au carré le plus élevé
Examinons maintenant les erreurs:
print ("Erreur absolue moyenne (MAE): {} ". Format (mean_absolute_error (y2_test, y2_preds)))
print (" Erreur dans le carré du milieu (MSE): {} ". Format (mse (y2_test, y2_preds)))
print (" Erreur racine moyenne quadratique (RMSE): {} ". Format (rmse (y2_test, y2_preds)))
print (" Mean quadratic error (RMSE): {} ". Format (rmse (y2_test, y2_preds))))
print ("Erreur absolue moyenne de perc. (MAPE): {}". Format (np.mean (np.abs ((y2_test - y2_preds) / y2_test)) * 100))
Si vous voulez savoir ce que MSE, RMSE ou MAPE est, vous pouvez lire cet article .
Ce sont tous des calculs d’erreurs différents et maintenant, nous allons nous concentrer sur les plus petits lorsque nous comparons différents modèles.
Ensuite, afin de comparer mon modèle avec un autre, je vais créer un autre modèle qui comprend Durée de l’adhésion et Durée d’application uniquement .
X3 = df [['Length of Membership', 'Time on App']]
Y = df ['Yearly Amount Spent']
X3_train, X3_test, y3_train, y3_test = train_test_split (X3, Y, test_size = 0,2, random_state = 465) [196590X3_train=smadd_constant(X3_train)
results3 = sm.OLS (y3_train, X3_train) .19 (1945] results3.summary ()
X3_test = sm.add_constant (X3_test)
y3_preds = results3.predict (X3_test)
plt.figure (dpi = 75)
plt.scatter (y3_test, y3_preds)
plt.plot (y3_test, y3_test, color = « red »)
plt.xlabel ( » Scores réels « , fontdict = eksen_font)
plt.ylabel ( » Scores estimés « , fontdict = eksen_font)
plt.title ( » Modèle des scores réels par rapport aux scores estimés « , fontdict = baslik_font)
plt. show ()
print (« Erreur absolue moyenne (MAE)
: {} ». Format (mean_absolute_error (y3_test, y3_preds)))
print (« Mean square error (MSE): {} ». format (mse (y3_test), y3_preds)))
print (« Root Mean Squared Error (RMSE):
{} ». format (rmse (y3_test, y3_preds))) print (« Mean Absolute Perc. Error (MAPE):
{} ». Format (np.mean (np.abs ((y3_test – y3_preds) / y3_test)) * 100 ))
Lequel est le meilleur?
Comme vous pouvez le constater, les erreurs du dernier modèle sont plus élevées que le premier. Le R a également été ajusté au carré ajusté. Si les erreurs étaient plus petites, alors nous dirions que cette dernière est meilleure, quel que soit le R au carré. Enfin, nous choisissons des erreurs plus petites et R au carré le plus élevé. Je viens d’ajouter cette seconde pour vous montrer comment comparer les modèles et décider lequel est le meilleur.
Notre modèle est maintenant le suivant:
Montant annuel dépensé = -1027,28 + 61,49x (durée de l’adhésion) + 38,76x (durée de la demande) + 25,48x (moyenne de durée de la session)
Cela signifie, par exemple, si nous pouvons augmenter la durée de l’adhésion d’un an de plus et garder toutes les autres fonctionnalités fixes, une personne dépensera 61,49 $ de plus!
Conseils avancés: valeurs aberrantes et non-linéarité
En ce qui concerne les données réelles, les choses ne sont généralement pas si faciles. Pour trouver une linéarité ou des modèles plus précis, vous devrez peut-être faire autre chose. Par exemple, si votre modèle n’est pas suffisamment précis, recherchez les valeurs aberrantes. Parfois, les valeurs aberrantes peuvent confondre vos résultats!
En dehors de cela, parfois vous obtiendrez des lignes courbes au lieu de linéaires, mais vous verrez qu’il y a aussi un relation entre les variables!
Vous devriez alors penser à transformer vos variables à l’aide de logarithmes ou de carrés.
Voici une astuce pour décider lequel utiliser: