【问题标题】:Preprocessing training list with sklearn使用 sklearn 预处理训练列表
【发布时间】:2018-05-07 22:05:42
【问题描述】:

我有以下形式的mnist培训列表:

def load_data():
    f = gzip.open('mnist.pkl.gz', 'rb')
    training_data, validation_data, test_data = cPickle.load(f, encoding='latin1')
    f.close()
def load_data_wrapper():
    tr_d, va_d, te_d = load_data()
    training_inputs = [np.reshape(x, (784, 1)) for x in tr_d[0]]
    training_results = [vectorized_result(y) for y in tr_d[1]]
    training_data = list(zip(training_inputs, training_results))
    ........................................

现在我想对训练输入进行预处理,使其均值和单位方差为零。所以我在下面使用了from sklearn import preprocessing

def SGD(self, training_data, epochs, mini_batch_size, eta,
            test_data=None):

        if test_data: n_test = len(test_data)
        preprocessed_training = preprocessing.scale(training_data)
        n = len(preprocessed_training)
        for j in range(epochs):
            random.shuffle(preprocessed_training)
            mini_batches = [
                training_data[k:k+mini_batch_size].....
                ....................

但是,我收到以下错误:

ValueError: setting an array element with a sequence.

我正在修改来自 mnielsen 的代码,该代码位于 here。一般来说,我是 python 和机器学习的新手。如果有人可以帮助我,我将不胜感激。 注意:如果您认为有更好的库选项,请也告诉我。

Update_1:这是我的另一次尝试,但出现了同样的错误。

    scaler = StandardScaler()
    scaler.fit(training_data)
    training_data = scaler.transform(training_data)
    if test_data: test_data = scaler.transform(test_data)

Update_2:我使用 pandas 数据框尝试了建议答案中提供的解决方案,但仍然遇到同样的错误。

Update_3 :所以它是对象类型,但我需要浮点类型来执行缩放器。我执行了以下操作:training_data = np.asarray(training_data).astype(np.float64),但我仍然收到错误消息!

Update_4:通用 mnist 数据集结构:50k 训练图像,10k 测试图像。在 50k 幅图像中,每幅图像为 28 * 28 像素,即 784 个数据点。例如,MNIST 中的一个数据点,如果它的原始输出是 5,那么它就是 (array([ 0., 0., 0., ..., 0., 0., 0.], dtype=float32), 5) tuple。可以看到 tuple 中的第一个元素是一个稀疏矩阵。Here 是训练数据集的一个示例,第一个元素元组(即具有 784 个灰度浮点数的输入图像)。沿着元组的第二个元素,我们只是将输出作为数字 0 到 9。但是,在一个热编码中,我们给出一个 10D 向量,其中所有索引值都是零除了输出值的索引。所以对于数字 5,它将是 [[0],[0],[0],[0],[0],[1],[0],[0],[0],[0]]。我正在使用的包装器修改可以在 here 找到。

【问题讨论】:

    标签: python numpy machine-learning scikit-learn neural-network


    【解决方案1】:

    我遇到的问题是因为from sklearn.preprocessing import StandardScaler 改变了我的数据维度。我没有使用 StandardScaler ,而是将 preprocessing.scale 用于我的 (50k,(784,1)) dim 数据集中的每个输入。也就是说,我对axis = 1 上的每个 (784,1) 数据使用了 scale 函数,并使用 for 循环添加了它们。这减慢了程序的速度,但奏效了。如果有人知道更好的方法,请在答案部分告诉我。

    【讨论】:

      【解决方案2】:

      我这样做的方式有点不同。回想一下,您必须使用从所有训练数据构建的相同功能来扩展您的训练和测试集。此外,您只想操纵您的功能。我将首先转换为 traintest 数据框以及 features 列表。

      from sklearn.preprocessing import StandardScaler
      scaler = StandardScaler()
      scaler.fit(train[features])   
      X_train = pd.DataFrame(scaler.transform(train[features]),columns = train[features].columns)
      X_test = pd.DataFrame(scaler.transform(test[features]),columns = test[features].columns)
      

      这行得通吗?您是否有理由需要使用批处理?

      【讨论】:

      • 我正在关注在线书籍 {neuralnetworksanddeeplearning.com/chap3.html} 。作者使用小批量而不是同时输入整个数据集来加快学习过程。我也认为这很重要。
      • 我建议你简化,看看你是否在每一步都得到了你期望的结果。数据框会有所帮助。您的数据以错误的方式构建,无法正确读取。您的错误是由此造成的。看这个帖子stackoverflow.com/questions/4674473/…你的错误很可能与机器学习无关。
      • 我使用了你所说的 pandas 数据框,但我仍然遇到同样的错误!
      • 查看 df.dtypes 和每列的内容。该错误意味着其中一个格式不正确
      • 抱歉,除了这些,我无能为力。该错误严格地说,当它需要一个数字时,您正在给出一个列表(即 [1,2,3])。这就是为什么我认为数据框有助于使其在视觉上更清晰,或者这是您的类型的问题(字符串是字符列表)。
      猜你喜欢
      • 1970-01-01
      • 2019-06-02
      • 2017-08-29
      • 2020-06-26
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-15
      相关资源
      最近更新 更多