我正在使用此页面执行逻辑回归.我的代码如下.
mydata <- read.csv("http://www.ats.ucla.edu/stat/data/binary.csv")
mylogit <- glm(admit ~ gre, data = mydata, family = "binomial")
summary(mylogit)
prob=predict(mylogit,type=c("response"))
mydata$prob=prob
Run Code Online (Sandbox Code Playgroud)
运行此代码后,mydata dataframe有两列 - 'admit'和'prob'.这两列不应该足以获得ROC曲线吗?
如何获得ROC曲线.
其次,通过嘲笑mydata,似乎模型正在预测可能性admit=1.
那是对的吗?
如何找出模型预测的特定事件?
谢谢
更新:似乎以下三个命令非常有用.它们提供了最大精度的截止点,然后有助于获得ROC曲线.
coords(g, "best")
mydata$prediction=ifelse(prob>=0.3126844,1,0)
confusionMatrix(mydata$prediction,mydata$admit
Run Code Online (Sandbox Code Playgroud) TLDR:scikit的roc_curve功能仅为某个数据集返回3个点.为什么会这样,我们如何控制多少积分才能回来?
我正试图绘制一条ROC曲线,但始终得到一个"ROC三角形".
lr = LogisticRegression(multi_class = 'multinomial', solver = 'newton-cg')
y = data['target'].values
X = data[['feature']].values
model = lr.fit(X,y)
# get probabilities for clf
probas_ = model.predict_log_proba(X)
Run Code Online (Sandbox Code Playgroud)
只是为了确保长度合适:
print len(y)
print len(probas_[:, 1])
Run Code Online (Sandbox Code Playgroud)
两者都返回13759.
然后运行:
false_pos_rate, true_pos_rate, thresholds = roc_curve(y, probas_[:, 1])
print false_pos_rate
Run Code Online (Sandbox Code Playgroud)
返回[0. 0.28240129 1.]
如果我调用threasholds,我得到数组([0.4822225,-0.5177775,-0.84595197])(总是只有3分).
因此,我的ROC曲线看起来像三角形并不奇怪.
我无法理解的是为什么scikit roc_curve只返回3分.非常感谢.
我使用scikit-learn训练了ExtraTreesClassifier(gini索引),它非常适合我的需求.准确性不是很好,但使用10倍交叉验证,AUC为0.95.我想在我的工作中使用这个分类器.我对ML很新,所以如果我问你一些概念错误的话,请原谅我.
我绘制了一些ROC曲线,通过它,我似乎有一个特定的阈值,我的分类器开始表现良好.我想在拟合的分类器上设置这个值,所以每次我调用预测时,分类器都会使用该阈值,我可以相信FP和TP的速率.
我也来到这篇文章(scikit .predict()默认阈值),其中声明阈值不是分类器的通用概念.但由于ExtraTreesClassifier的方法是predict_proba,并且ROC曲线也与thresdholds定义有关,所以在我看来我应该可以指定它.
我没有找到任何参数,也没有找到任何类/接口来实现它.如何使用scikit-learn为训练有素的ExtraTreesClassifier(或任何其他人)设置阈值?
非常感谢,科利斯
我正在构建接收器操作特性(ROC)曲线,以使用曲线下面积(AUC)评估分类器(更多详细信息,在帖子末尾).不幸的是,曲线上的点通常低于对角线.例如,我最终得到的图形看起来像这里的图形(蓝色的ROC曲线,灰色的标识线):

第三点(0.3,0.2)低于对角线.要计算AUC,我想修复这些顽抗点.
对于曲线上的点(fp,tp),执行此操作的标准方法是将其替换为点(1-fp,1-tp),这相当于交换分类器的预测.例如,在我们的例子中,我们麻烦的点A(0.3,0.2)变为B点(0.7,0.8),我在上面链接的图像中用红色表示.
就我的参考资料来说,这与处理这个问题有关.问题是,如果将新点添加到新的ROC中(并删除坏点),最终会得到如图所示的非单调ROC曲线(红色是新的ROC曲线,蓝色虚线是旧的):

在这里,我被卡住了.如何修复此ROC曲线?
我是否需要重新运行我的分类器与数据或类以某种方式转换为考虑到这种奇怪的行为?我查看了一篇相关的论文,但如果我没有弄错的话,它似乎正在解决一个与此不同的问题.
根据一些细节:我仍然拥有所有原始阈值,fp值和tp值(以及每个数据点的原始分类器的输出,输出只是从0到1的标量,这是一个概率估计班级成员).我在matlab中以perfcurve函数开始这样做.
我正在训练ML逻辑分类器使用python scikit-learn对两个类进行分类.他们的数据非常不平衡(约14300:1).我的准确度和ROC-AUC几乎达到100%,但精度,召回率和f1得分均为0%.我知道准确性通常对非常不平衡的数据没有用,但为什么ROC-AUC测量结果也接近完美?
from sklearn.metrics import roc_curve, auc
# Get ROC
y_score = classifierUsed2.decision_function(X_test)
false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_score)
roc_auc = auc(false_positive_rate, true_positive_rate)
print 'AUC-'+'=',roc_auc
1= class1
0= class2
Class count:
0 199979
1 21
Accuracy: 0.99992
Classification report:
precision recall f1-score support
0 1.00 1.00 1.00 99993
1 0.00 0.00 0.00 7
avg / total 1.00 1.00 1.00 100000
Confusion matrix:
[[99992 1]
[ 7 0]]
AUC= 0.977116255281
Run Code Online (Sandbox Code Playgroud)
以上是使用逻辑回归,下面是使用决策树,决策矩阵看起来几乎相同,但AUC有很大不同.
1= class1
0= class2
Class count:
0 199979
1 21 …Run Code Online (Sandbox Code Playgroud) 我正在尝试理解和绘制不同类型分类器的TPR/FPR.我在R中使用kNN,NaiveBayes和Decision Trees.对于kNN,我正在做以下事情:
clnum <- as.vector(diabetes.trainingLabels[,1], mode = "numeric")
dpknn <- knn(train = diabetes.training, test = diabetes.testing, cl = clnum, k=11, prob = TRUE)
prob <- attr(dpknn, "prob")
tstnum <- as.vector(diabetes.testingLabels[,1], mode = "numeric")
pred_knn <- prediction(prob, tstnum)
pred_knn <- performance(pred_knn, "tpr", "fpr")
plot(pred_knn, avg= "threshold", colorize=TRUE, lwd=3, main="ROC curve for Knn=11")
Run Code Online (Sandbox Code Playgroud)
其中diabetes.trainingLabels [,1]是我要预测的标签(类)的载体,diabetes.training是训练数据,diabetest.testing是testing.data.
存储在prob属性中的值是一个数字向量(0到1之间的小数).我将类标签因子转换为数字,然后我可以将它与ROCR库中的谓词/性能函数一起使用.不是100%肯定我做得对,但至少它是有效的.
对于NaiveBayes和Decision Trees tho,在预测函数中使用prob/raw参数我没有得到单个数字向量,而是列表或矩阵的向量,其中指定了每个类的概率(我猜),例如:
diabetes.model <- naiveBayes(class ~ ., data = diabetesTrainset)
diabetes.predicted <- predict(diabetes.model, diabetesTestset, type="raw")
Run Code Online (Sandbox Code Playgroud)
和糖尿病.预测是:
tested_negative tested_positive
[1,] 5.787252e-03 0.9942127
[2,] 8.433584e-01 0.1566416 …Run Code Online (Sandbox Code Playgroud) 这是我的代码,我尝试计算 ROC 分数,但我遇到 ValueError 问题:不支持多类格式。我已经在寻找 sci-kit learn 但它没有帮助。最后,我仍然有 ValueError:不支持多类格式。
这是我的代码
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import BaggingClassifier
from sklearn.metrics import confusion_matrix,zero_one_loss
from sklearn.metrics import classification_report,matthews_corrcoef,accuracy_score
from sklearn.metrics import roc_auc_score, auc
dtc = DecisionTreeClassifier()
bc = BaggingClassifier(base_estimator=dtc, n_estimators=10, random_state=17)
bc.fit(train_x, train_Y)
pred_y = bc.predict(test_x)
fprate, tprate, thresholds = roc_curve(test_Y, pred_y)
results = confusion_matrix(test_Y, pred_y)
error = zero_one_loss(test_Y, pred_y)
roc_auc_score(test_Y, pred_y)
FP = results.sum(axis=0) - np.diag(results)
FN = results.sum(axis=1) - np.diag(results)
TP = np.diag(results)
TN = results.sum() - (FP + FN …Run Code Online (Sandbox Code Playgroud) R的ROCR软件包为ROC曲线绘图提供了选项,可以沿着曲线对代码和标签阈值进行着色:

我能用Python获得的最接近的东西就像
from sklearn.metrics import roc_curve
fpr, tpr, thresholds = roc_curve(qualityTrain.PoorCare, qualityTrain.Pred1)
plt.plot(fpr, tpr, label='ROC curve', color='b')
plt.axes().set_aspect('equal')
plt.xlim([-0.05, 1.05])
plt.ylim([-0.05, 1.05])
Run Code Online (Sandbox Code Playgroud)
这使

是否有提供与R标记(使用print.cutoffs.at)和颜色代码(使用colorize)阈值能力相当的功能的软件包?据推测,这些信息是thresholds由sklearn.metrics.roc_curve,但是我无法弄清楚如何使用它来为代码着色和标记图形.
我有一些我不太了解的机器学习结果.我正在使用python sciki-learn,拥有大约14个功能的200多万个数据.对于精确回忆曲线,'ab'的分类看起来非常差,但是Ab的ROC看起来和大多数其他群体的分类一样好.有什么可以解释的?
machine-learning performance-testing roc scikit-learn precision-recall
我正在做不同的文本分类实验.现在我需要计算每项任务的AUC-ROC.对于二进制分类,我已经使用此代码:
scaler = StandardScaler(with_mean=False)
enc = LabelEncoder()
y = enc.fit_transform(labels)
feat_sel = SelectKBest(mutual_info_classif, k=200)
clf = linear_model.LogisticRegression()
pipe = Pipeline([('vectorizer', DictVectorizer()),
('scaler', StandardScaler(with_mean=False)),
('mutual_info', feat_sel),
('logistregress', clf)])
y_pred = model_selection.cross_val_predict(pipe, instances, y, cv=10)
# instances is a list of dictionaries
#visualisation ROC-AUC
fpr, tpr, thresholds = roc_curve(y, y_pred)
auc = auc(fpr, tpr)
print('auc =', auc)
plt.figure()
plt.title('Receiver Operating Characteristic')
plt.plot(fpr, tpr, 'b',
label='AUC = %0.2f'% auc)
plt.legend(loc='lower right')
plt.plot([0,1],[0,1],'r--')
plt.xlim([-0.1,1.2])
plt.ylim([-0.1,1.2])
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
plt.show()
Run Code Online (Sandbox Code Playgroud)
但现在我需要为多类分类任务执行此操作.我读到了我需要对标签进行二值化的地方,但我真的不知道如何计算多类分类的ROC.提示?
python roc scikit-learn text-classification multiclass-classification
roc ×10
scikit-learn ×6
python ×5
r ×3
matlab ×1
matplotlib ×1
regression ×1
spyder ×1
statistics ×1
threshold ×1
validation ×1