python - 使用 k-近邻,无需分成训练集和测试集

标签 python numpy machine-learning scikit-learn nearest-neighbor

我有以下数据集,包含超过 20,000 行:

enter image description here

我想使用 K 近邻算法使用 A 列到 E 列来预测 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 个最短距离,并对这 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

注释:

  • 预测包含所有数据(测试和训练)的预测值。
  • 测试数据的比例可以通过参数test_size调整(我用的是你的设置,即五分之一)。
  • 需要为迭代器调用方法 next() 来生成训练数据和测试数据的索引。

关于python - 使用 k-近邻,无需分成训练集和测试集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41750186/

相关文章:

python - 遍历Python中文件夹内的所有文件

python - 在索引数组中获取最小值

validation - 处理数据集中的缺失值

python - 如何解析位姿估计 tflite 模型的热图输出?

python - 在 Win32 上为 Python 2.6 编译 MySQLdb 时出现问题

python - GCS 实体的 blob_key 以后可以安全使用吗?

python - Amazon SQS 队列中的重复消息

python - Numpy apply_along_axis 不返回 ndarray 子类

python - 寻找没有形状限制的 dataframe.apply()

java - 使用 Weka 每周​​预测明年的温度值