基于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
相关产品推荐
相关产品推荐

