我有一个包含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)
答案 0 :(得分:1)
假设您的问题是"为什么会发生":
在你的第一个和第二个代码片段中,你发生了潜在的混乱(在你的交叉验证和你的train_test_split方法中),因此它们与你的最后一个片段相同(在得分和算法上)并且#34; on" 34。
由于您的原始数据集按日期排序,因此可能(并且通常可能)某些数据会随时间发生变化,这意味着由于您的分类器从未看到过去1000个时间点的数据,因此它不知道基础分布,因此无法对其进行分类。
在评论中回答进一步数据的附录:
这表明可能会在较短的时间范围内捕获一些指示性过程。探索它的两种有趣方式是: