Data Science en C (ou C ++)

40

Je suis un Rprogrammeur de langue. Je fais également partie du groupe de personnes considérées comme des scientifiques du traitement des données, mais qui appartiennent à des disciplines universitaires autres que la CS.

Cela fonctionne bien dans mon rôle de Data Scientist. Cependant, en commençant ma carrière dans Rles autres langages de script / Web et ne possédant que des connaissances de base, je me suis senti quelque peu insuffisant dans deux domaines clés:

  1. Manque de connaissance solide de la théorie de la programmation.
  2. Manque de niveau de compétence concurrentiel dans des langages plus rapides et plus largement utilisés tels que C, C++et Javaqui pourraient être utilisés pour augmenter la vitesse des calculs de pipeline et de Big Data, ainsi que pour créer des produits DS / data pouvant être plus facilement développés en rapide des scripts back-end ou des applications autonomes.

La solution est simple bien sûr: allez apprendre la programmation. C’est ce que j’ai fait en s’inscrivant à certains cours (actuellement, la programmation en C).

Cependant, maintenant que je commence à aborder les problèmes n ° 1 et n ° 2 ci-dessus, je me demande à quel point les langues sont-elles viables Cet C++pour Data Science? ".

Par exemple, je peux très bien déplacer les données et interagir avec les utilisateurs, mais qu'en est-il de la régression avancée, de l'apprentissage automatique, de l'exploration de texte et d'autres opérations statistiques plus avancées?

Alors. peut Cfaire le travail - quels outils sont disponibles pour les statistiques avancées, le ML, l'IA et d'autres domaines de la science des données? Ou dois-je perdre l'essentiel de l'efficacité obtenue par la programmation en Cfaisant appel à des Rscripts ou à d'autres langages?

La meilleure ressource que j’ai trouvée jusqu’à présent en C est une bibliothèque appelée Shark , qui donne C/ C++la possibilité d’utiliser des machines à vecteurs de support, une régression linéaire (non régressive et d’autres régressions avancées telles que le probit multinomial, etc.) et une liste restreinte d’autres logiciels. (super mais) fonctions statistiques.

Hack-R
la source
5
Cette question semble être principalement basée sur l'opinion. S'il vous plaît envisager de reformuler. Demandez peut-être quels types d'outils de science des données sont disponibles pour C / C ++ ou quels types d'applications utilisent ces langages.
sheldonkreger
1
@sheldonkreger C'est ce que je demande, je vais clarifier cela, merci
Hack-R
1
J'ai utilisé Waffles (C ++) pour intégrer l'apprentissage automatique aux moteurs C ++ existants.
Pete
@Pete si vous pouvez incorporer cela dans une réponse, je vais probablement la marquer comme solution
Hack-R
1
Meta Toolkit est disponible en C ++: meta-toolkit.github.io/meta . Il y a un cours sur Coursera qui l'utilise, il est toujours en semaine 1, alors vous voudrez peut-être jeter un coup d'œil. Le cours s'appelle "Récupération de texte et moteurs de recherche".
LauriK

Réponses:

35

Ou dois-je perdre l'essentiel de l'efficacité de la programmation en C en faisant appel à des scripts R ou à d'autres langages?

Faites le contraire: apprenez le C / C ++ pour écrire des extensions R. Utilisez C / C ++ uniquement pour les sections critiques de performance de vos nouveaux algorithmes, utilisez R pour construire votre analyse, importer des données, créer des tracés, etc.

Si vous voulez aller au-delà de R, je vous conseillerais d'apprendre python. Il existe de nombreuses bibliothèques disponibles, telles que scikit-learn pour les algorithmes d'apprentissage automatique ou PyBrain pour la construction de réseaux neuronaux, etc. (et utilisez pylab / matplotlib pour le traçage et les cahiers iPython pour développer vos analyses). Encore une fois, C / C ++ est utile pour implémenter des algorithmes critiques en temps comme des extensions python.

