Enregistrer le modèle ML pour une utilisation future

j'appliquais des algorithmes D'apprentissage automatique comme la régression linéaire, la régression logistique et Bayes naïve à certaines données, mais j'essayais d'éviter D'utiliser des RDDs et de commencer à utiliser des images de données parce que les RDDs sont plus lents que les images de données sous pyspark (voir pic 1).

l'autre raison pour laquelle j'utilise DataFrames est que la bibliothèque ml a une classe très utile pour accorder des modèles qui est CrossValidator cette classe renvoie un modèle après l'avoir ajusté, évidemment cette méthode doit tester plusieurs scénarios, et après cela renvoie un modèle ajusté (avec les meilleures combinaisons de paramètres).

le cluster que j'utilise n'est pas si grand et les données sont assez grandes et certains ajustements prennent des heures donc je veux sauver ces modèles pour les réutiliser plus tard, mais je n'ai pas réalisé comment, y a-t-il quelque chose que j'ignore?

Notes:

  • les classes de modèles de mllib ont une méthode de sauvegarde (i.e. NaiveBayes ), mais mllib n'a pas CrossValidator et utiliser RDDs donc je l'évite prématurément.
  • la version actuelle est spark 1.5.1.
21
demandé sur Alberto Bonsanto 2015-10-09 02:50:01

2 réponses

Étincelle 2.0.0+

à première vue tous les Transformers et Estimators mettre en œuvre MLWritable . Si vous utilisez Spark < = 1.6.0 et que vous éprouvez certains problèmes avec la sauvegarde du modèle, je suggère de changer de version.

Étincelle >= 1.6

depuis Spark 1.6 il est possible de sauvegarder vos modèles en utilisant la méthode save . Parce que presque chaque model implémente l'interface MLWritable . Pour exemple, Linearregessionmodel l'A, et il est donc possible de sauvegarder votre modèle sur le chemin désiré en l'utilisant.

étincelle < 1,6

je crois que vous faites des suppositions incorrectes ici.

certaines opérations sur un DataFrames peuvent être optimisées et cela se traduit par une meilleure performance par rapport à un RDDs ordinaire . DataFrames fournir la mise en cache efficace et SQLISH API est sans doute plus facile à comprendre que CA API.

ml Pipelines sont extrêmement utiles et des outils comme cross-validator ou différents évaluateurs sont tout simplement indispensables dans n'importe quel pipeline de machine et même si aucun des ci-dessus est particulièrement difficile à mettre en œuvre sur le haut de faible niveau MLlib API, il est beaucoup mieux d'avoir prêt à l'emploi, universel et relativement bien testé solution.

c'est très bien, mais il ya quelques problèmes:

  • jusqu'à Je peux dire opérations simples sur un DataFrames comme select ou withColumn Afficher des performances similaires à ses équivalents RDD comme map ,
  • dans certains cas, l'augmentation du nombre de colonnes dans un pipeline typique peut en fait dégrader les performances par rapport à des transformations de bas niveau bien ajustées. Vous pouvez bien sûr ajouter des Colonne-transformateurs de goutte sur la façon de corriger pour cela,
  • nombreux algorithmes ML, y compris ml.classification.NaiveBayes sont tout simplement des wrappers autour de son mllib API
  • PySpark ML/MLlib algorithmes de déléguer le traitement réel de ses Scala homologues,
  • le dernier mais non moins RDD est toujours là, même si bien caché derrière DataFrame API

je crois qu'à la fin de la journée ce que vous obtenez en utilisant ML au lieu de MLLib est assez élégant, API de haut niveau. Une chose que vous pouvez faire est de combiner les deux à créer un pipeline multi-étapes personnalisé:

  • utiliser ML pour charger ,nettoyer et transformer les données,
  • extraire les données requises (voir par exemple méthode des points d'extraction ) et passer à MLLib algorithme,
  • add custom cross-validation /evaluation
  • enregistrer MLLib modèle en utilisant une méthode de votre choix (Modèle Spark ou PMML )

Ce n'est pas une solution optimale, mais il est le meilleur je pense, donné une API actuelle.

23
répondu zero323 2016-08-16 00:54:21

il semble que la fonctionnalité API pour enregistrer un modèle n'est pas implémentée à partir d'aujourd'hui (voir Spark issue tracker SPARK-6725 ).

une alternative a été publiée ( comment sauvegarder les modèles de ML Pipeline vers S3 ou HDFS? ) qui consiste simplement à sérialiser le modèle, mais est une approche Java. Je m'attends à ce que dans PySpark vous puissiez faire quelque chose de similaire, c'est-à-dire choisir le modèle pour écrire sur le disque.

5
répondu Kirk Broadhurst 2017-05-23 12:17:54