As someone who has run a lot of decent sized FB campaigns, the norm would be for me to receive about 60-70% of the clicks I paid for. Not saying that was all fraud, maybe some people clicked and changed their mind... but I suspect the real "fraud" number is much, much higher than 2.5%. My guess is around 25%.
Well still, even in a perfect set up something like 20% of your display clicks still won't be counted as sessions. Lots of misclicks, exits before analytics loads, etc.
Edit: Oh did you mean advertising reports for sessions?
I tried all kinds of things. The most interesting thing (to me) was the clicks_paid_for / clicks_landed changed, depending on different targeting mechanisms I used.
I may have forgotten to acknowledge that I never really cared I didn't get all the clicks -- I was doing a CPA campaign, so I just baked in the non-visits.
Depending on targeting and platform, there was almost always a 20-70% discrepancy between the clicks I paid for (reported by the ad platform), and the visits that landed on my site (reported by GA, server logs, piwik, and analytics.js).