Andre Holzner
la source
1
Merci André. J'utilise beaucoup Pybrain; Python est pour moi un milieu entre R et C, mais je voulais tout de même apprendre le C tant pour la vitesse que pour l’application plus large du code. J'ai choisi cette solution car je n'avais pas pensé à utiliser le C / C ++ pour écrire des extensions R, ce qui est une très bonne idée que je vais absolument faire. Merci!!
Hack-R
1
J'appuie la notion d'apprentissage de Python. Je travaille avec de grands ensembles de données et le scientifique utilise R pour analyser ces ensembles de données. Bien que j'ai appris le C très jeune, Python est le seul langage qui me donne vraiment de la valeur en tant que programmeur et qui assiste ces informaticiens. Par conséquent, cherchez à complimenter l'équipe, pas vous-même.
Glen Swan
1
de même, on accélère le python en écrivant en cython (encore une fois, le C). Je dois dire que je n'ai pas encore utilisé moi-même. Il y a très peu de choses qui ne peuvent pas être faites en utilisant des bibliothèques existantes (par exemple, scikit-learn, des pandas en python [qui sont écrits en cython afin que vous n'ayez pas à le faire!]).
seanv507
Quelques autres bibliothèques utiles pour Python incluent: pandas, numpy, scipy, etc. Ajoutant ceci à l'appui de l'apprentissage de python :)
Shagun Sodhani
C'est sur place. Je ferais remarquer que si vous n’avez pas d’arrière-plan CS, il est peu probable que vous écriviez du code plus efficacement que les fonctions sous-jacentes pour Python ou les packages pour R. J'ai programmé en C ++ pendant 13 ans et je pense toujours qu'il y a des aspects de la gestion de la mémoire et de l'optimisation des performances que je ne faisais pas bien. De plus, python & R dispose d’informaticiens très intelligents qui optimisent les problèmes de distribution. Les langages C seront donc véritablement relégués aux systèmes à très faible latence.
Jagartner
10

Comme Andre Holzner l’a dit, étendre R avec une extension C / C ++ est un très bon moyen de tirer parti du meilleur des deux côtés. Vous pouvez aussi essayer l’inverse, en travaillant avec C ++ et en appelant occasionnellement la fonction de R avec le paquetage RInside o R. Vous pouvez trouver ici comment

http://cran.r-project.org/web/packages/RInside/index.html http://dirk.eddelbuettel.com/code/rinside.html

Une fois que vous travaillez en C ++, vous avez plusieurs bibliothèques, beaucoup d’entre elles étant conçues pour des problèmes spécifiques, d’autres plus générales.

http://www.shogun-toolbox.org/page/features/ http://image.diku.dk/shark/sphinx_pages/build/html/index.html

http://mlpack.org/

D.Castro
la source
9

Je conviens que la tendance actuelle consiste à utiliser Python / R et à le lier à certaines extensions C / C ++ pour des tâches coûteuses en calcul.

Toutefois, si vous souhaitez rester en C / C ++, vous pouvez jeter un œil à Dlib :

Dlib est une bibliothèque multi-plateforme C ++ polyvalente conçue à l'aide de la programmation par contrat et de techniques C ++ modernes. Il s’agit d’un logiciel open source sous licence Boost Software.

entrez la description de l'image ici

Franck Dernoncourt
la source
Une autre réponse très utile. Savez-vous si nous sommes autorisés à reproduire librement cette image (au cas où je souhaiterais la mettre dans une présentation ou un blog, etc.)? Aussi, quand il dit des choses comme "> 20k samples", je me demande si cela signifie vraiment "samples" ou "observations dans votre échantillon"?
Hack-R
2
Je suis l'auteur de dlib. N'hésitez pas à poster cette image où vous voulez :). De plus, plus de 20 000 échantillons signifie que vous avez 20 000 vecteurs ou autre chose. Le nombre de variables dans chaque échantillon est une question distincte.
Davis King
@ Hack-R "Sample" est l'un de ces termes surchargés dans les statistiques / apprentissage automatique, où il désigne parfois un ensemble d'instances tirées d'une population (comme dans "taille de l'échantillon", "moyenne de l'échantillon", etc.), et parfois signifie les instances individuelles (comme dans "formé un classifieur sur 10K échantillons").
Tim Goodman
6

À mon avis, idéalement, pour être un professionnel plus abouti , il serait bon de connaître au moins un langage de programmation pour les paradigmes de programmation les plus populaires ( procédural , orienté objet , fonctionnel ). Certes, je considère R et Python comme les deux langages et environnements de programmation les plus populaires pour la science des données et, par conséquent, comme outils de base pour la science des données.

Julia est impressionnante à certains égards, mais elle tente de rattraper ces deux problèmes et de s’imposer comme un outil majeur de la science des données. Cependant, je ne le vois pas de sitôt, simplement en raison de la popularité de R / Python , de ses très grandes communautés et de ses énormes écosystèmes, composés de bibliothèques / paquets existants ou nouvellement développés , couvrant un très large éventail de domaines / domaines de logiciels. étude.

