使用 python 和 Scikit Learn 为 K-NN 机器学习算法实现 ROC 曲线
Implementing ROC Curves for K-NN machine learning algorithm using python and Scikit Learn
我目前正在尝试为我的 kNN 分类算法实现 ROC 曲线。我知道 ROC 曲线是真阳性率与假阳性率的关系图,我只是在努力从我的数据集中找到这些值。我将 'autoimmune.csv' 导入到我的 python 脚本中,并在其上导入 运行 kNN 算法以输出精度值。 Scikit-learn.org 文档显示,要生成 TPR 和 FPR,我需要传入 y_test 和 y_scores 的值,如下所示:
fpr, tpr, threshold = roc_curve(y_test, y_scores)
我只是在为我应该使用的这些值而苦苦挣扎。
提前感谢您的帮助,如果我错过了什么,我深表歉意,因为这是我的第一个 post。
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.metrics import roc_curve
from sklearn.metrics import auc
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
data = pd.read_csv('./autoimmune.csv')
X = data.drop(columns=['autoimmune'])
y = data['autoimmune'].values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
knn = KNeighborsClassifier(n_neighbors = 10)
knn.fit(X_train,y_train)
knn.predict(X_test)[0:10]
knn.score(X_test,y_test)
print("Test set score: {:.4f}".format(knn.score(X_test, y_test)))
knn_cv = KNeighborsClassifier(n_neighbors=10)
cv_scores = cross_val_score(knn_cv, X, y, cv=10)
print(cv_scores)
print('cv_scores mean:{}' .format(np.mean(cv_scores)))
y_scores = cross_val_score(knn_cv, X, y, cv=76)
fpr, tpr, threshold = roc_curve(y_test, y_scores)
roc_auc = auc(fpr, tpr)
print(roc_auc)
plt.title('Receiver Operating Characteristic')
plt.plot(fpr, tpr, 'b', label = 'AUC = %0.2f' % roc_auc)
plt.legend(loc = 'lower right')
plt.plot([0, 1], [0, 1],'r--')
plt.xlim([0, 1])
plt.ylim([0, 1])
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
plt.title('ROC Curve of kNN')
plt.show()
如果您查看 documentation for roc_curve()
,您将看到有关 y_score
参数的以下信息:
y_score : array, shape = [n_samples] Target scores, can either be
probability estimates of the positive class, confidence values, or
non-thresholded measure of decisions (as returned by
“decision_function” on some classifiers).
您可以使用 sklearn 中的 predict_proba()
method of the KNeighborsClassifier
获得概率估计。这个 returns 一个带有两列的 numpy 数组用于二进制 class 化,一列用于负数和正数 class。对于 roc_curve()
函数,您想使用 正 class 的概率估计,因此您可以替换您的:
y_scores = cross_val_score(knn_cv, X, y, cv=76)
fpr, tpr, threshold = roc_curve(y_test, y_scores)
与:
y_scores = knn.predict_proba(X_test)
fpr, tpr, threshold = roc_curve(y_test, y_scores[:, 1])
请注意,您需要如何将第二列的所有行 [:, 1]
用于 select 正 class 的概率估计。这是一个使用威斯康星乳腺癌数据集的最小可重现示例,因为我没有你的 autoimmune.csv
:
from sklearn.datasets import load_breast_cancer
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_curve
from sklearn.metrics import auc
import matplotlib.pyplot as plt
X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
knn = KNeighborsClassifier(n_neighbors = 10)
knn.fit(X_train,y_train)
y_scores = knn.predict_proba(X_test)
fpr, tpr, threshold = roc_curve(y_test, y_scores[:, 1])
roc_auc = auc(fpr, tpr)
plt.title('Receiver Operating Characteristic')
plt.plot(fpr, tpr, 'b', label = 'AUC = %0.2f' % roc_auc)
plt.legend(loc = 'lower right')
plt.plot([0, 1], [0, 1],'r--')
plt.xlim([0, 1])
plt.ylim([0, 1])
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
plt.title('ROC Curve of kNN')
plt.show()
这会产生以下 ROC 曲线:
我目前正在尝试为我的 kNN 分类算法实现 ROC 曲线。我知道 ROC 曲线是真阳性率与假阳性率的关系图,我只是在努力从我的数据集中找到这些值。我将 'autoimmune.csv' 导入到我的 python 脚本中,并在其上导入 运行 kNN 算法以输出精度值。 Scikit-learn.org 文档显示,要生成 TPR 和 FPR,我需要传入 y_test 和 y_scores 的值,如下所示:
fpr, tpr, threshold = roc_curve(y_test, y_scores)
我只是在为我应该使用的这些值而苦苦挣扎。 提前感谢您的帮助,如果我错过了什么,我深表歉意,因为这是我的第一个 post。
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.metrics import roc_curve
from sklearn.metrics import auc
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
data = pd.read_csv('./autoimmune.csv')
X = data.drop(columns=['autoimmune'])
y = data['autoimmune'].values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
knn = KNeighborsClassifier(n_neighbors = 10)
knn.fit(X_train,y_train)
knn.predict(X_test)[0:10]
knn.score(X_test,y_test)
print("Test set score: {:.4f}".format(knn.score(X_test, y_test)))
knn_cv = KNeighborsClassifier(n_neighbors=10)
cv_scores = cross_val_score(knn_cv, X, y, cv=10)
print(cv_scores)
print('cv_scores mean:{}' .format(np.mean(cv_scores)))
y_scores = cross_val_score(knn_cv, X, y, cv=76)
fpr, tpr, threshold = roc_curve(y_test, y_scores)
roc_auc = auc(fpr, tpr)
print(roc_auc)
plt.title('Receiver Operating Characteristic')
plt.plot(fpr, tpr, 'b', label = 'AUC = %0.2f' % roc_auc)
plt.legend(loc = 'lower right')
plt.plot([0, 1], [0, 1],'r--')
plt.xlim([0, 1])
plt.ylim([0, 1])
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
plt.title('ROC Curve of kNN')
plt.show()
如果您查看 documentation for roc_curve()
,您将看到有关 y_score
参数的以下信息:
y_score : array, shape = [n_samples] Target scores, can either be probability estimates of the positive class, confidence values, or non-thresholded measure of decisions (as returned by “decision_function” on some classifiers).
您可以使用 sklearn 中的 predict_proba()
method of the KNeighborsClassifier
获得概率估计。这个 returns 一个带有两列的 numpy 数组用于二进制 class 化,一列用于负数和正数 class。对于 roc_curve()
函数,您想使用 正 class 的概率估计,因此您可以替换您的:
y_scores = cross_val_score(knn_cv, X, y, cv=76)
fpr, tpr, threshold = roc_curve(y_test, y_scores)
与:
y_scores = knn.predict_proba(X_test)
fpr, tpr, threshold = roc_curve(y_test, y_scores[:, 1])
请注意,您需要如何将第二列的所有行 [:, 1]
用于 select 正 class 的概率估计。这是一个使用威斯康星乳腺癌数据集的最小可重现示例,因为我没有你的 autoimmune.csv
:
from sklearn.datasets import load_breast_cancer
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_curve
from sklearn.metrics import auc
import matplotlib.pyplot as plt
X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
knn = KNeighborsClassifier(n_neighbors = 10)
knn.fit(X_train,y_train)
y_scores = knn.predict_proba(X_test)
fpr, tpr, threshold = roc_curve(y_test, y_scores[:, 1])
roc_auc = auc(fpr, tpr)
plt.title('Receiver Operating Characteristic')
plt.plot(fpr, tpr, 'b', label = 'AUC = %0.2f' % roc_auc)
plt.legend(loc = 'lower right')
plt.plot([0, 1], [0, 1],'r--')
plt.xlim([0, 1])
plt.ylim([0, 1])
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
plt.title('ROC Curve of kNN')
plt.show()
这会产生以下 ROC 曲线: