2017-02-21 11 views
0

Это сообщение сопровождается ниже сообщение:Проверьте мои данные линейно разделимы

https://cs.stackexchange.com/questions/70395/what-is-the-effect-of-hidden-layer-size

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

Мои входные данные, X - матрица (10000, 128), а выходные/целевые/классы (10000, 10). Я имею 10 классов от 1 до 10.

используя следующий код, я попробовал LogisticRegression(), svm.LinearSVC (C = 1, loss = 'hinge') и svm.SVC (kernel = 'linear', C = 1):

dataframe = read_csv('data.txt') 
array = dataframe.values 

X = array[:, 0:128] 
y = array[:,-1] 

plt.hist(y, bins='auto') # plt.hist passes it's arguments to np.histogram 
plt.title("Histogram with 'auto' bins") 
plt.show() 

models = [] 
models.append(('LR', LogisticRegression())) 
models.append(('LSVM', svm.LinearSVC(C=1, loss='hinge'))) 
models.append(('LSVM2', svm.SVC(kernel='linear', C=1))) 

results=[] 
names=[] 
scoring = 'accuracy' 
for name, model in models: 
    kfold = KFold(n_splits=10, random_state=7) 
    cv_results = cross_val_score(model, X, y, cv=kfold, scoring=scoring) 
    results.append(cv_results) 
    names.append(name) 
    msg = "%s: %f (%f)" % (name, cv_results.mean(), cv_results.std()) 
    print(msg) 

и вот результаты:

LR: 0.613360 (0.019632) 
LSVM: 0.307829 (0.020123) 
LSVM2: 1.000000 (0.000000) 

у меня 2 вопроса:

(1) мои данные линейно разделимы?

(2) является результатом LSVM2 странным? для этого я дополнительно использовал

models.append(('RBFSVM', svm.SVC(kernel='rbf', gamma=0.7, C=1))) 
models.append(('POLYSVM', svm.SVC(kernel='poly', degree=3, C=1))) 

и получил следующее:

RBFSVM: 0.797680(.015187) 
POLYSVM: 0.100011(0.008113) 

пожалуйста, вы можете помочь мне получить больше интуиции?

Спасибо,

ответ

2

Общее примечание - понятие линейной отделимости относится к двоичным наборам данных, а не 10-ти классов. Если у вас более двух классов, нет такой вещи, как линейная разделимость, поскольку вы можете определить ее разными способами. Ради остальной части ответа я буду считать, что мы говорим о «попарно линейно отделимом», а это означает, что если вы выберете любые два класса, они могут быть линейно отделены друг от друга (обратите внимание, что это другое дело, -vs - всякая линейная сепарабельность, так как существуют наборы данных, которые являются одно-vs-one линейно разделяемыми и не являются одно-vs-все линейно разделяемыми).

Прежде всего, чтобы проверить, являются ли данные линейно отделимыми не использование перекрестная проверка. Просто подгоните свою модель к целым данным и проверьте ошибку, нет необходимости в поездке/валидации/тестовых расколах, тренируйтесь на всем - проверяйте все. Фактически выполнение перекрестной проверки делает это неправильным, так как вы можете получить 100% без линейной разделимости (если вам посчастливилось разделить данные таким образом, чтобы каждое подмножество было линейно отделимо).

Во-вторых, отключите регуляризацию. «C» в SVM делает это «не сложно», жесткий SVM эквивалентен SVM с C = бесконечность, поэтому установите C = 100000, чтобы иметь хотя бы некоторую приличную вероятность разделения. То же самое относится к логистической регрессии в sklearn, у нее гиперпараметр C тоже, установите его на 1000000 (в основном что-нибудь ОГРОМНОЕ), а затем переучитесь.

+0

Спасибо за ваш ответ @lejlot. Быстрый вопрос для вас (или, может быть, глупый, поскольку я не разбираюсь в этом): почему мои данные одномерны? У меня есть 128 функций ввода. Будет ли это рассматриваться в измерении моих данных? – tafteh

+0

Я исправил размер входных функций X, который был указан неверно: «X - это матрица (10000, 128), а выходные/целевые/классы (10000, 10) ...» , если это изменит ваш ответ или нет? – tafteh

+0

Это только изменяет конечную точку, ничего больше (которую я сейчас удалил, так как после вашего обновления она больше не применяется). – lejlot

Смежные вопросы