The generator expression in the sum() just applies a one-argument function so it can be replaced with map(). And instead of computing a sign at each step, it is simpler and faster to negate the roots at the outset.
There actually is a combinations(..., 0) in Python, and it returns [()] which is consistent with math.comb(4, 0) returning 1. Also, prod([]) returns 1. Putting those facts together helps eliminate special case at the end point.
Here's the simplified code:
from itertools import combinations
from operator import neg
from math import prod
def coeffs_from_roots(roots):
roots = list(map(neg, roots))
return [
sum(map(prod, combinations(roots, k)))
for k in range(len(roots) + 1)
]