使用 sklearn.utils.shuffle 向 K 邻居分类器中的数据集添加一些噪声

Posted

技术标签:

【中文标题】使用 sklearn.utils.shuffle 向 K 邻居分类器中的数据集添加一些噪声【英文标题】:Adding some noise to dataset in K Neighbors Classifier using sklearn.utils.shuffle 【发布时间】:2021-12-06 05:42:09 【问题描述】:

我正在尝试向训练数据集添加一些噪音,以监控我的机器学习算法的性能。这是我的代码:

import numpy as np
from sklearn.utils import shuffle

X_shuffled,y_shuffled = shuffle(X_train, y_train, random_state=0, n_samples=50)
X_noisy=np.concatenate((X_train, X_shuffled))
y_noisy=np.concatenate((y_train, y_shuffled))

knn = KNeighborsClassifier(n_neighbors = 5)
knn.fit(X_noisy, y_noisy)

print('accuracy: ', knn.score(X_test, y_test))

但问题是我的模型在添加噪声后的准确性与添加一些噪声之前的准确性相同。我不为什么? 我还尝试使用 sklearn.utils.resample 添加一些噪音,但准确性再次相同。 非常感谢您的帮助。

【问题讨论】:

【参考方案1】:

使用 shuffle 您并没有真正添加噪音,只是更多的数据。我以虹膜数据为基准,

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.utils import shuffle
from sklearn.pipeline import make_pipeline
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
import numpy as np

iris = load_iris() # load data
X = iris.data
y = iris.target

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30)

小套装

XX = X_train[1:4,:]
YY = y_train[1:4][:,None]
XY = np.concatenate((XX, YY), axis=1)
array([[5.5, 2.4, 3.8, 1.1, 1. ],
       [5.9, 3.2, 4.8, 1.8, 1. ],
       [5.8, 2.8, 5.1, 2.4, 2. ]])

现在随机播放

XXs, YYs = shuffle(XX, YY, random_state=0)
XY = np.concatenate((XX, YY), axis=1)
array([[5.8, 2.8, 5.1, 2.4, 2. ],
       [5.9, 3.2, 4.8, 1.8, 1. ],
       [5.5, 2.4, 3.8, 1.1, 1. ]])

可以看到输入行 X[I,:] 映射到相同的 Y 标签。所以代码只是简单地添加更多数据。 所以在“噪音”下运行(阅读更多数据),应该在这里提供更高的准确度,

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.utils import shuffle
from sklearn.pipeline import make_pipeline
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
import numpy as np

iris = load_iris() # load data
X = iris.data
y = iris.target

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30)
X_shuffled,y_shuffled = shuffle(X_train, y_train, random_state=0)

X_noisy=np.concatenate((X_train, X_shuffled))
y_noisy=np.concatenate((y_train, y_shuffled))

model = make_pipeline( StandardScaler(), KNeighborsClassifier(n_neighbors = 5) )

model.fit(X_noisy, y_noisy)

print('accuracy with "noise": ',  model.score(X_test, y_test))
accuracy with "noice":  0.9777

并运行

model.fit(X_train, y_train)

给予,

accuracy with "noise":  0.9333

【讨论】:

非常感谢您的解释,但它没有回答我的问题。我的问题是如何在我的训练数据集中添加一些噪音。我认为模型的准确性应该会在存在一些噪音的情况下降低,但结果并没有显示这一点。

以上是关于使用 sklearn.utils.shuffle 向 K 邻居分类器中的数据集添加一些噪声的主要内容,如果未能解决你的问题,请参考以下文章

第一篇 用于测试使用

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份