6 votes

Pourquoi le OneHotEncoder de Spark supprime-t-il la dernière catégorie par défaut ?

Je voudrais comprendre la logique derrière le retrait par défaut de la dernière catégorie par le OneHotEncoder de Spark.

Par exemple:

>>> fd = spark.createDataFrame( [(1.0, "a"), (1.5, "a"), (10.0, "b"), (3.2, "c")], ["x","c"])
>>> ss = StringIndexer(inputCol="c",outputCol="c_idx")
>>> ff = ss.fit(fd).transform(fd)
>>> ff.show()
+----+---+-----+
|   x|  c|c_idx|
+----+---+-----+
| 1.0|  a|  0.0|
| 1.5|  a|  0.0|
|10.0|  b|  1.0|
| 3.2|  c|  2.0|
+----+---+-----+

Par défaut, le OneHotEncoder laissera tomber la dernière catégorie:

>>> oe = OneHotEncoder(inputCol="c_idx",outputCol="c_idx_vec")
>>> fe = oe.transform(ff)
>>> fe.show()
+----+---+-----+-------------+
|   x|  c|c_idx|    c_idx_vec|
+----+---+-----+-------------+
| 1.0|  a|  0.0|(2,[0],[1.0])|
| 1.5|  a|  0.0|(2,[0],[1.0])|
|10.0|  b|  1.0|(2,[1],[1.0])|
| 3.2|  c|  2.0|    (2,[],[])|
+----+---+-----+-------------+

Bien sûr, ce comportement peut être modifié:

>>> oe.setDropLast(False)
>>> fl = oe.transform(ff)
>>> fl.show()
+----+---+-----+-------------+
|   x|  c|c_idx|    c_idx_vec|
+----+---+-----+-------------+
| 1.0|  a|  0.0|(3,[0],[1.0])|
| 1.5|  a|  0.0|(3,[0],[1.0])|
|10.0|  b|  1.0|(3,[1],[1.0])|
| 3.2|  c|  2.0|(3,[2],[1.0])|
+----+---+-----+-------------+

Question::

  • Dans quel cas le comportement par défaut est-il souhaitable?
  • Quels problèmes pourraient être négligés en appelant aveuglément setDropLast(False)?
  • Que veulent dire les auteurs par la déclaration suivante dans la documentation?

La dernière catégorie n'est pas incluse par défaut (configurable via dropLast) car cela fait que les entrées du vecteur s'additionnent à un, et donc linéairement dépendantes.

4voto

Romain Jouin Points 1536

According to the doc it is to keep the column independents :

Un encodeur one-hot qui mappe une colonne d'indices de catégories à une colonne de vecteurs binaires, avec au plus une valeur un dans chaque ligne qui indique l'indice de la catégorie d'entrée. Par exemple, avec 5 catégories, une valeur d'entrée de 2.0 serait mappée à un vecteur de sortie de [0.0, 0.0, 1.0, 0.0]. La dernière catégorie n'est pas incluse par défaut (configurable via OneHotEncoder!.dropLast car cela fait que les entrées du vecteur se summent à un, et donc linéairement dépendantes. Ainsi, une valeur d'entrée de 4.0 est mappée à [0.0, 0.0, 0.0, 0.0]. Notez que c'est différent de OneHotEncoder de scikit-learn, qui garde toutes les catégories. Les vecteurs de sortie sont épars.

https://spark.apache.org/docs/1.5.2/api/java/org/apache/spark/ml/feature/OneHotEncoder.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X