How to return change (utxo - inputs) to output address? I've been learning to create bitcoin transactions for 3 weeks now, but keep paying the entire unspent_outputs - inputs as fees, even if the transacted amount was like 1/100 th of the outputs. How do I put the unspent output back into the output address ?

      var utxo = {
                   "txId" : "",
                   "outputIndex" : "",
                   "address" : "",
                   "script" : "",
                   "satoshis" : ""
                 }

       var transaction = new bitcore.Transaction()
       .from(utxo)
       .to(address, satoshis)
       .sign(privateKeyWIF);

      var tx = transaction.toString()
When you create a transaction, all inputs are used up completely. 

You then have to specify the destination addresses of the input money. Any amount without destination becomes available as transaction fee. Hence, you have to define the recipient, and send back the change to yourself.

In other words, add one of your own addresses as a second destination and assign the remainder of your inputs there.

If you haven't been doing so, you should experiment with transaction creation on the testnet. There you can learn without cost, because it behaves like Bitcoin, but its tokens are worthless.