使用学习曲线 - 机器学习
机器学习模型的学习模型显示机器学习模型的预测误差如何随着训练集大小的增加或减少而变化。
在继续之前,我们必须先了解机器学习模型中的方差和偏差是什么意思。
偏见:
它基本上只是模型的平均预测与预测的正确值之间的差异。具有高偏差的模型对训练数据做出了很多假设。这会导致模型过度简化,并可能导致训练集和测试集的高误差。然而,这也使模型更快地学习和易于理解。通常,线性回归等线性模型算法具有很高的偏差。
方差:
如果训练数据发生变化,它是模型预测将发生变化的量。理想情况下,机器学习模型不应该随着训练集的变化而变化太大,即算法应该善于提取有关数据的重要细节,而不管数据本身如何。具有高方差的算法示例是决策树、支持向量机 (SVM)。
理想情况下,我们需要一个具有低方差和低偏差的模型。为了实现更低的偏差,我们需要更多的训练数据,但是随着训练数据的增加,模型的方差会增加。因此,我们必须在两者之间取得平衡。这称为偏差-方差权衡。
学习曲线可以帮助找到合适数量的训练数据以适应我们的模型,并具有良好的偏差-方差权衡。这就是学习曲线如此重要的原因。
现在我们了解了偏差-方差权衡以及为什么学习曲线很重要,现在我们将学习如何使用Python的 scikit-learn 库在Python中使用学习曲线。
Python中学习曲线的实现:
为了这个例子,我们将使用非常流行的“数字”数据集。关于这个数据集的更多信息,可以参考下面的链接:https://scikit-learn.org/stable/auto_examples/datasets/plot_digits_last_image
在这个例子中,我们将使用一个 k-最近邻分类器。我们还将执行 10 倍交叉验证以获得验证分数以绘制在图表上。
代码:
#Importing Required Libraries and Modules
import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_digits
from sklearn.model_selection import learning_curve
# Load data set
dataset = load_digits()
# X contains data and y contains labels
X, y = dataset.data, dataset.target
# Obtain scores from learning curve function
# cv is the number of folds while performing Cross Validation
sizes, training_scores, testing_scores = learning_curve(KNeighborsClassifier(), X, y, cv=10, scoring='accuracy', train_sizes=np.linspace(0.01, 1.0, 50))
# Mean and Standard Deviation of training scores
mean_training = np.mean(training_scores, axis=1)
Standard_Deviation_training = np.std(training_scores, axis=1)
# Mean and Standard Deviation of testing scores
mean_testing = np.mean(testing_scores, axis=1)
Standard_Deviation_testing = np.std(testing_scores, axis=1)
# dotted blue line is for training scores and green line is for cross-validation score
plt.plot(sizes, mean_training, '--', color="b", label="Training score")
plt.plot(sizes, mean_testing, color="g", label="Cross-validation score")
# Drawing plot
plt.title("LEARNING CURVE FOR KNN Classifier")
plt.xlabel("Training Set Size"), plt.ylabel("Accuracy Score"), plt.legend(loc="best")
plt.tight_layout()
plt.show()
输出:
从曲线我们可以清楚地看到,随着训练集大小的增加,训练得分曲线和交叉验证得分曲线收敛。随着我们添加更多的训练数据,交叉验证的准确性会提高。因此,在这种情况下,添加训练数据很有用。由于训练分数非常准确,这表明低偏差和高方差。所以这个模型也开始过度拟合数据,因为交叉验证分数相对较低,并且随着训练集大小的增加而增长非常缓慢。
结论:
学习曲线是一个很好的诊断工具,用于确定监督机器学习算法中的偏差和方差。在本文中,我们了解了哪些学习曲线以及它们是如何在Python中实现的。