Kneighbors在没有shu的情况下得到了不同的分数

2024-10-01 15:37:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个有155个特征的数据集。40143个样本。它是按日期排序的(从最早到最新),然后我从数据集中删除了日期列。你知道吗

标签在第一列。你知道吗

CV结果c.%65(分数的平均准确度+/-0.01),代码如下:

def cross(dataset):


     dropz  = ["result"] 

     X = dataset.drop(dropz, axis=1)
     X = preprocessing.normalize(X)

     y = dataset["result"]


     clf = KNeighborsClassifier(n_neighbors=1, weights='distance', n_jobs=-1)

     scores = cross_val_score(clf, X, y, cv=10, scoring='accuracy')

我也得到了与下面代码类似的精度:

def train(dataset):
    dropz  = ["result"] 
    X = dataset.drop(dropz, axis=1)
    X = preprocessing.normalize(X)
    y = dataset["result"]

    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1000, random_state=42)

    clf = KNeighborsClassifier(n_neighbors=1, weights='distance', n_jobs=-1).fit(X_train, y_train)
    clf.score(X_test, y_test)

但是如果我在下面的代码中不使用shuffle,结果是c.%49 如果我使用shuffle,结果是c.%65

我应该提到的是,我试着从一开始到另一开始每1000个连续的分割,结果是一样的。你知道吗

dataset = pd.read_csv("./dataset.csv", header=0,sep=";")

dataset = shuffle(dataset) #!!!???

X_train = dataset.iloc[:-1000,1:]
X_train = preprocessing.normalize(X_train)
y_train = dataset.iloc[:-1000,0]


X_test = dataset.iloc[-1000:,1:]
X_test = preprocessing.normalize(X_test)
y_test = dataset.iloc[-1000:,0]

clf = KNeighborsClassifier(n_neighbors=1, weights='distance', n_jobs=-1).fit(X_train, y_train)
clf.score(X_test, y_test)

Tags: 代码testjobsneighborstrainresultdatasetdistance
1条回答
网友
1楼 · 发布于 2024-10-01 15:37:37

假设你的问题是“为什么会这样”:

在第一个和第二个代码段中,都发生了底层的无序化(在交叉验证和train\u test\u split方法中),因此它们(在分数和算法上)等价于上一个代码段中的无序化“on”。你知道吗

由于原始数据集是按日期排序的,因此可能(通常很可能)有些数据会随着时间的推移而变化,这意味着由于分类器从未看到最近1000个时间点的数据,因此它不知道基础分布的变化,因此无法对其进行分类。你知道吗


附录对评论中的进一步数据进行了回答:

这表明,可能有一些指示性的过程是在较小的时间框架内捕获的。两种有趣的探索方法是:

  1. 减小测试集的大小,直到找到一个窗口大小,在这个窗口大小中,随机播放/不随机播放之间的差异可以忽略不计。你知道吗
  2. 这个过程本质上表现为特性之间的某种依赖性,因此您可以在一个小的时间范围内看到特性之间是否存在依赖性

相关问题 更多 >

    热门问题