Python 3.x 如何将特异性定义为模型评估的可调用记分器

Python 3.x 如何将特异性定义为模型评估的可调用记分器,python-3.x,machine-learning,scikit-learn,Python 3.x,Machine Learning,Scikit Learn,我使用此代码来比较多个型号的性能: from sklearn import model_selection X = input data Y = binary labels models = [] models.append(('LR', LogisticRegression())) models.append(('LDA', LinearDiscriminantAnalysis())) models.append(('KNN', KNeighborsClassifier())) model

我使用此代码来比较多个型号的性能:

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是混淆矩阵中的真负值和假正值

我试过这个

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,它将不起作用 我得到这个错误是为了计算我的分数


索引器:索引1超出轴1的范围,大小为1

您无法在scikit中获得特异性,但实际上可以获得的是
fpr
,即:

fpr = 1 - specificity 
因此,为了获得特异性,只需从1中减去
fpr

可使用以下公式计算fpr

但要使上述方法起作用,您需要通过训练模型来计算y_pred

如果要在cross_val_分数中使用此项,可以制作如下自定义分数:

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)

注意:如果您将二元分类器的
召回评分
参数更改为
pos\u label=0
,则上述代码仅会给出二进制
y
的正确结果,您将获得特异性(默认值为灵敏度,
pos\u label=1


model_selection
突然从何而来?TN和FP是什么?否。“准确度”将给出准确度,而不是准确度。您需要使用“精度”来表示精度。请参阅此处了解所有可用的评分方法:。谢谢@Vivek Kumar。应该有一种计算特异性的方法。这个怎么样:def tp(y_-true,y_-pred):error=混乱矩阵(y_-true,y_-pred)[0,0]/(混乱矩阵(y_-true,y_-pred)[0,0]+混乱矩阵(y_-true,y_-pred)[0,1])return error my_-scorer=make_-scorer(tp越大越好)=JJoe嗨,我给出这个答案是为了实际计算特异性,但是错误地写了敏感度。我现在已经更正了答案,我明白你的意思了。但它没有起作用。我得到这个错误:ValueError:scoring必须返回一个数字,取而代之的是[1.0.]()。这就是说,我使用混淆矩阵定义了特异性,它起了作用!
cv_results = model_selection.cross_val_score(model, X, Y, cv=kfold,scoring=scorer)
scoring = {
    'accuracy': make_scorer(accuracy_score),
    'sensitivity': make_scorer(recall_score),
    'specificity': make_scorer(recall_score,pos_label=0)
}