Compute the R^2 score of a model
This function is only valid for continuous datasets
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| real(kind=real32), | intent(in), | dimension(:,:) | :: | predicted | ||
| real(kind=real32), | intent(in), | dimension(:,:) | :: | expected |
pure function r2_score(predicted, expected) result(output) !! Compute the R^2 score of a model !! !! This function is only valid for continuous datasets implicit none ! Arguments real(real32), dimension(:,:), intent(in) :: predicted, expected real(real32), dimension(size(expected,2)) :: y_mean, rss, tss real(real32), dimension(size(expected,2)) :: output ! Local variables real(real32), parameter :: epsilon = 1.E-8_real32 !! Small value to avoid division by zero integer :: s !! Loop index do s = 1, size(expected,2) ! compute mean of true/expected y_mean(s) = sum(expected(:,s),dim=1) / size(expected,dim=1) ! compute total sum of squares tss(s) = sum( ( expected(:,s) - y_mean(s) ) ** 2._real32, dim=1 ) ! compute residual sum of squares rss(s) = sum( ( expected(:,s) - predicted(:,s) ) ** 2._real32, dim=1 ) ! compute accuracy (R^2 score) if(abs(rss(s)).lt.epsilon)then output(s) = 1._real32 elseif(abs(tss(s)).lt.epsilon.or.rss(s)/tss(s).gt.1._real32)then output(s) = 0._real32 else output(s) = 1._real32 - rss(s)/tss(s) end if end do end function r2_score