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)
}