anchor.diff:  
   This chapter covers:
   
  -- The different concepts we saw in chapter 1 in action: Dataset, Transformer,
  -Estimator and Pipeline
  +- The different concepts we saw in chapter 1 in action: Dataset/DataFrame,
  +Transformer, Estimator and Pipeline
   - Understanding a small dataset in a machine learning context
  -- Being confronted to a machine learning problem and solving it using Spark ML
  +- Being confronted to a simple machine learning problem and solving it using
  +Spark ML
   
   Now that we have a broad understanding of Apache Spark and its machine learning
   library Spark ML, we're ready to apply those newly-learned concepts to a
  
positive.code: 5 passengers doesn't have an age filled out in the dataset. To remedy this
  issue, we'll impute a value for the ones that are missing. There exists a few
  simple strategies to decide what value to impute: the mean, the median, or the
  most frequent (usually used for categorical features). Here, we'll use the mean
  which is already in the summary made by the describe method: approximately 29.7
  years.
  
  Spark SQL defines two strategies to deal with rows containing null values:
  either drop them or replace them by another value. The latter will fit our need
  perfectly:
  
  .Replacing null values in the Age column by the column average: 29.7 years
  [source,scala]
  
negative.code: |===
  
  We have 3 females and 2 males. Thus, if we apply a StringIndexer on the Sex
  column we obtain the following DataFrame with female getting the 0 index since
  it's the most frequent and male getting the 1 index (table 2.5).
  
  .Resulting DataFrame after applying a StringIndexer on the Sex column
  [options="header"]
  |===
  |Sex|SexAfterStringIndexer
  