Penso che M0rkHaV abbia l'idea giusta. Scikit-learn della classe gasdotto è uno strumento utile per incapsulare più trasformatori diversi a fianco di un estimatore in un unico oggetto, in modo da avere solo per chiamare i tuoi metodi importanti una volta ( fit()
, predict()
, ecc). Analizziamo le due componenti principali:
I trasformatori sono classi che implementano sia fit()
e transform()
. Potresti avere familiarità con alcuni degli strumenti di preelaborazione sklearn, come TfidfVectorizer
e Binarizer
. Se guardi la documentazione di questi strumenti di preelaborazione, vedrai che implementano entrambi questi metodi. Quello che trovo piuttosto interessante è che alcuni stimatori possono essere utilizzati anche come passaggi di trasformazione, ad esempio LinearSVC
!
Gli stimatori sono classi che implementano sia fit()
e predict()
. Scoprirai che molti dei classificatori e dei modelli di regressione implementano entrambi questi metodi e come tali puoi testare prontamente molti modelli diversi. È possibile utilizzare un altro trasformatore come stimatore finale (cioè, non necessariamente implementa predict()
, ma sicuramente implementa fit()
). Tutto ciò significa che non saresti in grado di chiamare predict()
.
Per quanto riguarda la tua modifica: esaminiamo un esempio basato su testo. Utilizzando LabelBinarizer, vogliamo trasformare un elenco di etichette in un elenco di valori binari.
bin = LabelBinarizer() #first we initialize
vec = ['cat', 'dog', 'dog', 'dog'] #we have our label list we want binarized
Ora, quando il binarizzatore viene adattato su alcuni dati, avrà una struttura chiamata classes_
che contiene le classi uniche di cui il trasformatore "conosce". Senza chiamare fit()
il binarizzatore non ha idea di come siano i dati, quindi chiamare transform()
non avrebbe alcun senso. Questo è vero se si stampa l'elenco delle classi prima di provare ad adattare i dati.
print bin.classes_
Ottengo il seguente errore quando provo questo:
AttributeError: 'LabelBinarizer' object has no attribute 'classes_'
Ma quando inserisci il binarizzatore vec
nell'elenco:
bin.fit(vec)
e prova ancora
print bin.classes_
Ottengo quanto segue:
['cat' 'dog']
print bin.transform(vec)
E ora, dopo aver chiamato la trasformazione vec
sull'oggetto, otteniamo quanto segue:
[[0]
[1]
[1]
[1]]
Per quanto riguarda gli stimatori usati come trasformatori, usiamo il DecisionTree
classificatore come esempio di un estrattore di caratteristiche. Gli alberi decisionali sono ottimi per molte ragioni, ma per i nostri scopi, ciò che è importante è che abbiano la capacità di classificare le caratteristiche che l' albero ha trovato utili per la previsione. Quando si richiama transform()
un albero decisionale, esso prenderà i dati di input e troverà quelle che ritiene siano le caratteristiche più importanti. Quindi puoi pensare di trasformare la tua matrice di dati (n righe per m colonne) in una matrice più piccola (n righe per k colonne), dove le k colonne sono le k caratteristiche più importanti trovate dall'albero decisionale.