Cela dit, de nombreux packages et bibliothèques, axés sur la science des données, les zones ML et AI, sont implémentés et / ou fournissent des API dans des langages autres que R ou Python (pour obtenir la preuve, voir cette liste et cette liste , qui sont toutes deux sont excellents et donnent une perspective solide de la variété sur le terrain). Cela est particulièrement vrai pour les logiciels spécialisés ou orientés vers la performance . Pour ce logiciel, j'ai vu des projets avec des implémentations et / ou des API principalement en Java, C et C ++ (Java est particulièrement populaire dans le segment Big Data de la science des données - en raison de sa proximité avec Hadoop et son écosystème - et dans le PNLsegment), mais d’autres options sont disponibles, bien que dans une mesure beaucoup plus limitée, en fonction du domaine. Aucune de ces langues n’est une perte de temps, mais vous devez donner la priorité à leur maîtrise en totalité, en fonction de votre situation professionnelle actuelle, de vos projets et de vos intérêts. Donc, pour répondre à votre question sur la viabilité de C / C ++ (et de Java), je dirais qu'ils sont tous viables , mais pas en tant qu'outils de science des données primaires , mais en tant que outils secondaires .

En répondant à vos questions sur 1) le C en tant qu’outil potentiel de science des données et 2) son efficacité , je dirais que: 1) bien qu’il soit possible d’utiliser le C pour la science des données, je vous déconseille de le faire, car vous auriez un difficulté à trouver les bibliothèques correspondantes ou, plus encore, à essayer de mettre en oeuvre les algorithmes correspondants par vous-même; 2) vous ne devriez pas vous soucier de l' efficacité, autant de segments de code performances critiques sont mises en œuvre dans les langages de bas niveau comme C, plus, il existe des options pour des langues d' interface des sciences de données populaires avec, par exemple, C (par exemple, Rcppforfait pour intégration R avec C / C ++: http://dirk.eddelbuettel.com/code/rcpp.html). Cela s’ajoute à des approches plus simples, mais souvent plutôt efficaces, de la performance, telles que l’utilisation cohérente de la vectorisation dans R ainsi que l’utilisation de divers cadres, progiciels et bibliothèques de programmation en parallèle. Pour des exemples d'écosystème R, voir la vue des tâches CRAN "Calcul parallèle à haute performance avec R" .

En parlant de science des données , je pense qu’il est très logique de mentionner l’importance d’une approche de recherche reproductible ainsi que de la disponibilité de divers outils appuyant ce concept (pour plus de détails, voir ma réponse pertinente ). J'espère que ma réponse est utile.

Aleksandr Blekh
la source
5

R est l’un des outils clés du data scientist, quoi que vous fassiez, vous n’arrêtez pas de l’utiliser.

Parlons maintenant de C, C ++ ou même de Java. Ce sont de bonnes langues populaires. Que vous en ayez besoin ou que vous en ayez besoin dépend du type de travail ou de projet que vous avez. D'après mon expérience personnelle, il existe tellement d'outils pour les informaticiens que vous aurez toujours l'impression que vous devez constamment apprendre.

Vous pouvez ajouter Python ou Matlab aux choses à apprendre si vous voulez et continuez à les ajouter. La meilleure façon d'apprendre consiste à entreprendre un projet en utilisant d'autres outils avec lesquels vous n'êtes pas à l'aise. Si j'étais vous, j'apprendrais le python avant le c. Il est plus utilisé dans la communauté que le c. Mais apprendre le c n'est pas une perte de temps.

servais daligou
la source
Je sais ce que vous entendez par le très grand nombre d'outils! Je dis à mon stagiaire de ne pas être distrait et de se concentrer sur 1 ou 2 choses, mais il est difficile de suivre mes propres conseils.
Hack-R
5

En tant que informaticien, les autres langages (C ++ / Java) sont pratiques lorsque vous devez incorporer l'apprentissage automatique dans un moteur de production existant.

Waffles est à la fois une bibliothèque de classes C ++ bien maintenue et un package d’analyse en ligne de commande. Il comprend un apprentissage supervisé et non supervisé, des tonnes d'outils de manipulation de données, des outils de données fragmentés et d'autres éléments tels que le traitement audio. Puisqu'il s'agit également d'une bibliothèque de classes, vous pouvez l'étendre selon vos besoins. Même si vous n'êtes pas celui qui développe le moteur C ++ (il est probable que vous ne le ferez pas), cela vous permettra de créer un prototype, de tester et de remettre quelque chose aux développeurs.

Plus important encore, je pense que ma connaissance de C ++ et de Java m'aide vraiment à comprendre le fonctionnement de Python et de R. Toute langue n’est utilisée correctement que lorsque vous comprenez un peu ce qui se passe en dessous. En apprenant les différences entre les langues, vous pouvez apprendre à exploiter les atouts de votre langue principale.

Mise à jour

Apache Spark - MLLib est important pour les applications commerciales comportant de grands ensembles de données. Ici, vous pouvez utiliser Scala, Java ou Python.

Pete
la source
2

Je souhaiterais comprendre pourquoi vous auriez besoin d'une autre langue (hormis Python) si votre objectif est "mais qu'en est-il de la régression avancée, de l'apprentissage automatique, de l'exploration de texte et d'autres opérations statistiques plus avancées".
Pour ce genre de chose, C est une perte de temps. C’est un bon outil, mais depuis environ 20 ans que Java est disponible, j’ai rarement codé C.
Si vous préférez le côté plus fonctionnel de la programmation de R, apprenez Scala avant de vous lancer dans trop de mauvaises procédures procédurales codant avec C .
apprendre enfin à utiliser les bibliothèques de Hadley Wickham - ils vous faire économiser beaucoup de temps à faire la manipulation des données.

Michael Cox
la source
Parce que les langages tels que R et Python sont très lents / inefficaces par rapport aux langages tels que C. Ainsi, lorsque vous utilisez beaucoup de données et de calculs, si vous pouvez faire quelque chose en C, c'est plus rapide que si vous pouvez le faire en R. J'aime et utilise vraiment. Les forfaits de Hadley
Hack-R
2

Il existe des outils C ++ pour les statistiques et la science des données, tels que ROOT https://root.cern.ch/drupal/ , BAT https://www.mppmu.mpg.de/bat/ , boost ou OpenCV.

client
la source
Impressionnant! Merci. Je souhaite seulement qu'ils soient pour la plaine C aussi, mais toujours utile.
Hack-R
1

Je ne sais pas si cela a déjà été mentionné, mais il y a aussi le wabbit virtuel, mais cela pourrait être spécifique à certains types de problèmes seulement.

Felipe Almeida
la source
1
Semble intéressant. J'ai seulement regardé le lien, mais les types de modèles mentionnés seraient très utiles. Est-ce une bibliothèque C ordinaire que vous pouvez utiliser dans un programme? Je vais devoir approfondir.
Hack-R
0

Jetez un coup d'œil à Intel DAAL qui est en cours. Il est hautement optimisé pour l'architecture de processeur Intel et prend en charge les calculs distribués.

0x1337
la source
0

Solutions d'apprentissage machine évolutives pour Big Data:

J'ajouterai ma somme de 0,02 $, car il y a un domaine clé qui semble ne pas avoir été abordé dans tous les messages précédents: l'apprentissage automatique sur Big Data !

Pour le Big Data, l'évolutivité est la clé et R est insuffisant. En outre, les langages tels que Python et R ne sont utiles que pour l’interfaçage avec des solutions évolutives qui sont généralement écrites dans d’autres langages. Je fais cette distinction non pas parce que je veux dénigrer ceux qui les utilisent, mais uniquement parce que c'est tellement important pour les membres de la communauté des données informatiques de comprendre à quoi ressemble une solution véritablement évolutive d'apprentissage automatique.

Je fais l'essentiel de mon travail avec des données volumineuses sur des clusters de mémoire distribuée . En d’autres termes, je n’utilise pas seulement une machine 16 cœurs (4 processeurs quad-core sur une seule carte mère partageant la mémoire de cette carte mère), j’utilise un petit cluster de 64 machines 16 cœurs. La configuration requise pour ces clusters de mémoire distribuée est très différente de celle requise pour les environnements de mémoire partagée et l'apprentissage big machine de données nécessite souvent des solutions évolutives au sein d'environnements de mémoire distribuée.

Nous utilisons également C et C ++ partout dans un produit de base de données propriétaire. Tous nos éléments de haut niveau sont gérés en C ++ et MPI, mais les éléments de bas niveau qui touchent les données sont tous longs et contiennent des tableaux de caractères de style C pour maintenir le produit très rapidement. La commodité des chaînes std ne vaut tout simplement pas le coût de calcul.

Il n'y a pas beaucoup de bibliothèques C ++ disponibles offrant des capacités d'apprentissage machine distribuées et évolutives - MLPACK .

Cependant, il existe d'autres solutions évolutives avec des API:

Apache Spark possède une bibliothèque d’apprentissage machine évolutive appelée MLib avec laquelle vous pouvez vous connecter .

De plus, Tensorflow dispose maintenant de tensorflow distribué et d’une API C ++ .

J'espère que cela t'aides!

AN6U5
la source