KNeighborsClassifier不同的分数没有随机播放

时间:2017-01-22 09:18:16

标签: python scikit-learn

我有一个包含155个功能的数据集。 40143个样本。它按日期排序(从最旧到最新)然后我从数据集中删除了日期列。

标签位于第一列。

简历结果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)

1 个答案:

答案 0 :(得分:1)

假设您的问题是"为什么会发生":

在你的第一个和第二个代码片段中,你发生了潜在的混乱(在你的交叉验证和你的train_test_split方法中),因此它们与你的最后一个片段相同(在得分和算法上)并且#34; on" 34。

由于您的原始数据集按日期排序,因此可能(并且通常可能)某些数据会随时间发生变化,这意味着由于您的分类器从未看到过去1000个时间点的数据,因此它不知道基础分布,因此无法对其进行分类。

在评论中回答进一步数据的附录:

这表明可能会在较短的时间范围内捕获一些指示性过程。探索它的两种有趣方式是:

  1. 减小测试集的大小,直到找到一个窗口大小,其中shuffle / no shuffle之间的差异可以忽略不计。
  2. 此过程基本上表现为您的功能之间存在某种依赖关系,因此您可以看到在较短的时间范围内是否存在功能之间的依赖关系