Scikit-learn, включая строки в результатах контролируемого обучения - PullRequest
0 голосов
/ 08 мая 2018

У меня есть большой набор данных с именами и фамилиями, а также строка идентификатора, которую я не хочу включать в фактическое обучение классификатора. Однако я хочу связать эти имена с соответствующими записями данных. Каждая строка определяется в CSV-файле следующим образом:

firstname(string),lastname(string),identifier(string),(int),(int),(int),...(int)

У меня есть dataInput с несколькими строками данных выше и targetList с 1 и 0, относящимися к моему результату.

data = genfromtxt(dataInput, delimiter=',')
answers = genfromtxt(targetList, delimiter = ',')
from sklearn.neural_network import MLPClassifier
clf = MLPClassifier(solver='lbfgs', alpha=1e-5)
# generate random indices to test
test_idx = random.sample(range(1,8000), 100)
train_target = np.delete(answers, test_idx)
train_data = np.delete(data, test_idx)
test_target = answers[test_idx]
test_data = data[test_idx]
#Code errors out here
clf.fit(train_data, train_target)
clf.predict(test_data)

В результате набор данных становится одномерным массивом и не обрабатывает результат. Без строк этот код работает. Однако меня попросили включить эти имена и идентификаторы в мой результат. Как я могу отформатировать данные CSV и сказать классификатору связать идентифицирующие строки и подогнать данные без подгонки строк?

1 Ответ

0 голосов
/ 08 мая 2018

Если вы не планируете выполнять какую-либо необычную перекрестную проверку и в основном хотите разделить данные на наборы поездов и тестов, ниже приведен один из способов сделать это.

Предостережения: я генерирую данные случайным образом, поэтому, возможно, я буду работать над проблемами, с которыми вы не столкнетесь, например при приведении типов данных.

Вывод: вручную перетасуйте свои данные, используйте train_test_split (из sklearn) и установите shuffle=False, затем нарежьте наборы данных с кусочками, чтобы вырезать строковые столбцы и передать числовые значения в классификатор. Нарезка делает этот пример уродливым, поэтому я лично использую панд.

Альтернативный способ: немного более продвинутый, но вы можете использовать конвейер и пользовательский преобразователь для выбора числовых данных из общих данных (не показано ниже).

import numpy as np
from scipy.stats import bernoulli
import string, random

from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import train_test_split

### making up data, don't need to understand this part ###
size = 10000
fnames = np.array([''.join(random.choices(string.ascii_letters, k=5)) for i in range(size)])
lnames = np.array([''.join(random.choices(string.ascii_letters, k=5)) for i in range(size)])
identifier = np.array([''.join(random.choices(string.ascii_letters, k=2)) for i in range(size)])
rand_ints = np.random.randint(0, 20, (size,10))

data = np.column_stack((fnames, lnames, identifier, rand_ints))
answers = bernoulli.rvs(0.3, size=size)
###---------------------------end----------------------###

np.random.shuffle(data) # an in-place operation

X_train, X_test, y_train, y_test = train_test_split(
    data, answers, test_size=0.10, random_state=42, shuffle=False)

clf = MLPClassifier(solver='lbfgs', alpha=1e-5)
clf.fit(X_train[:, 3:].astype('int16'), y_train)
score = clf.score(X_test[:, 3:].astype('int16'), y_test)
print('Test score: {}'.format(score))

pred = clf.predict(X_test[:, 3:].astype('int16'))

X_train_result = np.column_stack((X_train[:, :3], y_train, clf.predict(X_train[:, 3:].astype('int16'))))
X_test_result = np.column_stack((X_test[:, :3], y_test, clf.predict(X_test[:, 3:].astype('int16'))))

Выход из вышеприведенного примера:

Test score: 0.694
>>> X_train_result
array([['TGOxK', 'dOKWj', 'Bn', '1', '0'],
       ['GmqwM', 'iucDx', 'qX', '1', '0'],
       ['VXdJG', 'SJRVg', 'Nl', '1', '0'],
       ...,
       ['jClSD', 'ABkrp', 'zZ', '0', '0'],
       ['IoLrh', 'HiHLI', 'oU', '1', '0'],
       ['zzyGR', 'UCpRT', 'xg', '0', '0']], dtype='<U11')
>>> X_test_result
array([['zOLmZ', 'OMVrx', 'AS', '1', '0'],
       ['wfIsi', 'zEMEE', 'PU', '1', '0'],
       ['wHVtq', 'fbtMK', 'UD', '1', '0'],
       ...,
       ['paBoM', 'HVjpF', 'Ez', '0', '0'],
       ['ZivWN', 'VrHhm', 'FL', '0', '0'],
       ['WnHLw', 'hakoK', 'Qv', '0', '0']], dtype='<U11')
  • Первый столбец: имя
  • Второй столбец: фамилия
  • Третий столбец: идентификатор
  • Четвертый столбец: верный ответ (у верный)
  • Пятый столбец: прогнозируемый ответ (у пред.)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...