Well -- for me "Product" (and factor) is also somewhat confusing in this context...  but instead of debating on longer descriptive name (e.g. FeatureAttributesProductFalttenMapper ;-) ) -- shouldn't may be this to be "folded" into a generic FlattenMapper?  
e.g. if a kwarg ```flatten_fa``` (or some other better name) provided with such a dictionary?  Moreover may be allowing such a dictionary to actually be stored/present originally within .a collection and just specified by name here? (then any I/O method to load such data would just fill it up)  and then may be even recreating it on the way back (in .reverse())?