Multi-Output Prediction: Theory and Practice