Ich habe 9164 Punkte, wobei 4303 als die Klasse, die ich vorhersagen möchte, und 4861 als nicht diese Klasse bezeichnet werden. Sie sind keine doppelten Punkte.sklearn SVM funktioniert furchtbar schlecht
Nach How to split into train, test and evaluation sets in sklearn?, und da meine dataset
ist ein Tupel von 3 Elemente (id, Vektor, Label), das tue ich:
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
und dann:
>>> 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
und ich richtig bekommen nur 943 Etiketten aus 1833 (= len (test_labels)) -> (943 * 100/1843 = 51,4%)
ich bin suspe Wenn ich hier etwas Großes verpasse, sollte ich vielleicht einen parameter zum Klassifikator setzen, um raffiniertere Arbeit oder etwas zu tun?
Hinweis: Zum ersten Mal SVMs hier verwendet wird, so alles, was Sie vielleicht für selbstverständlich bekommen, könnte ich mir vorstellen, nicht einmal haben ...
Versuch:
ich ahed ging und verringert die Anzahl der negative Beispiele zu 4303 (gleiche Anzahl wie positive Beispiele). Diese etwas verbesserte Genauigkeit.
Bearbeiten nach der Antwort:
>>> 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)
Auch habe ich versucht clf.fit(train_data, train_labels)
, die gleich ausgeführt.
Bearbeiten mit Daten (die Daten sind nicht zufällig):
>>> 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'
SVMs benötigen Parameter-Tuning, was sehr wichtig ist (besonders nichtlineare Kernel). Du scheinst diese nicht zu stimmen. Es ist auch sehr wichtig, Ihre Daten zu standardisieren (Mittelwert und Varianz). Verwenden Sie scikit-learns * GridSearchCV *, um diese automatisch mit der Kreuzvalidierung abzustimmen. – sascha
@sascha könnten Sie bitte ein Beispiel oder etwas mehr bieten? Ich bin wirklich ein Neuling hier! Und was du sagst, klingt wirklich richtig! – gsamaras
Lesen Sie einfach scikit-learns [Benutzer-Guide] (http://scikit-learn.org/stable/modules/svm.html). Dies sind sehr elementare Schritte und ich bin verwirrt, warum Leute solch ein theoretisch komplexes Konzept wie SVMs verwenden, ohne auch nur die grundlegenden Nutzungsregeln zu lesen. [Heres ein GridSearch-Beispiel] (http://scikit-learn.org/stable/auto_examples/svm/plot_rbf_parameters.html), das auch zeigt, wie wichtig Parameter-Tuning ist -> Genauigkeiten zwischen ~ [0.2, 0.95] – sascha