Ich möchte eine binäre Klassifizierung basierend auf verschiedenen Features, die ich habe (sowohl Text als auch numerisch). Trainingsdaten sind die Form des Pandas Datenrahmens. Meine Pipeline sieht ungefähr so aus:Sklearn: FeatureUnion von heterogenen Features gibt inkompatible Zeilenbemaßungen Fehler mit Klassifizierer in der Pipeline
final_pipeline = Pipeline([('union', FeatureUnion(
transformer_list=[('body_trans', Pipeline([('selector', ItemSelector(key='body')),
('count_vect', CountVectorizer())])),
('body_trans2', Pipeline([('selector', ItemSelector(key='body2')),
('count_vect', TfidfVectorizer())])),
('length_trans', Pipeline([('selector', ItemSelector(key='length')),
('min_max_scaler', MinMaxScaler())]))],
transformer_weights={'body_trans': 1.0,'body_trans2': 1.0,'length_trans': 1.0})),
('svc', SVC())])
ItemSelector wie folgt aussieht:
class ItemSelector(BaseEstimator, TransformerMixin):
def __init__(self, key):
self.key = key
def fit(self, x, y=None):
return self
def transform(self, data_frame):
return data_frame[[self.key]]
Nun, wenn ich final_pipeline.fit(X_train, y_train)
versuchen, es mir die Ausnahme ValueError: blocks[0,:] has incompatible row dimensions
gibt.
X_train, X_test, y_train, y_test = train_test_split(train_set, target_set)
ist, wie ich meine Trainingsdaten bekomme. train_set
ist ein Datenframe mit den Feldern body
, body2
, length
usw. target_set
ist ein Datenframe mit nur einem Feld namens label
, das ist meine eigentliche Bezeichnung zu klassifizieren.
Edit:
Ich glaube, meine Eingabedaten an die Pipeline nicht im richtigen Format ist.
train_set
sind meine Trainingsdaten mit den Merkmalen, Beispiel:
body length body2
0 blah-blah 193 blah-blah-2
1 blah-blah-blah 153 blah-blah-blah-2
und die target_set
, die der Datenrahmen mit dem Klassifizierungsetikett ist
label
0 True
1 False
Wenn es eine Anleitung auf Eingabeformat für Die Anpassungsparameter einer Pipeline unter Verwendung von DataFrames, bitte geben Sie mir einen Link! Ich kann keine ordnungsgemäße Dokumentation finden, wie Sie DataFrames als Eingabe für Pipelines laden, während Sie mehrere Spalten als separate Features verwenden.
Jede Hilfe wird geschätzt!
Bitte senden Sie einige Beispieldaten und einfach zu kopieren und Code zusammen mit der vollständigen Stack-Ablaufverfolgung von Fehler ausführen. –
haben einige Datenproben hinzugefügt! Danke – void
Das Problem ist in Ihrem ItemSelector. Es gibt einen 2-d Datenrahmen aus, aber CountVectorizer und TfidfVectorizer benötigen ein 1-d Array von Strings. –