使用Python的模型的准确性

Tavish Aggarwal.

We有一个型号设计并准备部署生产。但在部署之前,测试模型的准确性非常重要。大多数时间数据科学家倾向于测量模型性能的模型的准确性。我们中的一些人可能认为我们已经使用得分()函数。

考虑下面显示的示例,我们正在执行k最近邻算法以解决分类模型。

# Import necessary modules
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris

# Loading data
irisData = load_iris()

# Create feature and target arrays
X = irisData.data
y = irisData.target

# Split into training and test set
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state=42)

knn = KNeighborsClassifier(n_neighbors=7)

knn.fit(X_train,y_train)

# Calculate the accuracy of the model
print(knn.score(X_test, y_test))

在上面显示的示例中,我们使用得分函数来检查模型的准确性。

这里出现的问题是,它总是正确的,真的在得分功能上检查模型的准确性吗?

考虑欺诈事务的示例,其中大多数交易是真实的。而且只有1%的欺诈交易。

在这种情况下,如果我们考虑准确百分比来检查模型性能,那么我们将具有99%的准确性,这可能不是真的。

这被称为 班级不平衡。在这种情况下,我们不能依赖得分函数。

让我们来看看一些有用的技术,这将是解决机器学习问题的重要工具。

混乱度量

我们如何知道哪些算法用于解决机器学习问题时有这么多的算法可用。最好的方法是执行以下步骤:

  1. 将数据集划分为测试和培训数据集。
  2. 将数据集与您认为可以用于解决问题的所有潜在算法。
  3. 然后使用不同的算法对测试数据集进行混淆度量。

简单来说,混淆度量是我们尝试找出实际VS预测结果的指标。我们将结果划分为混淆度量:

  • 真正的阳性:当预测是真的并且实际也是如此。
  • True Daly:当预测是假并且实际也是错误的。
  • 假阳性:当预测是真的并且实际是假的。
  • 假阴性:当预测是错误的并且实际是真的。

笔记: 始终记住行对应于预测值,列对应于混淆度量中的实际值。

让我们来看看一个例子:

# Import necessary modules
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
from sklearn.metrics import classification_report , confusion_matrix

# Loading data
irisData = load_iris()

# Create feature and target arrays
X = irisData.data
y = irisData.target

# Split into training and test set
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state=42)

knn = KNeighborsClassifier(n_neighbors=7)

knn.fit(X_train,y_train)

y_pred = knn.predict(X_test)

# Generate the confusion matrix and classification report
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))

根据结果​​,我们可以选择算法,并计算模型的性能。但有时算法之间很难选择,因为他们的混乱度量几乎相同。

在这种情况下,该怎么办?我们需要计算更复杂的度量,如灵敏度,特异性,ROC,AUC等,可以帮助我们做出更准确的决策。

 Sensitivity

敏感性告诉我们模型正确识别结果的百分比。这是 真正的正/真正+假阴性.

特异性

特异性告诉我们模型的负面正确识别结果的百分比。这是 真的 negative / true negative + false postive.

ROC(Receage算子特征) 

分类报告和混淆矩阵是定量评估模型性能的重要方法,而ROC曲线提供了视觉评估模型的方法。

ROC曲线绘制真正的阳性率与假阳性率。

# Import necessary modules
from sklearn.metrics import roc_curve
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

data = load_breast_cancer()

# Create feature and target arrays
X = data.data
y = data.target

# Split into training and test set
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state=42)

knn = KNeighborsClassifier()
knn.fit(X_train,y_train)

# Compute predicted probabilities: y_pred_prob
y_pred_prob = knn.predict_proba(X_test)[:,1]


# Generate ROC curve values: fpr, tpr, thresholds
fpr, tpr, thresholds = roc_curve(y_test, y_pred_prob)
# Plot ROC curve
plt.plot([0, 1], [0, 1], 'k--')
plt.plot(fpr, tpr)
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.show()

笔记: 

  1. 阈值是概率范围为0到1。
  2. Scikit-reform中的大多数分类器都有一个.predict_proba()方法,它返回给定示例在特定类中的概率。

AUC(曲线下的区域)

AUC曲线表明ROC曲线下的区域。考虑一下我们使用的两个算法和AUC的一个例子,第一个算法ROC曲线大于第2算法ROC曲线下的区域,然后我们应该考虑第1算法。

# Import necessary modules
from sklearn.metrics import roc_auc_score
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score

data = load_breast_cancer()

# Create feature and target arrays
X = data.data
y = data.target

