title: What is the difference / relationship between permutation feature importance (PFI) and feature contribution calculation (FCC)?
body: <p>As the title suggests, I want to know what is the difference / relationship between the two 'explainability' tools - permutation feature importance (PFI), and feature contribution calculation (FCC), when evaluating the impact of features in a machine learning model?</p>
  
  <p>I know that ML.Net allows use of both, they both tell you the impact each feature has within the performance of the model generation, but I don't understand what the key differences are between them. Why would both be needed?</p>
  
  <p>Academic library search, google, and google scholar tells me more about what PFI is all about, but I can't find anything on FCC.</p>
  
  <pre><code>//PFI
  // Compute the feature importance using PFI
  var permutationMetrics = mlContext.Regression.PermutationFeatureImportance(model, data);
  
  // Get the feature names from the training set
  var featureNames = data.Schema.GetColumns()
                  .Select(tuple =&gt; tuple.column.Name) // Get the column names
                  .Where(name =&gt; name != labelName) // Drop the Label
                  .ToArray();
  
  // Write out the feature names and their importance to the model's R-squared value
  for (int i = 0; i &lt; featureNames.Length; i++)
    Console.WriteLine($" 
  {featureNames[i]}\t{permutationMetrics[i].rSquared:G4}");
  
  
  /////VERUS/////
  
  
  //FCC
  
  // Create a Feature Contribution Calculator
  // Calculate the feature contributions for all features given trained model parameters
  
  var featureContributionCalculator = mlContext.Model.Explainability.FeatureContributionCalculation(model.Model, model.FeatureColumn, numPositiveContributions: 11, normalize: false);
  
  // FeatureContributionCalculatingEstimator can be use as an intermediary step in a pipeline. 
  // The features retained by FeatureContributionCalculatingEstimator will be in the FeatureContribution column.
  
  var pipeline = mlContext.Model.Explainability.FeatureContributionCalculation(model.Model, model.FeatureColumn, numPositiveContributions: 11)
      .Append(mlContext.Regression.Trainers.OrdinaryLeastSquares(featureColumn: "FeatureContributions"));
  </code></pre>
  
  <p>I would like to write clearly, for academic purposes, the difference between them, maybe what they use to calculate the feature's importance, or the logic inside - how it is different.</p>