【发布时间】:2017-06-04 15:32:36
【问题描述】:
我有以下数据集,超过 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 行。有没有更快的方法来做到这一点?
【问题讨论】:
-
因此您将
KNeighorsRegressor拟合到训练数据上并预测到测试中。你已经有了一个训练有素的模型,那么为什么不直接做knn.predict(train[x_columns])呢?或者也许你应该做 k-fold 交叉验证,所以不会有任何行被排除在“测试”之外。您基本上会从 CV 构建一个平均模型并预测所有内容。或者只是在整个数据集上拟合一个模型并预测整个数据集:knn.fit(df[x_columns], df[y_column])。 -
我尝试了您的第一个建议,但它只是准确地预测了 X 列的值。对整个数据集进行建模也是如此。正如我在问题末尾提到的,我基本上实现了 k 折交叉验证,但每一行只需要很长时间。
标签: python numpy machine-learning scikit-learn nearest-neighbor