[ Python ] 모델 예측 TOP N번까지 값 뽑고 N번까지 Accuracy 계산하기

2019. 7. 16. 20:51분석 Python/구현 및 자료

728x90

예측 정확도를 뽑다보면, 추천도 그렇듯이 TOP1만 보는 것이 아니라 TOP N번까지 보는 경우가 많다.

 

이런 경우 TOP N 번까지 결과값과 TOP N번까지 고려했을 때 정확도를 궁금해하는 경우가 흔하다.

 

Python으로는 다음과 같이 하면 된다!

 

예를 들어 이런 다중 클래스에서 예측을 한다고 하자.

아무리 모델이 좋아도 1개의 클래스를 예측하는 것에 성능을 왠만하면 기대하기 어려울 것이다.

pd.DataFrame(pred).head()

방법은 다음과 같다 top_n 함수를 잘 보면 된다.

저 함수를 이용해서 N번째로 큰 값을 찾을 수 있다.

import numpy as np

def top_n(data , n ) :
    return list(map(lambda x: np.argpartition(x, -n)[-n:][0], data ))

"""
N : TOP 어디까지 볼지
"""

N = 3
Predict = pd.DataFrame([top_n(pred , i) for i in np.arange(1,N+1)]).T
Predict.columns = ["Top" + i  for i in list(np.arange(1,N+1).astype(str)) ]

 

 

 

 

 

 

 

그 다음으로는 실제 test label을 붙여준다.

from sklearn import preprocessing

"""
TRAIN의 Predict은 Train으로 Label Encoder로 InverseTransform 진행합니다.
"""

trainle = preprocessing.LabelEncoder()
trainle.fit(train[target])
Predict[target] = test[target]
Predict.head()

다음으로는 inverse transform을 통해서 실제 라벨로 복원해주는 과정이다.

for i in Predict.columns.tolist() :
    if re.search("Top" , i) is not None :
        Predict[i] = trainle.inverse_transform(Predict[i])
    else :
        pass

TOP N번까지의 정확도 함수 구현 

def top_n_acc(data , n) :
    total = 0
    for i in np.arange(1, n+1) :
        total +=sum(data[target] == data["Top" + str(i)])
    return print("Top~{} ACC : {:.4f}".format(n , total/data.shape[0]))

 

이런식으로 여러개의 클래스가 있고 평가할 때 Top 몇 순위를 보고 싶어할 때 다음과 같이 하면 된다!

 

- 끝 -

728x90