Surapprentissage?
Répondre à la discussion
Affichage des résultats 1 à 15 sur 15

Surapprentissage?



  1. #1
    Anubis

    Surapprentissage?


    ------

    Bonsoir,
    Je bosse sur un dataset et j'ai utilisé le modèle de XGBoost. Les résultats sont:

    F1 Score with Gradient Boosting (XGBoost): 0.9999005766553987

    Training Accuracy: 1.0

    Test Accuracy: 0.9998869082118774

    Le fait d'avoir 1 comme Accuracy est anormal et peut indiquer un surapprentissage, mais quand on teste sur le dataset de validation on obtient 0.999... Ce qui montre que l'erreur de géneralisation est minimale... Je ne sais plus quoi dire sur ce modèle, qu'est ce que vous en pensez ?

    -----

  2. #2
    pm42

    Re : Surapprentissage ?

    J'en pense que quand j'ai des chiffres comme ça et même des chiffres nettement moins bons mais élevés, je cherche où est l'erreur.
    Typiquement, c'est que dans mes données, j'ai un ou des champs qui sont fait quasiment le label sur lequel on apprend.
    Après difficile d'en savoir plus sans connaitre le domaine métier, la taille, etc.

    Mais une méthode simple pour investiguer est de regarder la feature importance et de se demander si les champs les plus importants sont réalistes et notamment si on les aurait dans le monde réel pour prédire le résultat.

    Comme je fais pas mal de time series, c'est souvent un champ qui contient de l'info sur le futur. Dans ton cas, à toi de voir.

  3. #3
    Anubis

    Re : Surapprentissage ?

    Merci, je vais regarder mes données. Au cas où je bloque, je vous envoie ici le dataset sur lequel je bosse si ça ne vous dérange pas.

  4. #4
    pm42

    Re : Surapprentissage ?

    Citation Envoyé par Anubis Voir le message
    Merci, je vais regarder mes données. Au cas où je bloque, je vous envoie ici le dataset sur lequel je bosse si ça ne vous dérange pas.
    Tu es sur que ton X ne contient pas le y ? Parce que avec ce genre de chiffre, cela y ressemble.

  5. A voir en vidéo sur Futura
  6. #5
    Anubis

    Re : Surapprentissage ?

    Non j'ai verifié mtn je les ai bien séparé.

  7. #6
    Anubis

    Re : Surapprentissage ?

    Je ne sais pas pourquoi ça bug. J'ai enlevé une feature très corrélée à une autre. J'ai normalisé mes données et j'ai fait un shuffle. Je ne vois pas clairement d'où ça provient. J'ai essayé de televerser le dataset mais ça marche pas jsp pourquoi, du coup je t'envoie le lien vers le dataset et je te donne le code que j'ai implementé (j'ai ajouté d'autre features et j'ai enlevé quelques unes, c'est une consigne de l'exo). Dataset :https://archive.ics.uci.edu/dataset/...ng+url+dataset
    Code:
    import pandas as pd
    import math
    from collections import Counter
    import numpy as np
    import re
    from scipy.stats import pointbiserialr
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import StandardScaler
    from sklearn.ensemble import RandomForestClassifier
    from sklearn.metrics import f1_score, accuracy_score
    from sklearn.utils import shuffle
    from xgboost import XGBClassifier
    
    
    data = pd.read_csv('PhiUSIIL_Phishing_URL_Dataset.csv')
    data.drop(columns=['URLSimilarityIndex', 'CharContinuationRate', 'URLTitleMatchScore', 'URLCharProb', 'TLDLegitimateProb'], inplace = True)
    data1 = data.copy()
    
    
    def self_reference_ratio(row):
        total_refs = row['NoOfSelfRef'] + row['NoOfExternalRef']
        return row['NoOfSelfRef'] / total_refs if total_refs != 0 else 0
    
    def external_reference_ratio(row):
        total_refs = row['NoOfSelfRef'] + row['NoOfExternalRef']
        return row['NoOfExternalRef'] / total_refs if total_refs != 0 else 0
    
    def image_to_resource_ratio(row):
        total_resources = row['NoOfImage'] + row['NoOfCSS'] + row['NoOfJS']
        return row['NoOfImage'] / total_resources if total_resources != 0 else 0
    
    def calculate_entropy(url):
        url_part = url.split('://')[-1]
        char_count = Counter(url_part)
        length = len(url_part)
        entropy = -sum((freq / length) * math.log2(freq / length) for freq in char_count.values())
        return entropy
    
    def calculate_js_usage_ratio(row):
        return row['NoOfJS'] / row['LineOfCode'] if row['LineOfCode'] != 0 else 0
    
    def detect_non_standard_port(url):
        match = re.search(r":(\d+)", url)  
        if match:
            port = int(match.group(1))
            return 1 if port not in [80, 443] else 0  
        return 0
    
    def detect_prefix_suffix(domain):
        return 1 if '-' in domain else 0
    
    data1['non_std_port'] = data1['URL'].apply(detect_non_standard_port)
    data1['prefix_suffix'] = data1['Domain'].apply(detect_prefix_suffix)
    data1[['non_std_port', 'prefix_suffix']].head()
    data1['self_reference_ratio'] = data1.apply(self_reference_ratio, axis=1)
    data1['external_reference_ratio'] = data1.apply(external_reference_ratio, axis=1)
    data1['image_to_resource_ratio'] = data1.apply(image_to_resource_ratio, axis=1)
    data1['entropy'] = data1['URL'].apply(calculate_entropy)
    data1['js_usage_ratio'] = data1.apply(calculate_js_usage_ratio, axis=1)
    data1.drop(columns = ['FILENAME','URL','Domain','TLD','Title'], inplace = True)
    binary_columns = [col for col in data1.columns if data1[col].nunique() == 2]
    non_binary_columns = [col for col in data1.columns if col not in binary_columns + ['label']]
    
    scaler = StandardScaler()
    data1[non_binary_columns] = scaler.fit_transform(data1[non_binary_columns])
    
    data1 = shuffle(data1, random_state=42)
    
    pd.set_option('display.max_columns', None)
    X = data1.drop(columns=['label'])
    y = data1['label']
    
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
    
    model = RandomForestClassifier(random_state=42)
    model.fit(X_train, y_train)
    
    y_pred = model.predict(X_test)
    f1 = f1_score(y_test, y_pred)
    
    print("F1 Score:", f1)
    C'est le code à executer. Normalement ça doit donner le score f1.

  8. #7
    pm42

    Re : Surapprentissage ?

    J'essaie de regarder quand j'ai le temps. Si tu n'as pas de news relance moi dans 2 jours.

  9. #8
    Anubis

    Re : Surapprentissage ?

    Ok merci bcp.

  10. #9
    pm42

    Re : Surapprentissage ?

    2 choses : dans le code, tu utilises un RandomForest pas un xgboost, rien de grave.

    J'ai regardé et je n'ai rien trouvé de faux dans ce que tu fais. J'ai viré les features les plus importantes et le résultat reste le même.

    Donc étant perplexe, j'ai regardé la perf qu'on peut attendre sur le Net et j'ai trouvé ça :

    https://github.com/elaaatif/DATA-MIN...L-Phishing-URL

    Conclusion : on obtient bien ce genre de métrique avec ce dataset, tu as fait correctement le boulot.

  11. #10
    Anubis

    Re : Surapprentissage ?

    Bonsoir,
    Oui excuse moi c'est le random forest, il y a une autre partie du code avec le xgboost mais ça donne presque la meme chose. Je vais également regarder le Github que tu'as partagé, il parait intéressant. ça reste quand meme un résultat étonnant . Merci beaucoup pour ton interet, tu m'as bien aidé.

  12. #11
    pm42

    Re : Surapprentissage ?

    Citation Envoyé par Anubis Voir le message
    Oui excuse moi c'est le random forest, il y a une autre partie du code avec le xgboost mais ça donne presque la meme chose.
    Normal vu la facilité d'apprentissage.

    Citation Envoyé par Anubis Voir le message
    ça reste quand meme un résultat étonnant .
    Oui, j'ai du mal à voir l'intérêt d'un dataset où un truc comme RandomForest apprend à pratiquement 100%. C'est très loin d'un cas réel vu comme ça ou alors on doit probablement pouvoir le faire sans IA, en pur algorithme.
    Mais je peux me tromper et je n'ai pas le temps ni l'envie de creuser le pourquoi du comment.

  13. #12
    MissJenny

    Re : Surapprentissage ?

    Une chose qui peut être faite c'est attribuer aléatoirement les individus aux jeux de données d'apprentissage et de validation, pour voir si le résultat reste stable ou pas. Mais sinon, ça peut très bien arriver d'avoir 100% de bien classés. Quand on fait du metabarcoding on est souvent autour de 98~99%. 99% c'est pas 100% mais sur un échantillon...

  14. #13
    pm42

    Re : Surapprentissage ?

    Citation Envoyé par MissJenny Voir le message
    Une chose qui peut être faite c'est attribuer aléatoirement les individus aux jeux de données d'apprentissage et de validation, pour voir si le résultat reste stable ou pas.
    C'est ce qui a été fait ici. Sans variation avec un truc genre kfold mais ce n'est pas nécessaire quand on est à des scores comme ceux obtenus pour investiguer.

    Citation Envoyé par MissJenny Voir le message
    Mais sinon, ça peut très bien arriver d'avoir 100% de bien classés. Quand on fait du metabarcoding on est souvent autour de 98~99%. 99% c'est pas 100% mais sur un échantillon...
    Il y a une différence importante entre 99% et 99,99% comme ce qu'on a dans le cas présent. Et peu de rapport entre des tests ADN et la détection d'URL valides ou non.

  15. #14
    Biname

    Re : Surapprentissage ?

    Avec 'random' on a une distribution normale parfaite ? Pas avec un échantillon réel ?
    Je ne connais rien ou presque au sujet

  16. #15
    pm42

    Re : Surapprentissage ?

    Citation Envoyé par Biname Voir le message
    Avec 'random' on a une distribution normale parfaite ? Pas avec un échantillon réel ?
    Quel random ? Et pourquoi on aurait une distribution normale ? De quoi ?