Well, at least for the ID and sequence fields, these can be any 16-bit numbered combination and the kernel will accept the packet and forward it to all registered ICMP socket handlers.
But if the checksum field is incorrect, the receiving kernel will not pass the header up to the handlers (it will however to link layer sniffers). Also, from what I tested, if you change the type/code flags to incorrect combinations of known numbers, or numbers undefined by the protocol, the receiving kernel does not pass that to handlers (but it is still seen by link layer sniffers).
Note I didn't use scapy, just straight python/socket code, and my system is Linux.