Wie wird das gemacht? Ich benutze Sklearn, um eine SVM zu trainieren. Meine Klassen sind unausgewogen. Beachten Sie, dass mein Problem mehrklassige ist, so bin mit Multilabel OneVsRestClassifier I:Zuweisen einer Gewichtung zu einer Multilabel-SVM zum Ausgleichen von Klassen
mlb = MultiLabelBinarizer()
y = mlb.fit_transform(y_train)
clf = OneVsRestClassifier(svm.SVC(kernel='rbf'))
clf = clf.fit(x, y)
pred = clf.predict(x_test)
Kann ich ein ‚sample_weight‘ Parameter irgendwo hinzufügen für die unausgeglichenen Klassen zu berücksichtigen?
Wenn ich einen class_weight dict zum SVM hinzufügen erhalte ich die Fehlermeldung:
ValueError: Class label 2 not present
Das ist, weil ich meine Etiketten umgewandelt haben mit dem mlb binär. Allerdings, wenn ich nicht die Etiketten umwandeln, die ich erhalten:
ValueError: You appear to be using a legacy multi-label data representation. Sequence of sequences are no longer supported; use a binary array or sparse matrix instead.
class_weight ist ein dict, das Mapping der Klasse Etiketten auf das Gewicht: {1: 1, 2: 1, 3: 3 ...}
Hier sind die Details von x und y:
print(X[0])
[ 0.76625633 0.63062721 0.01954162 ..., 1.1767817 0.249034 0.23544988]
print(type(X))
<type 'numpy.ndarray'>
print(y[0])
print(type(y))
[1, 2, 3, 4, 5, 6, 7]
<type 'numpy.ndarray'>
Beachten Sie, dass mlb = MultiLabelBinarizer(); y = mlb.fit_transform (y_train) konvertiert y in ein binäres Array.
Die vorgeschlagene Antwort erzeugt den Fehler:
ValueError: You appear to be using a legacy multi-label data representation. Sequence of sequences are no longer supported; use a binary array or sparse matrix instead.
Also, das Problem reduziert die Etiketten zu konvertieren (a np.array) zu einer Sparse Matrix.
from scipy import sparse
y_sp = sparse.csr_matrix(y)
Dies erzeugt den Fehler:
TypeError: no supported conversion for types: (dtype('O'),)
Ich werde eine neue Abfrage für diese öffnen.
Könnten Sie ein zur Verfügung stellen Element von x Andy ? 'Druckart (x [0]) Druck x [0]' und 'Druckart (y [0]) Druck y [0]' – dooms
Hier ist das y nicht binär. Sehen Sie, ob 'mlb.classes_' Ihnen ein Array mit dem Wert 2 gibt. – dooms
Ich habe versucht, die Etiketten in binäre umzuwandeln. Es erzeugt den oben aufgeführten Fehler: ValueError: Klassenlabel 2 nicht vorhanden (weil alle Beschriftungen dann im Binärformat sind). Wenn ich nicht in binäre konvertieren, erhalte ich den Fehler: ValueError: Sie scheinen eine ältere Multi-Label-Datendarstellung zu verwenden. Sequenzen von Sequenzen werden nicht mehr unterstützt. Verwenden Sie stattdessen ein Binärarray oder eine Sparse-Matrix. –