You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于多个不同DataFrame训练scikit-learn的KNN模型?

用多场景DataFrame训练KNN模型的解决方案

当然可以用多个对应同一预测系统不同场景的DataFrame训练KNN模型——毕竟你已经发现数据量越大精度越高,而KNN作为惰性学习模型,本质是靠存储的训练样本做预测,样本覆盖越全面,预测效果越好。针对.fit()会重置之前训练的问题,给你两种实用方案:

方案一:合并所有数据集后一次性训练

这是最直接且推荐的方式,把所有场景的特征和标签数据合并成一个大数据集,统一处理后再训练。

关键注意事项

  • 所有数据集的特征必须完全匹配:特征数量、列名、数据类型要一致,否则合并会出错。
  • 统一做数据预处理:KNN对特征尺度极度敏感,必须做标准化/归一化;缺失值处理规则也要统一(比如都用dropna(),或者统一填充策略)。

示例代码

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier

# 假设你有多个场景的数据集:X1/y1、X2/y2、X3/y3
# 合并所有特征和标签
X_total = pd.concat([X1, X2, X3], axis=0)
y_total = pd.concat([y1, y2, y3], axis=0)

# 统一清洗数据
X_cleaned = X_total.dropna()
y_cleaned = y_total[X_cleaned.index]

# 划分训练测试集
X_training, X_test, y_training, y_test = train_test_split(
    X_cleaned, y_cleaned, test_size=0.15, random_state=0
)

# 标准化特征(KNN必做!)
scaler = StandardScaler()
X_training_scaled = scaler.fit_transform(X_training)
X_test_scaled = scaler.transform(X_test)

# 训练KNN模型
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_training_scaled, y_training)

# 评估模型
accuracy = knn.score(X_test_scaled, y_test)
print(f"模型准确率:{accuracy:.2f}")

方案二:增量式整合训练(适合超大数据集)

如果数据集太大,内存没法一次性合并,可以分批加载数据,每次把新数据整合到已有的训练数据中,再重新调用.fit()。

核心逻辑

KNN的.fit()会把训练数据存储在模型内部的_fit_X(特征)和_y(标签)属性中,你可以把新数据和这些内部数据合并后,重新训练,效果和一次性合并完全一致。

示例代码

import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier

# 初始化模型和标准化器
knn = KNeighborsClassifier(n_neighbors=5)
scaler = StandardScaler()

# 处理第一个数据集
X1_cleaned = X1.dropna()
y1_cleaned = y1[X1_cleaned.index]
# 第一次拟合标准化器(后续只用transform)
X1_scaled = scaler.fit_transform(X1_cleaned)
knn.fit(X1_scaled, y1_cleaned)

# 处理第二个数据集
X2_cleaned = X2.dropna()
y2_cleaned = y2[X2_cleaned.index]
# 用已有的标准化器转换特征
X2_scaled = scaler.transform(X2_cleaned)
# 合并已有训练数据和新数据
X_combined_scaled = np.concatenate([knn._fit_X, X2_scaled], axis=0)
y_combined = np.concatenate([knn._y, y2_cleaned], axis=0)
# 重新训练模型
knn.fit(X_combined_scaled, y_combined)

# 后续数据集重复上述「清洗→转换→合并→重新fit」步骤即可

额外提醒

  • 无论用哪种方案,测试集最好从合并后的总数据中划分,或者每个数据集单独留一部分测试样本最后合并,这样评估结果更能反映模型在全场景下的性能。
  • 如果不同场景的数据分布差异较大,建议先做数据分布校验,避免引入噪声拉低模型精度。

内容的提问来源于stack exchange,提问作者Guilherme Diniz Queiroz De Car

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 09:26:19