Если вы не планируете выполнять какую-либо необычную перекрестную проверку и в основном хотите разделить данные на наборы поездов и тестов, ниже приведен один из способов сделать это.
Предостережения: я генерирую данные случайным образом, поэтому, возможно, я буду работать над проблемами, с которыми вы не столкнетесь, например при приведении типов данных.
Вывод: вручную перетасуйте свои данные, используйте 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')
- Первый столбец: имя
- Второй столбец: фамилия
- Третий столбец: идентификатор
- Четвертый столбец: верный ответ (у верный)
- Пятый столбец: прогнозируемый ответ (у пред.)