Python Kneighbors在没有洗牌的情况下获得不同的分数
我有一个具有155个特征的数据集。40143份样品。它按日期排序(从最早到最新),然后我从数据集中删除了日期列 标签位于第一列 CV结果约%65(分数的平均准确度+/-0.01),代码如下:Python Kneighbors在没有洗牌的情况下获得不同的分数,python,scikit-learn,Python,Scikit Learn,我有一个具有155个特征的数据集。40143份样品。它按日期排序(从最早到最新),然后我从数据集中删除了日期列 标签位于第一列 CV结果约%65(分数的平均准确度+/-0.01),代码如下: def cross(dataset): dropz = ["result"] X = dataset.drop(dropz, axis=1) X = preprocessing.normalize(X) y = dataset["result"]
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)
我还获得了与以下代码类似的精度:
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.%六十五
我应该提到的是,我从一开始到另一开始,每连续尝试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)
假设您的问题是“为什么会发生这种情况”:
在第一个和第二个代码段中,都发生了底层的无序化(在交叉验证和train_test_split方法中),因此它们(在分数和算法上)与上一个代码段中的无序化“on”是等价的
由于原始数据集是按日期排序的,因此可能(通常很可能)有一些数据会随时间而变化,这意味着由于分类器从未看到最近1000个时间点的数据,因此它不知道基础分布中的变化,因此无法对其进行分类
回复评论中进一步数据的附录: 这表明,可能存在一些在较小时间范围内捕获的指示性过程。有两种有趣的方法可以探索它:
嗨,谢谢。是的,我想知道为什么会这样。抱歉搞混了。是的,CV和训练测试都有洗牌。我尝试其他1000分,结果是一样的。我的意思是我得到了30.000-30.999,或20.000-20.999,或另外1000个绝对连续的样本作为测试数据集。