我正在为一组物种生成生态位模型,我想使用AUC作为生态位生态质量的指标.开发Maxent的Steven Phillips在他的Maxent手册中提供了用于计算R中AUC的代码.但是,我正在阅读报告部分AUC比率作为更健壮和概念上合理的度量的论文.我想我理解如何使用ROCR R软件包计算部分AUC,但是如何计算AUC比率?
这是Phillips的教程脚本:
presence<-read.csv("bradypus_variegatus_samplePredictions.csv")
background<-read.csv("bradypus_variegatus_backgroundPredictions.csv")
pp<-presence$Logistic.prediction
testpp<-pp[presence$Test.or.train=="test"]
trainpp<-pp[presence$Test.or.train=="train"]
bb<-background$logistic
combined<-c(testpp,bb)
label<-c(rep(1,length(testpp)),rep(0,length(bb)))
pred<-prediction(combined,label)
perf<-performance(pred,"tpr","fpr")
plot(perf,colorize=TRUE)
performance(pred,"auc")@y.values[[1]] #RETURNS AUC
AUC<-function(p,ind){
pres<-p[ind]
combined<-c(pres,bb)
label<-c(rep(1,length(pres)),rep(0,length(bb)))
predic<-prediction(combined,label)
return(performance(predic,'auc')@y.values[[1]])
}
b1<-boot(testpp,AUC,100) #RETURNS AUC WITH STANDARD ERROR
b1
Run Code Online (Sandbox Code Playgroud)
任何建议或建议将不胜感激!谢谢.
我正在使用 sklearn v 0.13.1 svm 来尝试解决二进制分类问题。我使用 kfold 交叉验证并计算 roc 曲线下的面积 (roc_auc) 来测试我的模型的质量。然而,对于某些折叠,roc_auc 小于 0.5,即使对于训练数据也是如此。那应该是不可能的吧?算法不应该总是有可能在它正在训练的数据上至少达到 0.5 吗?
这是我的代码:
classifier = svm.SVC(kernel='poly', degree=3, probability=True, max_iter=100000)
kf = cross_validation.KFold(len(myData), n_folds=3, indices=False)
for train, test in kf:
Fit = classifier.fit(myData[train], classVector[train])
probas_ = Fit.predict_proba(myData[test])
fpr, tpr, thresholds = roc_curve(classVector[test], probas_[:,1])
roc_auc = auc(fpr, tpr)
probas_ = Fit.predict_proba(myData[train])
fpr2, tpr2, thresholds2 = roc_curve(classVector[train], probas_[:,1])
roc_auc2 = auc(fpr2, tpr2)
print "Training auc: ", roc_auc2, " Testing auc: ", roc_auc
Run Code Online (Sandbox Code Playgroud)
输出如下所示:
Training auc: 0.423920939062 Testing auc: 0.388436883629 …Run Code Online (Sandbox Code Playgroud) 由于我有二进制响应的数据,但事件很少,我想通过拟合bgeva模型而不是gam模型来改进其预测。为了证明和比较它的预测准确性并将其与我尝试过的其他模型进行比较,我需要计算 AUC 并绘制 ROC 曲线。
问题是我的代码,它适用于glmand gam,不适用于bgevaobject. 确切地说,该函数的使用predict()打印了 Error:
no applicable method for 'predict' applied to an object of class "bgeva"
而我的朋友 Google 没有为我找到任何解决方案。
下面是从一个简单的例子bgeva()包和代码,我用于计算AUC并绘制ROC曲线glm和gam对象:
library(bgeva)
set.seed(0)
n <- 1500
x1 <- round(runif(n))
x2 <- runif(n)
x3 <- runif(n)
f1 <- function(x) (cos(pi*2*x)) + sin(pi*x)
f2 <- function(x) (x+exp(-30*(x-0.5)^2))
y <- as.integer(rlogis(n, location = -6 + 2*x1 + f1(x2) + f2(x3), scale = …Run Code Online (Sandbox Code Playgroud) 通过使用roc库我有一个理解问题.
我想用python绘制一条roc曲线 http://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_auc_score.html
我正在编写一个评估探测器(haarcascade,神经网络)并想要评估它们的程序.所以我已经将数据保存在文件中,格式如下:
0.5 TP
0.43 FP
0.72 FN
0.82 TN
...
Run Code Online (Sandbox Code Playgroud)
TP表示真阳性,FP表示假阳性,FN表示假阴性,TN表示真阴性
我解析它并用这个数据集填充4个数组.
然后我想把它放进去
fpr, tpr = sklearn.metrics.roc_curve(y_true, y_score, average='macro', sample_weight=None)
Run Code Online (Sandbox Code Playgroud)
但是怎么做呢?在我的情况下y_true和y_score是什么?之后,我把它放到fpr,tpr中
auc = sklearn.metric.auc(fpr, tpr)
Run Code Online (Sandbox Code Playgroud) 我有一个包含 6 个类别的数据集,我想绘制多类别分类的 ROC 曲线。Achim Zeileis 给出的第一个答案非常好。
但这仅适用于二项式分类。我得到的错误是Error in prediction, Number of classes is not equal to 2。有人做过多类分类吗?
这是我正在尝试做的一个简单的例子。数据 <- read.csv("colors.csv")
假设data$cType值6(或级别)为(红色、绿色、蓝色、黄色、黑色和白色)
有没有办法为这 6 个类别绘制 ROC 曲线?任何超过 2 类的工作示例将不胜感激。
我正在尝试获取GBTClassifier的ROC曲线.
一种方法是重用BinaryClassificationMetrics,但文档中给出的路径(https://spark.apache.org/docs/latest/mllib-evaluation-metrics.html)仅为ROC曲线提供了4个值,如:
[0.0|0.0]
[0.0|0.9285714285714286]
[1.0|1.0]
[1.0|1.0]
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用"概率"列而不是"预测".但是,如果GBTClassifier我没有它,这个解决方案主要适用于RandomForestClassifier.
如何从BinaryClassificationMetrics绘制ROC曲线和精确回忆曲线
那么为任意分类器获得具有足够点的ROC曲线的一般/常用方法是什么?
我正在尝试计算我构建的硬投票分类器的 roc_auc 。我用可重现的示例来展示代码。现在我想计算 roc_auc 分数并绘制 ROC 曲线,但不幸的是我收到以下错误:当 vote='hard' 时,predict_proba 不可用
# Voting Ensemble for Classification
import pandas
from sklearn import datasets
from sklearn import model_selection
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.ensemble import VotingClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.naive_bayes import MultinomialNB
from sklearn.cross_validation import StratifiedShuffleSplit
from sklearn.model_selection import cross_val_predict
from sklearn.model_selection import cross_val_score
from sklearn.metrics import make_scorer,confusion_matrix, f1_score, precision_score, recall_score, cohen_kappa_score,accuracy_score,roc_curve
import numpy as np
np.random.seed(42)
iris = datasets.load_iris()
X = iris.data[:, …Run Code Online (Sandbox Code Playgroud) 我正在尝试按照 sklearn 文档中提供的示例绘制具有交叉验证的接收器操作特征 (ROC) 曲线。但是,以下导入ImportError在python2和中都给出了, python3。
from sklearn.metrics import plot_roc_curve
Run Code Online (Sandbox Code Playgroud)
错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: cannot import name plot_roc_curve
Run Code Online (Sandbox Code Playgroud)
python-2.7 sklearn版本: 0.20.2.
python-3.6 sklearn版本: 0.21.3.
我发现以下导入工作正常,但与plot_roc_curve.
from sklearn.metrics import roc_curve
Run Code Online (Sandbox Code Playgroud)
被plot_roc_curve弃用?有人可以尝试代码并让我知道 sklearn 版本是否有效吗?
这段代码可以画出一条带有置信区间的roc曲线:
ciobj <- ci.se(obj, specificities=seq(0, 1, l=25))
dat.ci <- data.frame(x = as.numeric(rownames(ciobj)),
lower = ciobj[, 1],
upper = ciobj[, 3])
ggroc(obj) + theme_minimal() + geom_abline(slope=1, intercept = 1, linetype = "dashed", alpha=0.7, color = "grey") + coord_equal() +
geom_ribbon(data = dat.ci, aes(x = x, ymin = lower, ymax = upper), fill = "steelblue", alpha= 0.2) + ggtitle(capture.output(obj$ci))
Run Code Online (Sandbox Code Playgroud)
这段代码可以一起绘制多条roc曲线
roc.list <- roc(outcome ~ s100b + ndka + wfns, data = aSAH)
g.list <- ggroc(roc.list)
g.list
Run Code Online (Sandbox Code Playgroud)
但我无法将它们组合在一起:
ggroc(roc.list) + theme_minimal() + geom_abline(slope=1, …Run Code Online (Sandbox Code Playgroud) 我正在尝试确定roc_auc_score验证集上的拟合模型。
我看到有关函数输入的一些相互矛盾的信息。
文档说:
“y_score 形状为 (n_samples,) 或 (n_samples, n_classes) 的类似数组目标分数。在二元和多标签情况下,这些可以是概率估计或非阈值决策值(由某些分类器上的 Decision_function 返回)。在多类情况下,这些必须是总和为 1 的概率估计。二元情况需要一个形状 (n_samples,),并且分数必须是具有更大标签的类的分数。多类和多标签情况需要一个形状 (n_samples) , n_classes)。在多类情况下,类分数的顺序必须对应于标签的顺序(如果提供),否则对应于 y_true 中标签的数字或字典顺序。
不确定这到底需要什么:1)针对测试集中实际 y 值的预测概率或 2)针对测试集中实际 y 值的类预测
我一直在搜索,在二元分类情况(我的兴趣)中,有些人使用预测概率,而另一些人使用实际预测(0 或 1)。换句话说:
适配型号:
model.fit(X_train, y_train)
Run Code Online (Sandbox Code Playgroud)
使用以下任一方法:
y_preds = model.predict(X_test)
Run Code Online (Sandbox Code Playgroud)
或者:
y_probas = model.predict_proba(X_test)
Run Code Online (Sandbox Code Playgroud)
我发现:
roc_auc_score(y_test, y_preds)
Run Code Online (Sandbox Code Playgroud)
和:
roc_auc_score(y_test, y_probas[:,1]) # probabilites for the 1 class
Run Code Online (Sandbox Code Playgroud)
产生截然不同的结果。
哪一个是正确的?
我还发现,要实际绘制 ROC 曲线,我需要使用概率。
任何指导表示赞赏。