Bonjour,
Je suis en train de lire le livre Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow_ Concepts, Tools, and Techniques to Build Intelligent Systems , la deuxième édition et je suis bloqué sur une partie de code que je n’arrive pas à comprendre. J’aimerais tout d’abord donner le contexte; on veut créer un ensemble de set à partir de notre ensemble de données. Pour cela on prend aléatoirement 20% des données. Le problème est qu’en rajoutant de nouvelles données ou juste après ré-exécution du code alors cet ensemble test va changer, et nous voulons le garder constant et lui rajouter une éventuelle 20% de nouvelles données. L’auteur donne la solution suivante (voir code en dessous) en la justifiant par :
For example, you could compute a hash of each instance’s identifier and put that instance in the test set if the hash is lower than or equal to 20% of the maximum hash value. This ensures that the test set will remain consistent across multiple runs, even if you refresh the dataset. The new test set will contain 20% of the new instances, but it will not contain any instance that was previously in the training set.
Le code est :
from zlib import crc32
def test_set_check(identifier, test_ratio):
return crc32(np.int64(identifier)) & 0xffffffff < test_ratio * 2**32
def split_train_test_by_id(data, test_ratio, id_column):
ids = data[id_column]
in_test_set = ids.apply(lambda id_: test_set_check(id_, test_ratio))
return data.loc[~in_test_set], data.loc[in_test_set]
Excusez-moi j’ai tenté de mettre tout le code en mode code mais c’est le meilleur affichage que j’ai pu avoir.
J’ai cherché ce que veut dire hash et j’ai compris que généralement les hash functions vont associer à un objet d’entrée un nombre en sortie. Donc si j’ai bien compris ce que l’auteur veut faire, c’est qu’il va prendre les identifiants des données, leur appliquer sa fonction hash pour avoir des nombres et si ce nombre est inférieur à test_ratio*valeur maximale assignée par la hash function alors les données vont dans l’ensemble test sinon elles vont dans l’ensemble d’entraînement. Mais en fait je vois mal la part d’aléatoire dont tout cela. Car on pourrait tout aussi bien les 20% premières données qu’on a (et si on a de nouvelles données qui se rajoutent alors on prendre les 20% premières données de celles-ci aussi…) mais ce procédé n’est pas aléatoire… C’est pour cela que je me redirige vers vous, afin que vous m’expliquiez un peu plus en détail comment ce code marche. J’ai essayé de comprendre la fonction crc32 mais en vain.
J’espère que vous pourrez m’aider à mieux comprendre puisque cette me paraît importante.
Merci d’avance.