我正在处理一个非常大的数据集,其中包含 50 个(总共 150 GB)参与者的数据。连接/合并的数据文件太大,以至于我的计算机不断出现内存错误。因此,我正在研究在每个数据集上部分训练 KNN 模型的方法,这样我就可以从 RAM 中擦除已经训练过的数据集。我的电脑有 32 GB RAM。
这可能很简单,但我一直在绞尽脑汁。有什么办法可以做到这一点吗?
我想象的粗略示例:
knn = KNeighborsClassifier(n_neighbors=6)
for participant in participant_list:
df = pd.read_csv(csv_file_of_this_participant)
X_train = df.drop(Column_name)
y_train = df[Column_name]
knn.partial_fit(X_train, y_train, classes=np.unique(y_train))
#something like the line above to partially train it
del df
#And then another for loop would follow to test it.
我尝试过特征选择和主成分分析来提高合并数据集的内存效率,但 KNN 仍然遇到内存错误。
我尝试使用一个循环来遍历数据块并在该循环中训练和测试 KNN 模型,但最终仍然遇到内存问题。即使它有效,我也只会得到仅在部分数据上训练的 knn 模型的一堆结果,并且我必须对最终结果进行平均,所以这似乎不是最佳的。
在推理期间,即预测时间,KNN 模型需要访问训练数据以找到最近的训练实例。如果您的数据集大小为 150 GB,KNN 模型可能不是最佳选择。
在我看来,你至少有三种选择:
1.) 如果您的数据集包含大量冗余数据点,您可以对数据进行下采样。
2.) 对数据进行分区,以便在每个分区上训练各个模型。
3.) 使用能够处理大型训练数据集的算法和实现。您可以从 XGBoost 开始:https://xgboost.readthedocs.io/en/latest/tutorials/external_memory.html