使用k-最近邻算法而不分割训练和测试集

我有一个超过20,000行的数据集:

enter image description here

我想使用A到E列来预测X列的值,使用k-最近邻算法。我尝试使用sklearn中的KNeighborsRegressor,如下所示:

import pandas as pd
import random
from numpy.random import permutation
import math
from sklearn.neighbors import KNeighborsRegressor
df = pd.read_csv("data.csv")
random_indices = permutation(df.index)
test_cutoff = int(math.floor(len(df)/5))
test = df.loc[random_indices[1:test_cutoff]]
train = df.loc[random_indices[test_cutoff:]]
x_columns = ['A', 'B', 'C', 'D', 'E']
y_column = ['X']
knn = KNeighborsRegressor(n_neighbors=100, weights='distance')
knn.fit(train[x_columns], train[y_column])
predictions = knn.predict(test[x_columns])

这种方法只对原始数据集的五分之一进行预测。我也想获得训练数据的预测值。

为此,我尝试自己实现k-最近邻算法,通过计算每行与其他所有行的欧几里得距离,找出k个最短距离,然后平均这k行的X值。这个过程仅对一行就需要超过30秒,而我有超过20,000行。有什么更快的方法吗?


回答:

试试这个代码:

import numpy as np
import pandas as pd
from sklearn.model_selection import ShuffleSplit
from sklearn.neighbors import KNeighborsRegressor
df = pd.read_csv("data.csv")
X = np.asarray(df.loc[:, ['A', 'B', 'C', 'D', 'E']])
y = np.asarray(df['X'])
rs = ShuffleSplit(n_splits=1, test_size=1./5, random_state=0)
train_indices, test_indices = rs.split(X).next()
knn = KNeighborsRegressor(n_neighbors=100, weights='distance')
knn.fit(X[train_indices], y[train_indices])
predictions = knn.predict(X)

与您的解决方案相比,主要区别在于使用了ShuffleSplit

注意事项:

  • predictions包含了您所有数据(测试和训练)的预测值。
  • 测试数据的比例可以通过参数test_size调整(我使用了您的设置,即五分之一)。
  • 需要调用next()方法来获取训练和测试数据的索引。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注