R : data.table

Pourquoi data.table?

A Affini-Tech, dès lors qu'il s'agit de résoudre des problèmes de Data Science, nous utilisons souvent R. L'un des grands défaut de R est sa difficulté à traiter de grosses quantités de données. Avant même de les traiter, cela peut prendre de longues minutes de lire un jeu de données et d'en créer un dataframe. Le package data.table nous a permis d'utiliser des jeux de données jusque là difficilement exploitable en R (des millions de lignes pour des centaines de colonnes).

Qu'est-ce que data.table?

Data.table est un package de R qui hérite de data.frame. Le dataframe est l'objet de base dans le monde de la Data qui permet de lire des jeux de données et faire des opérations sur la donnée pour construire des modèles prédictifs. Data.table permet d'effectuer toutes les opérations qu'on peut faire sur un dataframe de façon plus efficace et rapide (globalement 10 fois plus rapide) et avec une utilisation optimisée de la mémoire. Il est disponible depuis la version 3.0.0 de R et est régulièrement mis à jour.

Lire des données avec data.table

Vous utilisez sûrement la fonction classique read.csv. Avec data.table la donnée se lit avec fread. Maintenant que vous connaissez le microbenchmark (cf l'article suivant), je vous propose de comparer le temps de lecture du jeu de données NewsAggregator sur le site UCI machine learning. Ce jeu de données n'est pas spécialement gros (420k lignes, 8 colonnes) mais suffit à démontrer l'efficacité de data.table.

library(microbenchmark)

bench <- microbenchmark(
  fread("./work/projects/NewsAggregatorDataset/newsCorpora.csv"),
  read.csv("./work/projects/NewsAggregatorDataset/newsCorpora.csv"),
  times=5
)

Si vous l'exécutez, vous devriez remarquer que les résultats de ce benchmark sont sans appel. De mon côté j'ai obtenu une moyenne de 2 secondes pour fread et 30 secondes pour read.csv.

Pour ceux qui ne seraient pas convaincus par les capacités à lire beaucoup de données avec data.table, vous pouvez aussi essayer ce dataset qui contient 5 millions de ligne et 42 colonnes; fread le lit en 19 secondes.

Outre ses capacités de lecture, la fonction fread affiche l'état d'avancement lors de la lecture ainsi que d'autres informations à la fin de l'exécution (temps consacré, taille du fichier, ...) :

 dt = fread("./work/projects/kddcup.data")
Read 4898431 rows and 42 (of 42) columns from 0.692 GB file in 00:00:19

Autres opérations avec data.table

Toutes les opérations faîtes sur un dataframe peuvent être effectuées sur un datatable. Il y a seulement des différences de syntaxe et de paramètres par défaut qui peuvent être déstabilisant lorsque l'on est habitué à travailler sur des dataframe. Cependant la prise en main est rapide et le gain potentiel peut-être important. A titre d'exemple le fread a pour paramètre par défaut StringAsFactor à False tandis qu'il est à True dans read.csv. Le lien suivant sur StackOverflow détaille bien les équivalences entre les deux librairies. Vous pouvez aussi télécharger la Cheet sheet R datatable.

Enfin si l'on souhaite revenir à un dataframe (pour des questions d'habitude par exemple) depuis un datatable il est tout à fait possible de le transformer en dataframe en utilisant as.data.frame(dt) mais on en perd les opérations propres à un datatable qui sont bien plus optimisées que celles d'un dataframe.