r2_score Function

public pure function r2_score(predicted, expected) result(output)

Compute the R^2 score of a model

This function is only valid for continuous datasets

Arguments

Type IntentOptional Attributes Name
real(kind=real32), intent(in), dimension(:,:) :: predicted
real(kind=real32), intent(in), dimension(:,:) :: expected

Return Value real(kind=real32), dimension(size(expected,2))


Source Code

  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