CoddityTeam / movaicode

Concours mensuel du Pire Développeur de France
123 stars 10 forks source link

La toute puissance zodiacale du Machine Learning #277

Open Steuv1871 opened 1 year ago

Steuv1871 commented 1 year ago

Le Machine Learning est la réponse à tous les problèmes.

Hola les péons, agenouillez vous devant la toute puissance du Machine Learning ! La fonction predictionDuSigne PREDIT avec EXACTITUDE le signe astrologique d'une personne à partir de sa date de naissance (et ramène l'être aimé) grace à la puissance du Machine Learning ancestrale.

import pandas as pd
from datetime import datetime, timedelta
from sklearn.tree import DecisionTreeClassifier

def predictionDuSigne(date):
    '''
    Algorithme de Machine Learning pour prédire le signe astrologique d'une personne
    en fonction de sa date de naissance

    Parameters
    ----------
    date : str
        Date de naissance au format 'JJ/MM/AAAA'.

    Returns
    -------
    signe : str
        Signe astrologique de la personne.

    '''
    #Génération des données d'entrainement :
    df = trainData()

    #Entrainement du modèle
    dt_clf = DecisionTreeClassifier()

    X_train = pd.DataFrame(columns=['annee','mois', 'jour'])

    X_train['annee'] = df['date'].dt.year
    X_train['mois'] = df['date'].dt.month
    X_train['jour'] = df['date'].dt.day

    dt_clf.fit(X_train,df['signe'])

    #Prédiction
    X = pd.DataFrame([[date[-4:],date[3:5],date[:2]]],columns=['annee','mois','jour'])
    return dt_clf.predict(X)

def trainData():
    '''
    Génération des données d'apprentissage du modèle de Machine Learning
    Crée un DataFrame Pandas contenant le signe associé à chaque jour
    depuis le 1er Janvier 1970 jusqu'à aujourd'hui.

    Returns
    -------
    df : DataFrame contenant le signe associé à chaque date depuis le 1er Janvier 1970 jusqu'à aujourd'hui.

    '''
    date = datetime(1970,1,1)
    df = pd.DataFrame(columns=['date','signe'])

    while date < datetime.now():
        df.loc[len(df.index)] = [date, defSigneTrain(date)]                                                  
        date += timedelta(days = 1)
    return df

def defSigneTrain(date):
    '''
    Ptite fonction à la con rapide pour retourner le signe de chaque date de mes données d'entrainement.
    Du code de non initié à la toute puissance du Machine Learning qui n'a que peut d'intéret en soit.
    J'ai confié ça à un stagière qui utilise chatGPT.

    Parameters
    ----------
    date : datetime64
        date à catégoriser.

    Returns
    -------
    signe : str
        Signe correspondant à la date du jeux de donnée.

    '''
    signes = {
        'Bélier' : ['21/03','20/04'],
        'Taureau' : ['21/04','20/05'],
        'Gémeaux' : ['21/05','21/06'],
        'Cancer' : ['22/06','22/07'],
        'Lion':  ['23/07','22/08'],
        'Vierge' : ['23/08','22/09'],
        'Balance' : ['23/09','22/10'],
        'Scorpion' : ['23/10','22/11'],
        'Sagittaire' : ['23/11','21/12'],
        'Capricorne' : ['22/12','20/01'],
        'Verseau' : ['21/01','18/02'],
        'Poissons' : ['19/02','20/03'],
    }

    for signe in signes :
        if date.month == int(signes[signe][0][-2:]) and date.day >= int(signes[signe][0][:2]):
             return signe
        if date.month == int(signes[signe][1][-2:]) and date.day <= int(signes[signe][1][:2]):
            return signe 

Mise en pratique, attention les yeux !

import time

date_de_naissance = '01/04/2023'
debut = time.time()
signe = predictionDuSigne(date_de_naissance)
fin = time.time()
duree = round(fin - debut,1)
print(f"Le signe d'une personne née le {date_de_naissance} est {signe[0]}")
print(f"La fonction a pris {duree} secondes à s'exécuter.")
>>> Le signe d'une personne née le 01/04/2023 est Bélier
>>> La fonction a pris 35.0 secondes à s'exécuter.
Steuv1871 commented 1 year ago

Pour les mécréants doutant de la véracité du modèle, voici une visualisation de l'arbre de décision généré par la sainte machine.

movaicode_18-MLZ

chris-codd commented 1 year ago

Bravo pour cette contribution de qualitay 👌

Matthieu-Coddity commented 1 year ago

propre, mais peut être optimisé pour passer la barre mythique des 33s

Steuv1871 commented 1 year ago

propre, mais peut être optimisé pour passer la barre mythique des 33s

C'est vrai que j'ai été vite en besogne. Peut-être qu'en entrainant différents modèles avec plus de paramètre je pourrait trouver un ensemble de paramétrages qui me permet de gagner 2 secondes. Je prends en considération pour une futur participation.