如何在附加数据上训练 (k-NN) 模型(为了绘制学习曲线)
How to train up a (k-NN) model on additional data (for the sake of plotting a learning curve)
我正在玩 MNIST database,我想为其绘制各种学习算法的学习曲线。为了这个问题,让我们考虑 k-NN 算法。
我使用 mnist
包导入数据并将其转换为 numpy.ndarray
对象。
import numpy as np
import matplotlib.pyplot as plt
from mnist import MNIST
mndata = MNIST('./data')
images_train, labels_train = mndata.load_training()
images_test, labels_test = mndata.load_testing()
labels_train = labels_train.tolist()
labels_test = labels_test.tolist()
X_train = np.array(images_train)
y_train = np.array(labels_train)
X_test = np.array(images_test)
y_test = np.array(labels_test)
但是,它在训练集中包含 60.000 个示例,所以对我的计算机来说太多了。我想绘制学习曲线以了解进一步培训是否有意义。
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier
start_time = time.time()
training_range = range(500, 1500, 100)
test_size = 1000
training_accuracy = []
test_accuracy = []
for train_size in training_range:
X_train_small = X_train[:train_size]
y_train_small = y_train[:train_size]
X_test_small = X_test[:test_size]
y_test_small = y_test[:test_size]
clf = KNeighborsClassifier(n_neighbors=3)
clf.fit(X_train_small, y_train_small)
training_accuracy.append(clf.score(X_train_small, y_train_small))
test_accuracy.append(clf.score(X_test_small, y_test_small))
plt.plot(training_range, training_accuracy, label="training accuracy")
plt.plot(training_range, test_accuracy, label="test accuracy")
plt.ylabel("Accuracy")
plt.xlabel("Training size")
plt.title("Learning curve")
plt.legend()
plt.show()
输出:
绘制这个简单的图表需要一分钟多的时间,它最好地显示了仅对 1500 个元素进行训练的准确性。
主要问题是程序运行clf.fit(X_train_small, y_train_small)
多次,每次都从头开始重新计算。
Question. Is there a way to preserve already learned data and just "train up" on the new one?
我想对于任意算法来说答案是否定的,但是 k-NN 的工作方式原则上应该是可能的(这只是我的意见)。
正如 Vivek Kumar 所说,只有能够调用 partial_fit()
方法的算法才能做你想做的事情,例如 linear_model.Perceptron
、linear_model.SGDClassifier
等
为什么KNN没有部分拟合?因为当你想到KNN时,它在训练阶段没有任何努力,它是一种惰性算法。所有的努力都花在了测试阶段。它需要完整的数据集来决定。既然需要完整的训练集才能判定,一次给一个训练数据是没有意义的。
我正在玩 MNIST database,我想为其绘制各种学习算法的学习曲线。为了这个问题,让我们考虑 k-NN 算法。
我使用 mnist
包导入数据并将其转换为 numpy.ndarray
对象。
import numpy as np
import matplotlib.pyplot as plt
from mnist import MNIST
mndata = MNIST('./data')
images_train, labels_train = mndata.load_training()
images_test, labels_test = mndata.load_testing()
labels_train = labels_train.tolist()
labels_test = labels_test.tolist()
X_train = np.array(images_train)
y_train = np.array(labels_train)
X_test = np.array(images_test)
y_test = np.array(labels_test)
但是,它在训练集中包含 60.000 个示例,所以对我的计算机来说太多了。我想绘制学习曲线以了解进一步培训是否有意义。
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier
start_time = time.time()
training_range = range(500, 1500, 100)
test_size = 1000
training_accuracy = []
test_accuracy = []
for train_size in training_range:
X_train_small = X_train[:train_size]
y_train_small = y_train[:train_size]
X_test_small = X_test[:test_size]
y_test_small = y_test[:test_size]
clf = KNeighborsClassifier(n_neighbors=3)
clf.fit(X_train_small, y_train_small)
training_accuracy.append(clf.score(X_train_small, y_train_small))
test_accuracy.append(clf.score(X_test_small, y_test_small))
plt.plot(training_range, training_accuracy, label="training accuracy")
plt.plot(training_range, test_accuracy, label="test accuracy")
plt.ylabel("Accuracy")
plt.xlabel("Training size")
plt.title("Learning curve")
plt.legend()
plt.show()
输出:
绘制这个简单的图表需要一分钟多的时间,它最好地显示了仅对 1500 个元素进行训练的准确性。
主要问题是程序运行clf.fit(X_train_small, y_train_small)
多次,每次都从头开始重新计算。
Question. Is there a way to preserve already learned data and just "train up" on the new one?
我想对于任意算法来说答案是否定的,但是 k-NN 的工作方式原则上应该是可能的(这只是我的意见)。
正如 Vivek Kumar 所说,只有能够调用 partial_fit()
方法的算法才能做你想做的事情,例如 linear_model.Perceptron
、linear_model.SGDClassifier
等
为什么KNN没有部分拟合?因为当你想到KNN时,它在训练阶段没有任何努力,它是一种惰性算法。所有的努力都花在了测试阶段。它需要完整的数据集来决定。既然需要完整的训练集才能判定,一次给一个训练数据是没有意义的。