This is usually (intentionally) not possible.
Well designed wallets attempt to obfuscate the change vs. non-change addresses to make it harder to find out which part is the payment for privacy reasons.
Traditionally, some clues existed, which are now fixed in any decent wallet:
- The change would go to an address of the same type as the input - This was an issue when P2SH was new, and when segwit just started out. These days, wallets such as Bitcoin Core will try and match the change output to a similar address type as your regular output. That is to say, if you use a native-segwit address to send BTC to a P2SH address, Bitcoin Core will send the change output to a P2SH address as well, even though your wallet is predominantly native segwit addresses
- Change outputs often appeared last in the list of outputs - This allows people to guess at the change address by simply looking at the output ordering. Today, many wallets implement BIP 69, which orders outputs lexicographically, thus removing any guarantee that the change address will be the last output.
It should be noted that the above are not adopted by every wallet. In fact, many systems, such as several exchanges' withdrawal systems, will still send the change to the last output, and also to an address of the same type as the input. That said, there are currently enough wallets that do follow some/all of the above to make change detection unreliable without additional data (such as knowing if some input was spent by a specific wallet program, and how that wallet would behave)