SVM визуализация действительно случайная и неточная

def vec(utterance): 
    embedder = UtteranceEmbedder(utterance)
    word2vec = embedder.as_word2vec()
    bow = embedder.as_bow_vec()
    ret = np.concatenate([word2vec, bow])
    return np.pad(ret, [0, 500-len(ret)], "constant")

op = OptionParser()
op.add_option(
    "-f", "--file", help="path to file containing utterances to visualize",
    action="store", type="string", dest="path"
)

(opt, args) = op.parse_args()
if opt.path is None or (opt.path is not None and len(opt.path)) == 0:
    op.error("path to file containing newline separated utterances must be specified")

vectors = []
with open(opt.path) as f:
    content = f.readlines()
    # you may also want to remove whitespace characters like `\n` at the end of each line
    for utterance in [x.strip() for x in content]:
        vectors.append(vec(utterance))


vectors_reduced = TSNE(n_components=2).fit_transform(np.array(vectors))
X=np.array(vectors_reduced)
y=np.array([0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1])
clf = svm.SVC(decision_function_shape='ovo',class_weight="balanced)
clf.fit(X, y) 

Выражением будет фраза, я токенизирую высказывание, извлекаю векторную форму word2vec из обученной модели Google 300B, добавляю пакет с вектором слов и подгоняю данные. Ниже приведены мои тренировочные данные: Input.txt

yea
yeah
yaa
say
ok
okay
no
nope
not interested
dont
cant
cannot
not now
not really
not at the moment
no thank you
sorry no
sorry
not active

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

Что может быть в случае такого совершенно неточного происшествия.

1 ответ

Вы используете SVC со стандартными параметрами. Особенно ваше ядро ​​является ядром rbf (также известным как гауссиан). Как работа SVM слишком сложна для размещения здесь, а с ядром - еще сложнее. Если вы заинтересованы, я могу порекомендовать вам лекцию из Массачусетского технологического института.

https://www.youtube.com/watch?v=_PwhiWxHK8o

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

Btw. Вы также должны подумать о стандартизации.

Другие вопросы по тегам