如何将现有KNN代码应用到我的双列DataFrame数据集?
核心问题解答
你不需要把自己的数据传入generate_data函数,这个函数仅用来生成模拟测试数据,你已经有真实数据集的情况下直接替换掉generate_data对应的逻辑即可。你当前的代码读取AAPL数据后没有做任何后续调用,所有模型训练用的都是generate_data生成的模拟数据,和你的真实数据完全脱节。
具体修改步骤
步骤1:修正原始数据读取的错误
PyOD的模型要求输入特征X是二维数组格式(样本数×特征数),你原代码用squeeze()把单列特征转成了一维数组,会直接触发维度不匹配报错,按如下规则调整:
# 原错误写法,会得到一维Series # X = AAPL.iloc[:,1].squeeze() # Y = AAPL.iloc[:,2].squeeze() # 修正后写法:如果用X列单独作为特征,保留二维结构 X = AAPL.iloc[:, 0:1].values # 按你实际的X列索引调整 # 如果要把X、Y两列都作为特征输入模型(2维特征可支持后续可视化) # X = AAPL.iloc[:, 0:2].values Y = AAPL.iloc[:, 1].values # 按你实际的Y列/标注列索引调整
步骤2:替换模拟数据生成逻辑
删除原代码中调用generate_data的代码块,用自己的数据集拆分逻辑替代,需要先导入拆分工具:
from sklearn.model_selection import train_test_split
替换后代码:
# 拆分训练集、测试集,测试集占比可按需调整 X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=42) # 如果你做无监督异常检测没有真实异常标注Y,可以只拆分特征 # X_train, X_test = train_test_split(X, test_size=0.33, random_state=42) # 无标注的情况后续evaluate_print评估步骤可以直接删掉
步骤3:适配模型参数
初始化KNN时把你设定的异常比例传入即可:
clf = KNN(contamination=contamination)
步骤4:按需保留后续逻辑
- 有真实异常标注的情况下保留
evaluate_print评估代码 visualize可视化函数仅支持2维特征的可视化,如果你的输入特征只有1维,直接删掉可视化代码即可
完整修改后参考代码
import pandas as pd from pyod.models.knn import KNN from pyod.utils.data import evaluate_print from pyod.utils.example import visualize from sklearn.model_selection import train_test_split if __name__ == "__main__": contamination = 0.1 # 异常值占比,按你的数据实际情况调整 # 导入自己的数据集 AAPL = pd.read_csv('AAPL.csv', header=0) # 按实际列索引调整,此处示例用X、Y两列作为输入特征 X = AAPL.iloc[:, 0:2].values # 有真实异常标注的话读取对应列,无标注可以注释掉 # Y = AAPL.iloc[:, 标注列索引].values # 拆分训练集测试集,无标注就用不带Y的拆分方式 # X_train, X_test = train_test_split(X, test_size=0.33, random_state=42) X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=42) # 训练KNN检测器 clf_name = 'KNN' clf = KNN(contamination=contamination) clf.fit(X_train) # 获取训练集预测结果 y_train_pred = clf.labels_ # 0: 正常点 1: 异常点 y_train_scores = clf.decision_scores_ # 异常得分 # 获取测试集预测结果 y_test_pred = clf.predict(X_test) y_test_scores = clf.decision_function(X_test) # 有真实标注再打开注释执行评估 # print("\n训练集评估结果:") # evaluate_print(clf_name, y_train, y_train_scores) # print("\n测试集评估结果:") # evaluate_print(clf_name, y_test, y_test_scores) # 特征为2维时再打开注释执行可视化 # visualize(clf_name, X_train, y_train, X_test, y_test, y_train_pred, # y_test_pred, show_figure=True, save_figure=True)
内容的提问来源于stack exchange,提问作者d12
相关产品推荐
相关产品推荐

