【问题标题】:How to fill two numpy arrays with values from another array如何用另一个数组中的值填充两个 numpy 数组
【发布时间】:2017-08-15 23:08:55
【问题描述】:

我对 numpy 很陌生。我需要获取一个数据集并从中创建一个测试集和一个训练集。 如果我的数据集是一个 150 行和 4 列的 numpy 数组(最后一列是标签),那么使用数据集中的值填充训练和测试数组的 正确 方法是什么,假设数据集可以不同 - 即,我不想为测试集和训练集手动编写形状?

我想要做的是,提供一个拆分值,它将获取一个数据集并用数据集的行填充测试和训练集,根据该值拆分。

我需要这样写一个方法:

def split(dataset, value, training, test):
 training = np.array #this is what I am confused about how to define   
test = np.array
if random.random() < value:
#this is where I am confused about how to populate the arrays
    append rows to training
else:
    append rows to test

【问题讨论】:

  • “分值”是什么意思?

标签: python arrays numpy


【解决方案1】:

如果不是出于教育目的您想手动拆分数据,我建议使用现有的解决方案。这样你就可以确定它是正确的*。 Scikit-learn 具有各种功能来执行cross-validation 或简单地使用train_test_split 在训练和测试集中拆分数据:

将数组或矩阵拆分为随机训练和测试子集

例如,要将数据集拆分为 80 行用于训练,20 行用于测试:

from sklearn.model_selection import train_test_split

x = np.random.randn(100, 5)  # generate random data

x_train, x_test = train_test_split(x, train_size=0.8)

print(x_train.shape)  # (80, 5)
print(x_test.shape)  # (20, 5)

*至少功能会正确实现。它不一定是正确的函数——通常有很多方法可以将数据分成训练集和测试集。其中一些可能比其他更合适,具体取决于应用程序的具体情况。

【讨论】:

  • 谢谢,这是最好的解决方案。基本上我可以在你的代码中将我的数据集作为 x 传递并像这样拆分它:train, test = train_test_split(data, train_size = split_value)
  • 顺便说一句,cross_validation 已被弃用,所以我改用了 model_selection
  • 对,我倾向于忘记我的 scikit learn 版本相当旧。答案已更新,谢谢。
【解决方案2】:

你可以简单地做类似的事情

n = 4
m = 120

data = np.loadtxt('iris.txt')
train_X = data[:m, :n]
train_Y = data[:m, n:]
test_X = data[m:, :n]
test_Y = data[m:, :n]

其中n是输入的维度,m是训练集中模式的数量。

【讨论】:

  • 我阅读 OP 想要按行而不是按列拆分的问题的方式:x_test = data[:n, :]x_train = data[n:, :],但沿列拆分可能会因为从标签中分离特征而变得有趣。
  • 这只是将数据集拆分为特征和标签,我需要根据输入值将数据集拆分为2组...
【解决方案3】:

具体实施会因您希望如何将数据拆分为训练集和测试集而有所不同。一种简单的方法是根据布尔掩码随机拆分。

data = np.random.rand(150,4)
mask = np.random.rand(len(data)) < 0.5 #returns a boolean array
train = data[mask]
test = data[~mask]

这将平均分配训练和测试,各 50%。你可以通过修改0.5来改变每组的大小

【讨论】:

    【解决方案4】:

    如果您想将数据随机拆分为训练和测试,可以通过以下方式进行:

    import numpy as np
    from sklearn.model_selection import train_test_split
    m=150
    n=4
    data=np.random.randint(5,size=[m,n])
    X_train, X_test, y_train, y_test = train_test_split(data[:,:n-1], data[:,n-1], test_size=value)
    

    在上面的代码中,value表示将用作测试数据的数据的百分比。

    如果您想相对于该值而不是随机拆分,根据您修改后的代码似乎是这种情况:

    if random.random() < value:
    #this is where I am confused about how to populate the arrays
        append rows to training
    else:
        append rows to test
    

    你可以的

    data_train=data[data[:,n-1]<value]
    data_test=data[data[:,n-1]>=value]
    

    【讨论】:

      猜你喜欢
      • 2017-09-18
      • 1970-01-01
      • 2020-02-10
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      相关资源
      最近更新 更多