simpler confirm
pretty dictionary comprehension
spaces instead of tabs
clean up other whitespace

The trailing whitespace should be gotten rid of - the leading whitespace
isn't such a big deal imo
I'm not sure what this means here - functional has several meanings
the for loop doesn't need this - happens anyway
questions about picked and probabilities
factor out student from line function
This name also confuses me

I guess these are functions that involve multiple rosters, or
that touch the filesystem?
I find the code generally over-commented

This is fine really - comments are supposed to explain what
you're doing if it's non-obvious from the code, and what's
obvious is of course subjective. Generally though explaining
what a function does should happen in a docstring, or in the
name of a function. If you're tempted to use a comment to describe
what lines of code do, consider making that line or two their own
function and naming the function like you were going to write the
comment

Comments are scary if they just describe the code because one might
change the code without changing the comment.
Similarly, your section headings are unusual

Typically people use
* modules to group sets of function
* classes to group sets of functions
* similar names to group sets of functions

and still use comments like this some, but the need
for them is diminished.
take_attendance and scale should always happen

If take_attendance and scale really should always happen
together, then we should bundle them into a function to
prevent ourselves from calling either separately unless we
really mean to. This (may have) revealed a bug - did you mean
to take_attendance without scaling on line 109?
bundle more functions
consider saving after every action, instead of waiting to exit

that way in a crash we'll still have saved data
consider using a data structure to store the options in the main

If you generate the message from the options, the message could
never get out of sync with the options