我有以下数据集,超过20,000行:
我想使用列A到E来使用k近邻算法预测列X.我曾尝试使用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行的X值来实现我自己的k-最近算法 . 这个过程只用了一行超过30秒,而且我有超过20,000行 . 有更快的方法吗?
3 回答
尝试使用此代码:
与您的解决方案的主要区别在于使用ShuffleSplit .
笔记:
predictions
包含所有数据(测试和训练)的预测值 .可以通过参数
test_size
调整测试数据的比例(我使用了您的设置,即五分之一) .必须为迭代器调用方法
next()
以生成列车和测试数据的索引 .是的,问题是python中的循环非常慢 . 你可以做的是 vectorize 你的计算 . 因此,假设您的数据在矩阵X(n x d)中,然后是距离矩阵D_ij = || X_i - X_j || ^ 2是
所以在Python中
如果您只想对训练数据进行预测,则无需将数据拆分为训练和测试 .
您可以只是拟合原始数据,然后对其进行预测 .