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

基于FIFA数据集的KNN归一化后数据点距离一致问题求助

问题根源及解决办法

你代码里的核心问题是模型训练用了归一化后的特征,但查询相似球员时传入的是未归一化的原始特征,这直接导致距离计算完全错位,所以出现所有距离值相同的异常结果。

具体修正步骤:

  • 对查询用的单个球员特征,必须用训练阶段的同一个Scaler做归一化转换,不能直接用原始数据
  • 另外你把距离直接转成int会丢失精度,建议保留浮点值或者做合理的小数保留

修改后的关键代码:

#3.4 - Rescaling values

from sklearn.preprocessing import MinMaxScaler
from sklearn.neighbors import NearestNeighbors
from ipywidgets import widgets, interact
from IPython.display import display

scaler = MinMaxScaler() # 用StandardScaler也一样,保持训练和查询规则一致即可
X_model = scaler.fit_transform(X)

model = NearestNeighbors(algorithm='brute', n_neighbors=10)
model.fit(X_model) # 用归一化后的特征训练模型

dp_players = df[['name','id']].sort_values(by=['name']).values.tolist()

def get_similars(Player):
  # 关键修正:对查询的球员特征执行归一化转换
  player_features = scaler.transform(X.loc[Player].values.reshape(1,-1))
  distance, similar_players_index = model.kneighbors(player_features)
  similar_players = df.loc[df.index[similar_players_index[0]]]
  # 保留4位小数的距离值,避免精度丢失
  similar_players['distances'] = [round(x, 4) for x in distance[0]]
  return similar_players[['name', 'club', 'overall','distances']]

补充说明:

归一化的核心逻辑是训练和推理阶段必须使用完全相同的缩放规则:训练用scaler.fit_transform生成归一化特征,推理就必须用同一个scaler的transform方法处理查询数据,不能重新拟合或者直接传入原始数据。你之前未归一化时结果正常,正是因为训练和查询用的都是原始特征,规则一致;归一化后只修改了训练数据,没同步调整查询数据,才出现异常。

内容的提问来源于stack exchange,提问作者Tiago Silveira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 23:50:26