# Split into training and test set
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state=42)

knn = KNeighborsClassifier()
knn.fit(X_train,y_train)

logreg = LogisticRegression()
logreg.fit(X_train,y_train)

# Compute predicted probabilities: y_pred_prob
y_pred_prob_knn = knn.predict_proba(X_test)[:,1]
y_pred_prob_logreg = logreg.predict_proba(X_test)[:,1]

print("AUC for knn: {}".format(roc_auc_score(y_test, y_pred_prob_knn)))
print("AUC for logreg: {}".format(roc_auc_score(y_test, y_pred_prob_logreg)))

# Compute cross-validated AUC scores: cv_auc
cv_auc_knn = cross_val_score(knn, X, y, scoring='roc_auc', cv=5)
cv_auc_logreg = cross_val_score(logreg, X, y, scoring='roc_auc', cv=5)
# Print list of AUC scores
print("AUC scores using 5-fold cross-validation knn: {}".format(cv_auc_knn.mean()))
print("AUC scores using 5-fold cross-validation logreg: {}".format(cv_auc_logreg.mean()))

在上面所示的示例中,我们使用最近的邻域算法和逻辑回归算法计算相同数据的AUC。基于结果,我们可以选择具有更高AUC值的算法。

我们可以从混淆指标计算更多的计算:

精确: 真正的正/真正+假阳性

记起 真正的正/真正+假阴性

准确性:真正的阳性+真正的负/真正+真正负+假阳性+假阴性

HyperParameter调整

我们讨论了像K-最近邻算法等模型,回归算法很少有常数像N_NEighbors,我们需要分配任意值。我们如何决定这些常量的价值?

可能的解决方案是封路数据调谐,我们定义了我们认为可以具有更好性能的可能值的空间。我们通过定义的所有可能值评估我们的模型,并检查模型的准确性。

让我们来看看下面显示的一个例子:

# Import necessary modules
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris

irisData = load_iris()

# Create feature and target arrays
X = irisData.data
y = irisData.target

# Split into training and test set
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state=42)

n_neighbors_space = list(range(1, 11))
param_grid = {'n_neighbors': n_neighbors_space}

knn = KNeighborsClassifier()

knn_cv = GridSearchCV(knn, param_grid, cv=5)
# Fit it to the data
knn_cv.fit(X, y)

# Print the tuned parameters and score
print("Tuned k Nearest Algorithm Parameters: {}".format(knn_cv.best_params_))
print("Best score is {}".format(knn_cv.best_score_))

笔记:我们在此处使用gridsearchcv函数,这将创建一个定义的所有可能值的网格,并针对值的准确性。

GridSearchCV可以计算地昂贵,特别是如果您正在搜索大型封面空间并处理多个超参数。解决方案是使用随机化搜索型,其中不尝试所有超参数值。相反,从指定的概率分布中采样一个固定数量的超级多参数设置。 

# Import necessary modules
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import RandomizedSearchCV
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier

irisData = load_iris()

# Create feature and target arrays
X = irisData.data
y = irisData.target

# Split into training and test set
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state=42)

n_neighbors_space = list(range(1, 11))
param_grid = {'n_neighbors': n_neighbors_space}

knn = KNeighborsClassifier()

# Here we are using RandomizedSearchCV instead of GridSearchCV
knn_cv = RandomizedSearchCV(knn, param_grid, cv=5)

# Fit it to the data
knn_cv.fit(X, y)

# Print the tuned parameters and score
print("Tuned k Nearest Algorithm Parameters: {}".format(knn_cv.best_params_))
print("Best score is {}".format(knn_cv.best_score_))

在上面显示的示例中,我们使用随机化搜索函数而不是GridSearchCV。您会注意到输出是相同的。唯一的区别将是计算能力。

概括

在此帖子中,我们探索了计算模型性能的选项。

  • 我们研究了混淆度量和分类报告。
  • 此后,我们研究了ROC和AUC曲线,可用于评估使用各种算法创建的模型的性能。
  • 我们还研究了HyperParameter调整,为调整模型选择最佳值。

希望您将在您的数据科学工具包中讨论上面讨论的所有技术并使用它们。快乐学习!

作者信息

Tavish Aggarwal.

网站: http://tavishaggarwal.com

Tavish Aggarwal.是一个数据科学家 在一个海德拉巴工作,具有广泛的经验,在跨电子商务,财务,医疗保健等等不同领域解决现实世界的业务问题。 他对技术充满热情,喜欢在团队中工作。