【问题标题】:How to randomly duplicate some documents while importing the data set?导入数据集时如何随机复制一些文档?
【发布时间】:2018-12-01 14:54:56
【问题描述】:

我正在做一个项目,我必须检测数据集中存在的重复项。只是为了创建模型,我从 sklearn 获取了数据集 20newsgroup。

from sklearn.datasets import fetch_20newsgroups

categories = [
    'alt.atheism',
    'talk.religion.misc',
    'comp.graphics',
    'sci.space',
]
print("Loading 20 newsgroups dataset for categories:")
data_train = fetch_20newsgroups(subset='train', categories=categories,
                                shuffle=True, random_state=42)

data_test = fetch_20newsgroups(subset='test', categories=categories,
                               shuffle=True, random_state=42)
print('data loaded')

但是这个数据集有唯一的条目,所以我必须自己创建副本。这里的 data_train 是随机选择的用于训练模型的文档数组。

有谁知道随机复制这些文档需要做哪些更改,所以最后我会得到一个包含重复条目的数据集?

【问题讨论】:

  • 请提供更多细节。 fetch_20newsgroups 返回什么? data_traindata_test 的结构如何?
  • 感谢@BDL 指出错误,我希望现在我的问题得到了完整的描述,即使没有,告诉我
  • 第四次阅读后,我注意到 sklearn 不是来自您的命名空间,而是来自您正在使用的库。我想很多程序员都像我一样看待它,并假设我们正在谈论您编写的数据集。我现在用适当的库标签 (scikit-learn) 标记了您的问题,这样您就可以得到正确的专家来查看您的问题。未来:如果您提出一个非常具体的库问题,您应该用库标签标记它,并且您应该在问题中提及您正在使用该库。
  • 您如何使用data_traindata_test ?也许有了更深入的了解,我们可以告诉您如何根据您的用例复制其中的一些数据。

标签: python scikit-learn


【解决方案1】:

fetch_20newsgroups 的返回类型是 Bunch 对象。它在其data 变量中包含文档,在target 变量中包含相应的标签。所以,data_train.data 是一个列表,data_train.target 是一个 numpy 数组。您可能在导入数据集后使用data_train.datadata_train.target。下面的代码是从这些容器中复制一行。

import random
def duplicate(X, y):
    index = random.randint(0, len(X) - 1)
    X.append(X[index])
    y = np.append(y, y[index])
    return X, y

X = data_train.data
y = data_train.target

print(len(X))
print(len(y))

X, y = duplicate(X, y)

print(len(X))
print(len(y))

>>> 2034
>>> 2034
>>> 2035
>>> 2035

你也可以对data_test 做同样的事情。 duplicate 函数复制单行并返回文档、标签。您可能希望扩展该函数以通过一次调用复制多行。

注意:如果您希望您的 Bunch 对象具有重复的行。在复制 X 的行之后,您可能可以执行类似 data_train.data = X 的操作,但我不熟悉此对象类型,因此我不确定此对象的行为方式。

编辑

对于多个重复的行,上面的函数可以被多次调用。多个重复的更有效的实现如下:

import random
def duplicate(X, y, no_of_duplicate):
    index_lst = random.sample(range(len(X)), no_of_duplicate)
    y_duplicate = np.empty(no_of_duplicate)
    for i, duplicate_index in enumerate(index_lst):
      X.append(X[duplicate_index])
      y_duplicate[i] = y[duplicate_index]
    y = np.append(y, y_duplicate)
    return X, y

print(len(X))
print(len(y))

X, y = duplicate(X, y, 500)

print(len(X))
print(len(y))

【讨论】:

  • 这里你复制了一个文档,所以要创建大约 500 个或更多的副本,我必须多次运行重复命令?以及单个文档的 4-5 次重复
  • 真的有效!此重复功能是否只创建一次或多次文档的副本。像 data_train.data[2] 有 4 个重复项
  • 有什么方法可以在将数据集划分为训练和测试之前创建副本?
  • @shipikasingh,它最多复制一个文档一次。它选择这些文档而不进行替换。您可以将random.sample 行转换为random.choices(range(len(X), k=no_of_duplicate)(Python 3.6 或更高版本)选择替换项。对于其他问题,您单独导入数据集,以便在获取数据集时已经划分了数据集。一种解决方案是设置subset=all 来导入训练集和测试集,复制行,然后自己将它们分开。
猜你喜欢
  • 2021-09-03
  • 1970-01-01
  • 2020-05-30
  • 1970-01-01
  • 2017-05-25
  • 1970-01-01
  • 2018-03-29
  • 2013-01-16
  • 2011-05-25
相关资源
最近更新 更多