Last year, I trained a machine learning model to rank the running backs based on how it expected them to do during the 2018 season. The resulting rankings were different from the consensus, to put it mildly. When I posted my rankings, the results were mixed. Some were interested and wanted to learn more, some thought that my rankings were unrealistic, and others accurately pointed out flaws with my methodology.
Now that the 2018 season is in the books, it’s time to evaluate how my model did!
First, a look at the boldest predictions:
Dalvin Cook: Model: RB27, ADP: RB10, Actual Rank: 31st
“What’s up with Dalvin Cook? “F” for efficiency? I get the injury concern but…that makes no sense”
“I’m not a huge Dalvin Cook truther or anything, but come on man, you know that his ranking is absurdly low here unless the model is predicting him to be hurt again”
When I posted these predictions, this was the one I got the most criticism on. Cook was an exciting running back who had a very good start to the 2017 season before getting injured. He was supposed to be healthy in 2018 and everyone expected him to bounce back. However, I thought he would finish in 27th and finish one spot below his backup, Latavius Murray. Actually, Cook finished in 31st and finished one spot above Murray.
Result: CORRECT
David Johnson: Model: RB7, ADP: RB3, Actual Rank: 10th
“Did DJs injury influence the results? He seems crazy low at 7.”
Last year, David Johnson was one of four running backs considered to be in the top tier. Me ranking him all the way down at 7th was pretty controversial. However, David Johnson was weighed down by an awful Cardinals offense and he ended up finishing 10th, meaning that my prediction was actually too optimistic.
Result: CORRECT
Latavius Murray: Model: RB26, ADP: RB44, Actual Rank: 32nd
“Latavius Murray over Kerryon Johnson huh”
Murray being ranked so high was a residual effect of my model expecting Dalvin Cook to bust. Dalvin Cook did bust and Murray did get more of an opportunity, but he didn’t really take advantage of it. He did do much better than most people thought, though.
Result: Slightly Correct
LeSean McCoy: Model: RB10. ADP: RB17, Actual Rank: 40th
“If McCoy finishes above Gordon I’ll shit a brick”
Yeah, this pick was pretty bad. McCoy was getting older and stuck on the Bills offense, but he looked like he was going to get a lot of carries. Instead, he only got 161 carries and came in 40th in points.
Result: INCORRECT
Royce Freeman: Model: RB11, ADP: RB18, Actual Rank: 47th
“there is 0 way royce freeman sees 50 more touches than melvin gordon.”
This was by far the worst pick my model made. Royce Freeman looked like an exciting rookie running back. People were already optimistic on him, but my model took that to the extreme, expecting him to close to being a top 10 RB in his first season. A Broncos rookie running back did almost make the top 10, but it was Philip Lindsay, not Royce Freeman. To be fair, nobody saw Lindsay coming, and I didn’t even make a prediction for him. Maybe if I did, Royce would have been ranked lower. But still, Royce didn’t even look impressive in the playing time that he did get, and ranking him 11th is bad.
Result: INCORRECT
Jay Ajayi: Model: RB14, ADP: RB22, Actual Rank: 78th
“In what universe is Jay AJayi getting more carries than Melvin Gordon?”
After a solid 2016, Ajayi had a down year in 2017. My model expected him to bounce back, but that didn’t happen. He had a very good first game, but was then put on injured reserve after only three more games.
Result: INCORRECT
Melvin Gordon: Model: RB12, ADP: RB8, Actual Rank: 6th
“If McCoy finishes above Gordon I’ll shit a brick”
“Melvin Gordon at 12 is all I need to know”
When I posted my rankings on reddit, most of the comment section was criticizing me for ranking Melvin Gordon too low. I argued that I thought Austin Ekeler would be more involved this year. While that turned out to be true, my prediction about Gordon was way off, as he finished in 6th.
RESULT: INCORRECT
Jordan Howard: Model: RB17, ADP: RB12, Actual Rank: 20th
“The disrespect for Jordan Howard is tragic…especially since this is a standard league. Ranked below McCoy, Mixon, Royce Freeman, Ajayi and Henry? Come on now…”
I got plenty of criticism for putting Howard so low, especially with these rankings being for standard scoring. But after two years of being a top 10 running back, Howard finished in 20th, performing even worse than my model expected. In the offseason, he was traded for only a fifth round pick.
Result: CORRECT
Ezekiel Elliott: Model: RB2, ADP: RB4, Actual Rank: 5th
My model was very optimistic on Zeke, predicting that he would be the second best running back. While he didn’t quite live up to that, he still had a great season. An owner who selected Zeke would probably be pretty happy, given that the other running backs in that tier were Le’Veon Bell and David Johnson.
Result: Slightly Correct
Kareem Hunt: Model: RB5, ADP: RB9, Actual Rank: 8th
After the first eleven weeks of the season, Hunt had scored the third most points among running backs, and this prediction looked very good. Then after a video was released of him kicking a woman, he was released. Overall, he finished as the RB8, one spot above his ADP.
Result: Slightly Correct
Duke Johnson: Model: RB32, ADP: RB50, Actual Rank: 48th
My model expected that Duke and Carlos Hyde would be the surprising Browns running backs, and that Nick Chubb would be a disappointment. That turned out to be backwards, and Duke struggled to make an impact in a crowded Browns backfield.
Result: INCORRECT
Alvin Kamara: Model: RB4, ADP: RB6, Actual Rank: 4th
Although some people did have Kamara at the top of the second tier of RBs, most people predicted regression. And while that did happen, that was more than offset by an increased number of carries and 18 total touchdowns. Overall, he was the fourth highest scoring running back, which was exactly what my model predicted.
Result: CORRECT
Rex Burkhead: Model: Unranked, ADP: RB28, Actual Rank: 80th
Burkhead got injured during the season. But when he came back, he was stuck in a crowded backfield and never broke 40 rushing yards.
Result: CORRECT
Isaiah Crowell: Model: RB24, ADP: RB34, Actual Rank: 29th
Crowell had a better year than most people expected, but didn’t do as good as my model thought. He finished at 29th, exactly in the middle between my prediction and his ADP.
Result: Slightly Correct
Christian McCaffrey: Model: RB8, ADP: RB11, Actual Rank: 3rd
My model was pretty optimistic. In fact, I didn’t see any rankings that had CMC higher than 8th. But McCaffrey surpassed even that prediction, totaling almost 2000 yards from scrimmage and finishing as the 3rd highest scoring running back.
Result: CORRECT
Jamaal Williams: Model: RB37, ADP: RB27, Actual Rank: 46th
With Aaron Jones suspended for two games, Williams was the highest ranked Packers RB. But with the state of the Packers backfield unclear, as well as Williams’s struggles in 2017, my model was low on him. That turned out to be correct, as Williams got only 121 carries even with Ty Montgomery being traded midseason.
Result: CORRECT
Ronald Jones: Model: RB29, ADP: RB39, Actual Rank: 100th
Ronald Jones had a pretty awful year, and made this pick look very bad. He was a healthy scratch for the first three weeks and then had only 1.9 yards per carry when he actually got on the field.
Result: INCORRECT
Chris Carson: Model: RB38, ADP: RB29, Actual Rank: 14th
This prediction was a definite miss. My model had Carson four spots behind his projected backup, Rashaad Penny. In reality, Carson seized the starting job and finished fifth in the NFL in rushing yards.
Result: INCORRECT
Peyton Barber: Model: Unranked, ADP: RB31, Actual Rank: 26th
Barber slightly surpassed expectations, but my model didn’t even list him. This was probably a side effect of having Ronald Jones so high.
Result: INCORRECT
Carlos Hyde: Model: RB20, ADP: RB25, Actual Rank: 44th
Hyde actually had a pretty good start to the season. After six weeks, he had the 12th most points, but was then traded to the Jaguars to make room for Nick Chubb. Hyde struggled with his new team, with only 58 carries and 3.3 yards per carry, and finished in 44th.
Result: INCORRECT
Sony Michel: Model: RB28, ADP: RB35, Actual Rank: 25th
I was one of the highest on Michel, and he turned in a good season, getting over 200 carries and rushing for almost 1000 yards.
Result: CORRECT
Dion Lewis: Model: RB35, ADP: RB30, Actual Rank: 36th
After going from the Patriots to the Titans and splitting time with Derrick Henry, Lewis wasn’t expected to repeat his 2017 season. My model thought that he wasn’t downgraded enough, though, and ranked him at 35th. Lewis ended up finishing at 36th.
Result: CORRECT
Tally:
Correct: 9
Incorrect: 9
Slightly Correct: 4
Overall, the results are mixed. My model had some very big wins (Dalvin Cook, David Johnson, Jordan Howard) but also some big misses (Royce Freeman, Melvin Gordon, LeSean McCoy). Interestingly, my model seemed to be more accurate at predicting busts than predicting sleepers.
Now that we’ve looked at the individual bold predictions it made, let’s look at how the model did in general. I scoured the internet and found twenty nine other rankings made for the 2018 season. I went through all of them and calculated both their ECR (lower is better) and their weighted points (calculated by multiplying their #1 RB’s actual points by 25, their #2 RB’s actual points by 24 and so on for their top 20 RBs). Then I did the same thing for my model and compared the results.
| Expert |
ECR |
Weighted Points |
| Scout Fantasy Sports – Dr Roto |
2942.5 |
74171.7 |
| Yahoo – Pianowski |
3031.9 |
73959 |
| TheFootballGirl |
3036.7 |
73243.4 |
| Scout Fantasy Sports – Atkins |
3076.1 |
75640.2 |
| Scout Fantasy Sports – Brandon |
3082.9 |
75253.6 |
| FantasySixPack – Bond |
3114.5 |
73139.2 |
| Yahoo – Behrens |
3119.3 |
72471 |
| Razzball |
3147.1 |
73759.5 |
| FantasySixPack – Savill |
3149 |
73847.2 |
| WalterFootball |
3194.4 |
70000.6 |
| Scout Fantasy Sports – Childs |
3200.2 |
67176.1 |
| ESPN |
3236.9 |
74029.6 |
| FantasySixPack – Lott |
3250.6 |
72456.6 |
| Scout Fantasy Sports – Ronis |
3252.8 |
73284.5 |
| Yahoo – Del Don |
3253.4 |
69348.5 |
| FFToday |
3336.1 |
67260.7 |
| Yahoo – Evans |
3371.2 |
69082.8 |
| 5th Down Fantasy – Sablich |
3401.3 |
73186.4 |
| 5th Down Fantasy |
3417.4 |
70610.8 |
| SportingNews |
3425.4 |
71126.9 |
| FantasyShed |
3440.5 |
70217.4 |
| Yahoo – Loza |
3446.1 |
71419.3 |
| CBS – Dave Richard |
3479.6 |
72015.3 |
| Simple Model |
3651.6 |
70556.8 |
| FantasySixPack – Hamrick |
3670.9 |
70676.4 |
| Fantasy Football Index |
3734.8 |
65426.2 |
| RotoWorld |
3746.2 |
69722.8 |
| RotoProfessor |
3747.2 |
71809.1 |
| Complex Model |
3833.3 |
70478.1 |
| PitcherList |
3950.4 |
66787.5 |
| FakePigskin |
4059.7 |
66612.5 |
Overall, these results aren’t great. My simple model came in 24th out of 31 for ECR and my complex model came in 29th. The results for weighted points are better: the simple model came in 20th and the complex model came in 21st. These results are slightly misleading: I posted my results right before Jerick McKinnon got injured, and most of the other rankings didn’t include him.
Even if I take out the McKinnon prediction though, the results aren’t great. I was hoping that my model would blow the experts away and that didn’t happen. However, the results aren’t terrible for a first attempt. I’m looking forward to fixing the flaws in my model and giving it a try for 2019.
Verdict: The Machine needs to go back to school.