Sklearn 中的 fit 方法。使用 KNeighborsClassifier 时
fit method in Sklearn. when using KNeighborsClassifier
from sklearn.neighbors import KNeighborsClassifier
knn_clf =KNeighborsClassifier()
knn_clf.fit(x_train[:92000],y_train[:92000]) #1st method call
knn_clf.fit(x_train[92000:123000],y_train[92000:123000]) #2nd method call
我怀疑当我像这样调用 fit 方法时,第二次调用是否再次从头开始训练模型?或者它会添加到它从之前的 fit 调用(第一个方法调用)中学到的东西?
我想要实现的是进行批量训练,因为如果我一次使用完整的数据集,笔记本电脑无法处理这些数据!
提前致谢:-)
每次调用 fit 方法时,它都会尝试拟合模型。如果您多次调用 fit 方法,它会尝试重新拟合模型,正如@Julien 指出的那样,批量训练对 KNN 没有任何意义。
KNN 将考虑所有数据点并选择最接近的前 K 个 neighbors.So 如果您的数据很大,则需要更多时间。
您所能做的就是缩小数据规模或增加系统内存大小。
k-NN Classifier 中没有训练,因为查询点(来自测试数据)是强制性的,以找到它最近的邻居并根据多数投票进行分类。
如果没有查询点(测试数据),模型将通过训练数据来做什么?
也许,k-NN Classifier 的 model.fit() 方法不进行训练,而是将数据集存储在有效的数据结构中以供搜索。
当我们尝试使用 model.predict() 对数据点(来自测试数据)进行分类时,k-NN 将从训练数据中找到 'k' 最近的邻居并对查询点进行分类基于多数票。
关于您的问题,第二个拟合方法将覆盖 'knn_clf' 模型的存储数据,并丢弃第一个拟合方法存储的数据。让我们通过一个例子来证明这一点:
from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier}
# Load the Iris Dataset
irisDS = datasets.load_iris()
# Get Features and Labels
features, labels = iris.data, iris.target
knn_clf = KNeighborsClassifier() # Create a KNN Classifier Model Object
queryPoint = [[9, 1, 2, 3]] # Query Datapoint that has to be classified
# Case 1: fit on whole Dataset (total 150 datapoints)
knn_clf.fit(features, labels)
print(knn_clf.predict(queryPoint)) # Prints Class 1
# Query Point belongs to Class 1 if all the Dataset is taken in the fit method
# Case 2: fit on a subset of whole Dataset (last 40 datapoints)
knn_clf.fit(features[110:], labels[110:])
print(knn_clf.predict(queryPoint)) # Prints Class 2
# Query Point belongs to Class 2 if last 40 Datapoints are taken in the fit method => Wrong Classification because of a small subset of Training Data.
Case 3: fit on subsets of whole Dataset (last 40 and then first 110 datapoints)
knn_clf.fit(features[110:], labels[110:])
knn_clf.fit(features[:110], labels[:110])
print(knn_clf.predict(queryPoint)) # Prints Class 1
# Query Point belongs to Class 1 if 'last 40 and then first 110 datapoints' are taken in the fit method => Correct Classification because the Training Data has luckily majority of Class 1.
# Case 4: fit on subsets of whole Dataset (first 110 and then last 40 datapoints)
knn_clf.fit(features[:110], labels[:110])
knn_clf.fit(features[110:], labels[110:])
print(knn_clf.predict(queryPoint)) # Prints Class 2
# Query Point belongs to Class 2 if 'first 110 and then last 40 datapoints' are taken in the fit method => Wrong Classification because of a small subset of Training Data.
如果我们看到,查询点属于 Class 1(当适合整个数据集时)但在情况 4(您的情况)中预测错误,即使我们假设我们已经将整个数据集批次(错误的假设)。
这意味着 recent/latest 拟合方法中的数据仅被 KNN Classifier 模型考虑。
from sklearn.neighbors import KNeighborsClassifier
knn_clf =KNeighborsClassifier()
knn_clf.fit(x_train[:92000],y_train[:92000]) #1st method call
knn_clf.fit(x_train[92000:123000],y_train[92000:123000]) #2nd method call
我怀疑当我像这样调用 fit 方法时,第二次调用是否再次从头开始训练模型?或者它会添加到它从之前的 fit 调用(第一个方法调用)中学到的东西?
我想要实现的是进行批量训练,因为如果我一次使用完整的数据集,笔记本电脑无法处理这些数据! 提前致谢:-)
每次调用 fit 方法时,它都会尝试拟合模型。如果您多次调用 fit 方法,它会尝试重新拟合模型,正如@Julien 指出的那样,批量训练对 KNN 没有任何意义。
KNN 将考虑所有数据点并选择最接近的前 K 个 neighbors.So 如果您的数据很大,则需要更多时间。
您所能做的就是缩小数据规模或增加系统内存大小。
k-NN Classifier 中没有训练,因为查询点(来自测试数据)是强制性的,以找到它最近的邻居并根据多数投票进行分类。 如果没有查询点(测试数据),模型将通过训练数据来做什么?
也许,k-NN Classifier 的 model.fit() 方法不进行训练,而是将数据集存储在有效的数据结构中以供搜索。
当我们尝试使用 model.predict() 对数据点(来自测试数据)进行分类时,k-NN 将从训练数据中找到 'k' 最近的邻居并对查询点进行分类基于多数票。
关于您的问题,第二个拟合方法将覆盖 'knn_clf' 模型的存储数据,并丢弃第一个拟合方法存储的数据。让我们通过一个例子来证明这一点:
from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier}
# Load the Iris Dataset
irisDS = datasets.load_iris()
# Get Features and Labels
features, labels = iris.data, iris.target
knn_clf = KNeighborsClassifier() # Create a KNN Classifier Model Object
queryPoint = [[9, 1, 2, 3]] # Query Datapoint that has to be classified
# Case 1: fit on whole Dataset (total 150 datapoints)
knn_clf.fit(features, labels)
print(knn_clf.predict(queryPoint)) # Prints Class 1
# Query Point belongs to Class 1 if all the Dataset is taken in the fit method
# Case 2: fit on a subset of whole Dataset (last 40 datapoints)
knn_clf.fit(features[110:], labels[110:])
print(knn_clf.predict(queryPoint)) # Prints Class 2
# Query Point belongs to Class 2 if last 40 Datapoints are taken in the fit method => Wrong Classification because of a small subset of Training Data.
Case 3: fit on subsets of whole Dataset (last 40 and then first 110 datapoints)
knn_clf.fit(features[110:], labels[110:])
knn_clf.fit(features[:110], labels[:110])
print(knn_clf.predict(queryPoint)) # Prints Class 1
# Query Point belongs to Class 1 if 'last 40 and then first 110 datapoints' are taken in the fit method => Correct Classification because the Training Data has luckily majority of Class 1.
# Case 4: fit on subsets of whole Dataset (first 110 and then last 40 datapoints)
knn_clf.fit(features[:110], labels[:110])
knn_clf.fit(features[110:], labels[110:])
print(knn_clf.predict(queryPoint)) # Prints Class 2
# Query Point belongs to Class 2 if 'first 110 and then last 40 datapoints' are taken in the fit method => Wrong Classification because of a small subset of Training Data.
如果我们看到,查询点属于 Class 1(当适合整个数据集时)但在情况 4(您的情况)中预测错误,即使我们假设我们已经将整个数据集批次(错误的假设)。 这意味着 recent/latest 拟合方法中的数据仅被 KNN Classifier 模型考虑。