2017-12-07 6 views
-1

에 대한 호출 득점으로 특이성을 정의하는 방법 :내가 모델의 숫자의 성능을 비교하기 위해이 코드를 사용하고 모델 평가

from sklearn import model_selection 

X = input data 
Y = binary labels 

models = [] 
models.append(('LR', LogisticRegression())) 
models.append(('LDA', LinearDiscriminantAnalysis())) 
models.append(('KNN', KNeighborsClassifier())) 
models.append(('CART', DecisionTreeClassifier())) 

results = [] 
names = [] 
scoring = 'accuracy' 

for name, model in models: 
    kfold = model_selection.KFold(n_splits=10, random_state=7) 
    cv_results = model_selection.cross_val_score(model, X, Y, cv=kfold,scoring=scoring) 
    results.append(cv_results) 
    names.append(name) 
    msg = "%s: %.2f (%.2f)" % (name, cv_results.mean(), cv_results.std()) 
    print(msg) 
내가 득점으로 '정확성'과 '리콜'을 사용할 수 있으며 이러한 것

정확성과 감도를 부여하십시오. 나는 나에게 '특이'

특이성 = TN/(TN + FP)를 제공하는 득점을 만들 수있는 방법 TN 및 FP가 혼란 매트릭스

I에서 진정한 부정과 거짓 양의 값이다

시도

def tp(y_true, y_pred): 
error= confusion_matrix(y_true, y_pred)[0,0]/(confusion_matrix(y_true,y_pred)[0,0] + confusion_matrix(y_true, y_pred)[0,1]) 
return error 

my_scorer = make_scorer(tp, greater_is_better=True) 

다음

cv_results = model_selection.cross_val_score(model, X,Y,cv=kfold,scoring=my_scorer) 

하지만 그것은하지 않습니다 n_split에 대한 작업> = 10 내가 my_scorer의 계산이 오류가

IndexError : 당신은 scikit의 특이성을 얻을 수 있지만, 당신이 실제로 얻을 수있는 것은 할 수없는 일

+0

'model_selection'은 갑자기 어디에서 왔습니까? –

+1

TN 및 FP 란 무엇입니까? –

+0

아니요. '정확도'는 정확도가 아니라 정확도를 나타냅니다. 정밀도를 위해 '정밀도'를 사용해야합니다. 사용 가능한 모든 채점 방법에 대해서는 여기를 참조하십시오 : http://scikit-learn.org/stable/modules/model_evaluation.html. –

답변

0

인덱스 1 크기로 축 1의 범위를 벗어났습니다 이는 fpr은 다음과 같습니다

fpr = 1 - specificity 

그래서 특이성을 얻기를 위해, 당신은 단지,632을 사용하여 계산 될 수있다 1.

FPR에서 fpr을 뺄 필요 10.

import numpy as np 
from sklearn.metrics import roc_curve 
y_true = np.array([1, 1, 2, 2]) 
y_pred = np.array([0.1, 0.4, 0.35, 0.8]) 
fpr, tpr, thresholds = roc_curve(y_true, y_pred) 

print(fpr) 
# array([ 0. , 0.5, 0.5, 1. ]) 

specificity = 1 - fpr 
# array([ 1. , 0.5, 0.5, 0. ]) 

위의 경우 작동하려면 위의 모델을 훈련하여 y_pred를 계산해야합니다.

당신이 cross_val_score 내부에이를 사용하려면, 사용자 지정이 같은 득점 할 수 있습니다 :

from sklearn.metrics import roc_curve 
def specificity(y_true, y_pred): 
    fpr, tpr, thresholds = roc_curve(y_true, y_pred) 
    speci = 1 - fpr 
    return speci 

from sklearn.metrics import make_scorer 
scorer = make_scorer(specificity) 

: 그리고

cv_results = model_selection.cross_val_score(model, X, Y, cv=kfold,scoring=scorer) 

참고 : 위의 코드는 올바른 결과를 얻을 수 이진수는 y입니다.

+0

@Vivek 쿠마 감사합니다. 특이성을 계산하는 방법이 있어야합니다. 이건 어때 : def tp (y_true, y_pred) : 오류 = confusion_matrix (y_true, y_pred) [0,0]/(혼란 _matrix (y_true, y_pred) [0,0] + 혼란 _matrix (y_true, y_pred) [0, 1]) 반환 오류 my_scorer = make_scorer (tp, greater_is_better = True) –

+0

@JJoe 안녕하세요, 저는이 답변을 실제로 특이성을 계산하지만 실수로 작성된 민감도로 계산했습니다. 나는 대답을 바로 잡았다. –

+0

귀하의 요지를 봅니다. 그러나 그것은 효과가 없었습니다. 이 오류가 발생합니다 : ValueError : 채점은 [1. 0.] () 대신 숫자를 반환해야합니다. 즉, 나는 confusion_matrix를 사용하여 Specificity를 정의했으며 작동했습니다! –