У меня есть 9164 точки, где 4303 помечены как класс, который я хочу предсказать, а 4861 обозначены как не тот класс. Они не дублируют очки.sklearn SVM выполняет ужасно плохо
После How to split into train, test and evaluation sets in sklearn?, и, так как мой dataset
является кортеж из 3-х элементов (ID, вектор, этикетка), я делаю:
df = pd.DataFrame(dataset)
train, validate, test = np.split(df.sample(frac=1), [int(.6*len(df)), int(.8*len(df))])
train_labels = construct_labels(train)
train_data = construct_data(train)
test_labels = construct_labels(test)
test_data = construct_data(test)
def predict_labels(test_data, classifier):
labels = []
for test_d in test_data:
labels.append(classifier.predict([test_d]))
return np.array(labels)
def construct_labels(df):
labels = []
for index, row in df.iterrows():
if row[2] == 'Trump':
labels.append('Atomium')
else:
labels.append('Not Trump')
return np.array(labels)
def construct_data(df):
first_row = df.iloc[0]
data = np.array([first_row[1]])
for index, row in df.iterrows():
if first_row[0] != row[0]:
data = np.concatenate((data, np.array([row[1]])), axis=0)
return data
, а затем:
>>> classifier = SVC(verbose=True)
>>> classifier.fit(train_data, train_labels)
[LibSVM].......*..*
optimization finished, #iter = 9565
obj = -2718.376533, rho = 0.132062
nSV = 5497, nBSV = 2550
Total nSV = 5497
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape=None, degree=3, gamma='auto', kernel='rbf',
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=True)
>>> predicted_labels = predict_labels(test_data, classifier)
>>> for p, t in zip(predicted_labels, test_labels):
... if p == t:
... correct = correct + 1
и я получаю только правильно 943 этикетки из 1833 (= LEN (test_labels)) -> (943 * 100/1843 = 51,4%)
Я suspe cting Мне не хватает чего-то большого времени здесь, может быть, я должен установить классификатор parameter, чтобы сделать более утонченную работу или что-то еще?
Примечание: В первый раз, используя SVMs здесь, так что вы могли бы получить должное, я бы даже не представляю ...
Попытка:
Я пошел Ахед и уменьшилось количество отрицательные примеры до 4303 (то же число, что и положительные примеры). Это немного улучшило точность.
Edit после ответа:
>>> print(clf.best_estimator_)
SVC(C=1000.0, cache_size=200, class_weight='balanced', coef0=0.0,
decision_function_shape=None, degree=3, gamma=0.0001, kernel='rbf',
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)
>>> classifier = SVC(C=1000.0, cache_size=200, class_weight='balanced', coef0=0.0,
... decision_function_shape=None, degree=3, gamma=0.0001, kernel='rbf',
... max_iter=-1, probability=False, random_state=None, shrinking=True,
... tol=0.001, verbose=False)
>>> classifier.fit(train_data, train_labels)
SVC(C=1000.0, cache_size=200, class_weight='balanced', coef0=0.0,
decision_function_shape=None, degree=3, gamma=0.0001, kernel='rbf',
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)
Также я попытался clf.fit(train_data, train_labels)
, который выполняется так же.
Редактировать данные (данные не являются случайными):
>>> train_data[0]
array([ 20.21062112, 27.924016 , 137.13815308, 130.97432804,
... # there are 256 coordinates in total
67.76352596, 56.67798138, 104.89566517, 10.02616417])
>>> train_labels[0]
'Not Trump'
>>> train_labels[1]
'Trump'
SVM нужна настройка параметров, что очень важно (особенно нелинейные ядра). Вы, кажется, не настраиваете их. Также очень важно стандартизировать ваши данные (среднее значение и дисперсия). Используйте scikit-learns * GridSearchCV *, чтобы автоматически настраивать их с помощью перекрестной проверки. – sascha
@sascha Не могли бы вы предоставить примеры или что-то еще? Я действительно новичок здесь! И то, что вы говорите, звучит действительно правильно! – gsamaras
Просто читайте scikit-learns [руководство пользователя] (http://scikit-learn.org/stable/modules/svm.html). Это очень элементарные шаги, и я озадачен тем, почему люди используют такую теоретически сложную концепцию, как SVM, даже не читая об основных правилах использования. [Heres a GridSearch example] (http://scikit-learn.org/stable/auto_examples/svm/plot_rbf_parameters.html), который также показывает, насколько важна настройка параметров -> точность между ~ [0.2, 0.95] – sascha