Как классифицировать матрицы (или наборы данных)

Учитывая проблему классификации, обучающие данные выглядят следующим образом:

input - output
--------------
A       100
B       150
C       170
..............

где A, B, C — большие наборы данных, каждый из которых содержит 6 переменных и около 5000 строк.

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

Я попытался прикрепить к каждой строке значение классификатора обучения и обучить их как таковые. Для новой записи каждая строка будет классифицирована, и я возьму среднее (среднее) значение в качестве классификатора для всего набора данных. Но у меня не было очень хороших результатов с использованием наивного Байеса.

Должен ли я продолжать изучать этот метод с другими классификаторами? Какие еще варианты я мог бы рассмотреть?

Изменить

Примеры данных из 2 событий

    OUT Var1    Var2    Var3    Var4    Var5    Var6
0   93  209.2   49.4    5451.0  254.0   206.0   37.7
1       344.9   217.6   14590.5 191.7   175.5   106.8
2       663.3   97.2    17069.2 144.4   2.8     59.9
3       147.4   137.7   12367.4 194.1   237.7   116.2
4       231.8   162.2   11938.4 71.3    149.1   116.3

    OUT Var1    Var2    Var3    Var4    Var5    Var6
964 100 44.5    139.7   10702.5 151.4   36.0    17.9
966     59.8    148.9   3184.9  103.0   96.5    12.8
967     189.7   194.4   7569.6  49.9    82.6    55.2
969     158.5   88.2    2932.4  159.8   232.8   125.2
971     226.4   155.2   3156.3  85.0    4010.5  69.9

Для аналогичного набора данных мне нужно предсказать значение out. У меня много таких образцов.

Правильно ли применять одно и то же значение ко всем строкам?


person ashcrok    schedule 08.12.2016    source источник


Ответы (1)


Посмотрите горячее кодирование. Учитывая входную переменную x, которая имеет три различных класса (это часто называют «фактором»), для каждого уникального значения x вам нужен столбец с двоичным кодированием в вашем наборе данных, чтобы алгоритм машинного обучения понимал, с чем он имеет дело ( т.е. он сможет узнать, почему данный класс 'A' соответствует различным выходным значениям).

Изменить!!

Еще одно важное примечание: то, что вы хотите сделать (например, сопоставить некоторые функции с непрерывной выходной переменной), не называется "классификацией". Это называется «регресс». В вашем случае проблема классификации будет заключаться в том, что вы перевернете свои данные и попытаетесь предсказать inputs (т.е. A, B или C) с учетом вашего outputs (ваши непрерывные целые числа). Ниже я покажу, как сделать регрессию в вашем случае. Если вы попробуете классифицировать так, как вы описываете, у вас закончится len(set(df['outputs'])) количество различных классов, которые вы пытаетесь предсказать. Классификация не подходит для вашего сценария.

Ниже приводится быстрый и грязный пример:

import random
from sklearn.linear_model import LogisticRegression
from sklearn.cross_validation import train_test_split
from sklearn.metrics import r2_score
import pandas as pd
import numpy as np

inputs = ['A', 'B', 'C']

# create some random data similar to yours
df = pd.DataFrame({'input': [random.choice(inputs) for _ in range(5000)], 'output': [int(abs(n) * 100) for n in np.random.randn(5000)]})

# one-hot-encode the categorical variable 'input' for use in classification
dummies = pd.get_dummies(df['input'])

# merge the one-hot-encoded dummies back with the original data
df = df.join(dummies)

# our feature  matrix (input values as dummies)
X = df[['A', 'B', 'C']]

# our outcome variable
y = df['output']

# split the dataset into train and test objects so we can gauge the accuracy of our classifier
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size = 0.80, random_state = 100)

# our model instance
model = LogisticRegression()

# train the classifier
model.fit(X_train, y_train)

# use trained model from above to predict the class of "new" data
predicted = model.predict(X_test)

# let's see how well the classifier performed
print(r2_score(y_test, predicted))

Редактировать 2:

Чтобы ответить на ваш отредактированный вопрос, если строки в каждом образце принадлежат одному и тому же классу, тогда да, вы должны применять одно и то же значение к каждой из строк в образце. Для вашего первого «события» выше, если все строки (с индексами от 0 до 4) относятся к одному и тому же классу/группе, то вы должны применить 93 ко всем строкам в выборке (все строки, которые находятся в сорт).

person blacksite    schedule 08.12.2016
comment
Да, я понимаю разницу между классификацией и регрессией. У меня нет проблем с применением его к набору данных, но в этом случае у меня проблема с самим набором данных. Я отредактировал сообщение. В любом случае спасибо за объяснение. Я признателен за это :). - person ashcrok; 08.12.2016
comment
См. второе редактирование выше. Я надеюсь, что это отвечает на ваш вопрос. - person blacksite; 08.12.2016