从入门到出门 2024-06-07 10:57 采纳率: 33.3%
浏览 19
已结题

knn中predict_proba的结果不准的问题

各位人才最近在学习机器学习相关的可以,遇到了一个疑惑请人才帮忙看一下,感谢~

import pandas as pd
from sklearn.neighbors import KNeighborsClassifier

# 读取数据
dataxls = pd.read_excel('2023forfootball.xlsx', sheet_name='Sheet2')
Y = dataxls["结果"]
X = dataxls[["让球", "胜初", "平初", "负初", "胜", "平", "负"]].values

# 创建并拟合模型
knn = KNeighborsClassifier(n_neighbors=10,weights='distance')
knn.fit(X, Y)

# 新数据
new_data =  [[-1, 2.17, 3.29, 3.04,-1,1,1]]

# 获取类别名称
class_labels = ['胜', '平', '负']

# 预测新数据的概率
probabilities = knn.predict_proba(new_data)

# 打印每个类别的概率
print("新数据点的概率预测:")
for i, prob in enumerate(probabilities[0]):
    print(f"{class_labels[i]}: {prob * 100:.2f}%")

# 获取最近邻的索引
distances, indices = knn.kneighbors(new_data)

# 从原始数据中检索最近邻的完整数据
nearest_neighbors = dataxls.iloc[indices.flatten()]

# 打印最近邻的完整数据
# print("\n参考的最近邻数据:")
# print(nearest_neighbors.to_string(index=False))

# 打印最近邻数据的距离百分比
max_distance = max(distances.flatten())  # 找到最大距离
distances_percentage = [((distance / max_distance) * 100) for distance in distances.flatten()]
nearest_neighbors['Distance_Percentage'] = distances_percentage

# 格式化输出最近邻的完整数据和距离百分比
print("\n最近邻的完整数据和距离百分比:")
print(nearest_neighbors.to_string(index=False))

输出结果
新数据点的概率预测:
胜: 41.12%
平: 19.58%
负: 39.30%

 id         时间    序号   赛事    主队   客队  让球   胜初   平初   负初   胜终   平终   负终  半场  全场主  全场客 结果  胜  平  负  Distance_Percentage

1017786 2023-02-19 周日001 澳超 阿德莱德联 西悉尼 -1 2.03 3.25 2.97 2.20 3.20 2.69 2-1 4 4 平 -1 1 1 75.572215
1019650 2023-05-28 周六021 美职足 纽约城 费城 -1 2.04 3.20 2.98 2.17 3.10 2.82 1-2 1 3 负 -1 1 1 79.108822
1017534 2023-02-09 周三003 法国杯 里昂 里尔 -1 1.99 3.30 3.00 2.25 2.90 2.86 2-1 2 2 平 -1 1 1 86.381171
1019574 2023-05-22 周日016 葡超 费雷拉 里奥阿维 -1 1.98 3.25 3.08 2.30 3.00 2.70 1-1 3 1 胜 -1 1 1 92.733825
1021780 2023-11-13 周日021 葡超 本菲卡 里斯本 -1 2.00 3.35 2.95 2.41 3.15 2.46 0-1 2 1 胜 -1 1 1 94.255113
1019668 2023-05-29 周日018 意甲 尤文图斯 AC米兰 -1 2.10 3.15 2.90 2.23 3.00 2.80 0-1 0 1 负 -1 1 1 98.233857
1021239 2023-10-11 周二004 英锦标赛 切尔滕汉姆 纽波特郡 -1 2.00 3.35 2.93 2.04 3.30 2.90 0-1 0 2 负 -1 1 1 98.789168
1019649 2023-05-28 周六020 美职足 奥兰多城 亚特联 -1 2.00 3.35 2.93 2.05 3.33 2.85 1-0 1 1 平 -1 1 1 98.789168
1022429 2023-12-17 周日009 意甲 乌迪内斯 萨索洛 -1 2.02 3.35 2.90 2.20 3.05 2.80 1-0 2 2 平 -1 1 1 100.000000
1022577 2023-12-23 周六016 英冠 布莱克本 沃特福德 -1 2.02 3.35 2.90 2.25 3.30 2.55 1-0 1 2 负 -1 1 1 100.000000

很明显这个预测结果和最近邻的完整数据 的结果 不一致,这是为甚,请帮忙看一些呗,感谢!

  • 写回答

24条回答 默认 最新

  • 阿里嘎多学长 2024-06-07 10:57
    关注
    获得0.15元问题酬金

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    在使用 KNeighborsClassifier 的 predict_proba 方法时,预测的概率是根据最近邻的标签分布来计算的。具体来说,对于每个类别,predict_proba 计算的是该类别在 K 个最近邻中的频率。这就意味着,如果一个类别在 K 个最近邻中出现得更频繁,它的概率就会更高。

    以下是一些可能的原因,解释为什么 predict_proba 的输出与最近邻数据的实际结果不一致:

    1. 数据分布不均匀:如果数据集中某个类别的样本数量远多于其他类别,那么即使最近邻中包含了其他类别的样本,概率预测可能仍然会偏向于多数类别。

    2. K值选择不当:如果 K 值太小,那么预测可能过于依赖于少数几个最近邻的标签,这可能导致预测结果不稳定。相反,如果 K 值太大,那么预测可能过于平滑,无法捕捉到局部的模式。

    3. 特征缩放:KNN 对特征的尺度很敏感。如果特征没有进行适当的缩放,那么距离计算可能会受到影响,导致错误的最近邻被选中。

    4. 异常值:数据集中的异常值可能会对距离计算产生较大影响,从而影响最近邻的选择。

    5. 数据质量:数据中的噪声或错误也可能导致预测结果不准确。

    为了解决这个问题,你可以尝试以下步骤:

    • 检查数据:确保数据清洗和预处理得当,没有异常值或错误。
    • 特征缩放:使用如标准化或归一化等方法对特征进行缩放。
    • 调整 K 值:尝试不同的 K 值,以找到最佳的模型性能。
    • 交叉验证:使用交叉验证来评估模型的稳定性和泛化能力。
    • 探索其他模型:如果 KNN 不能满足你的需求,可以考虑其他机器学习模型。

    关于代码实现,你的代码看起来已经正确地实现了 KNN 模型的拟合和预测。但是,你可以添加一些数据预处理的步骤,比如特征缩放,以及尝试调整 K 值。

    至于参考资料,以下是一些有用的链接:

    希望这些信息能帮助你解决问题!如果还有其他问题或需要进一步的帮助,请随时告诉我。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 6月15日
  • 赞助了问题酬金15元 6月7日
  • 创建了问题 6月7日

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见