Python - Numpy проблемы с конвейером - PullRequest
0 голосов
/ 24 августа 2018

Я построил нейронную сеть, и она отлично работает с меньшим набором данных, таким как 300 000 известных хороших строк и 70 000 подозрительных строк. Я решил увеличить размер известного блага до 6,5 миллионов строк, но столкнулся с некоторыми ошибками с памятью, поэтому я решил попробовать конвейер и запустить кадр данных. У меня есть 2 категориальные переменные и в столбце для зависимой переменной 1 и 0. Для начала набор данных выглядит следующим образом:

DBF2
   ParentProcess                   ChildProcess               Suspicious
0  C:\Program Files (x86)\Wireless AutoSwitch\wrl...    ...            0
1  C:\Program Files (x86)\Wireless AutoSwitch\wrl...    ...            0
2  C:\Windows\System32\svchost.exe                      ...            1
3  C:\Program Files (x86)\Wireless AutoSwitch\wrl...    ...            0
4  C:\Program Files (x86)\Wireless AutoSwitch\wrl...    ...            0
5  C:\Program Files (x86)\Wireless AutoSwitch\wrl...    ...            0

Вот что сработало, но когда мой массив стал слишком большим, он превысил память:

X = DBF2.iloc[:, 0:2].values
y = DBF2.iloc[:, 2].values
#Encoding categorical data
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
#Label Encode destUserName
labelencoder_X_1 = LabelEncoder()
X[:, 0] = labelencoder_X_1.fit_transform(X[:, 0])
#Label Encode Parent Process
labelencoder_X_2 = LabelEncoder()
X[:, 1] = labelencoder_X_2.fit_transform(X[:, 1])

#Create dummy variables
onehotencoder = OneHotEncoder(categorical_features = [0,1])
X = onehotencoder.fit_transform(X).toarray()

И получите эту ошибку памяти из-за огромной разреженной матрицы:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/scipy/sparse/compressed.py", line 947, in toarray
    out = self._process_toarray_args(order, out)
  File "/usr/local/lib/python2.7/dist-packages/scipy/sparse/base.py", line 1184, in _process_toarray_args
    return np.zeros(self.shape, dtype=self.dtype, order=order)
 MemoryError

Итак, я провел некоторое исследование и обнаружил, что вы можете использовать конвейер ( Как выполнить OneHotEncoding в Sklearn, получая ошибку значения ), и попытался реализовать это:

2-е редактирование

>>> from sklearn.preprocessing import LabelEncoder, OneHotEncoder
>>> labelencoder_X_1 = LabelEncoder()
>>> X[:, 0] = labelencoder_X_1.fit_transform(X[:, 0])
>>> labelencoder_X_2 = LabelEncoder()
>>> X[:, 1] = labelencoder_X_2.fit_transform(X[:, 1])

>>> onehotencoder = OneHotEncoder(categorical_features = [0,1])
>>> X = onehotencoder.fit_transform(X)

>>> X
<7026504x7045 sparse matrix of type '<type 'numpy.float64'>'
    with 14053008 stored elements in Compressed Sparse Row format>

#Avoid the dummy variable trap by deleting 1 from each categorical variable
>>> X = np.delete(X, [2038], axis=1)
>>> X = np.delete(X, [0], axis=1)

>>> from sklearn.model_selection import train_test_split
>>> X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)


#ERROR
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/sklearn/model_selection/_split.py", line 2031, in train_test_split
    arrays = indexable(*arrays)
  File "/usr/local/lib/python2.7/dist-packages/sklearn/utils/validation.py", line 229, in indexable
check_consistent_length(*result)
  File "/usr/local/lib/python2.7/dist-packages/sklearn/utils/validation.py", line 200, in check_consistent_length
    lengths = [_num_samples(X) for X in arrays if X is not None]
  File "/usr/local/lib/python2.7/dist-packages/sklearn/utils/validation.py", line 119, in _num_samples
" a valid collection." % x)
TypeError: Singleton array array(<7026504x7045 sparse matrix of type '<type 'numpy.float64'>'
with 14053008 stored elements in Compressed Sparse Row format>,
  dtype=object) cannot be considered a valid collection.

>>> from sklearn.preprocessing import StandardScaler
>>> sc = StandardScaler()
>>> X_train = sc.fit_transform(X_train)
#ERROR

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'X_train' is not defined

>>> X_test = sc.transform(X_test)
#ERROR

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'X_test' is not defined

1 Ответ

0 голосов
/ 24 августа 2018

Почему вы вообще делаете toarray() на выходе OneHotEncoder? Большинство оценщиков scikit смогут хорошо обрабатывать разреженные матрицы. Ваша часть конвейера делает то же самое, что вы делали выше ошибки памяти.

Сначала вы сделали это:

X = DBF2.iloc[:, 0:2].values

Здесь DBF2 - это pandas DataFrame, который имеет атрибут values для получения базового массива numpy.

Так что теперь X - это numpy array. Вы не можете сделать X.values больше. Вот причина вашей первой ошибки. Вы сейчас исправили это.

Теперь поговорим о предупреждении, оно относится не к X, а к y. (Это просто предупреждение и не о чем беспокоиться) Вы сделали это:

y = DBF2.iloc[:, 2].values

Итак, y - это массив элементов (n_samples, 1). 1, потому что вы выбрали только один столбец. Но большинство оценщиков Scikit требуют y формы (n_samples, ). Соблюдайте пустое значение после запятой.

Так что вам нужно сделать это:

y = DBF2.iloc[:, 2].values.ravel()

Обновление

X - разреженная матрица, поэтому вы не можете использовать с ней операции с числами (np.delete). Сделайте это вместо:

index_to_drop = [0, 2038]      #<=== Just add all the columns to drop here
to_keep = list(set(xrange(X.shape[1]))-set(index_to_drop))    
X = X[:,to_keep]

# Your other code here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...