Python機器學習——如何shuffle一個資料集(ndarray型別)

Inside_Zhang發表於2015-11-26

取 shuffle 的過程其實可看做從全排列中隨機選擇一個的過程。

稍微比較麻煩的是實現特徵向量與類別標籤的同步shuffle。

如果這裡資料集既包含特徵向量又包括標籤值,可直接呼叫np.random.shuffle()方法:

>>> np.random.shuffle(training_data)
>>> X = training_data[:, :-1]
>>> y = trianing_data[:, -1]

如果已對資料集的特徵向量與類別標籤列進行分離,這裡提供兩種方式進行同步shuffle:

1. 使用 np.random.shuffle()

  • X, y 同時進行 shuffle

    >>> training_data = np.hstack(X, y)
    >>> np.random.shuffle(training_data)
    >>> X = training_data[:, :-1]
    >>> y = training_data[:, -1]
    
  • 根據 indices 進行shuffle

    indices = np.arange(X.shape[0])
    np.random.shuffle(indices)
    X = X[indices]
    y = y[indices]
    

2. np.random.permutation() 對行索引進行一次全排列

>>> r = np.random.permutation(len(y))
								# 隨機地從全排列中選取一個,實現 shuffle
>>> X = X[r, :] 
>>> y = [r]

3. shuffle

上文所述皆是對矩陣的行(樣本矩陣的每一個樣本)進行 shuffle,那麼該如何 shuffle 矩陣的列呢(也即樣本矩陣的每一個屬性)。

仍然存在兩種方案,

  • np.random.shuffle()

    因為 np.random.shuffle() 直接對原始矩陣進行修改(返回值為NoneType),且不接受另外的引數,我們可對原始矩陣的轉置 shuffle 之後,再轉置

    >>> training_data = np.hstack(X, y)
    >>> training_data = training_data.T
    >>> np.random.shuffle(training_data)
    >>> training_data = training_data.T
    >>> X = training_data[:, :-1]
    >>> y = training_data[:, -1]
    
  • np.random.permutation() 對列索引進行一次全排列

    # 此時 y 參與 shuffle
    >>> r = np.random.permutation(X.shape[1])
    >>> X[:, r]
    

相關文章