2016-06-03 11 views
6

Mi chiedo se esiste un modo per specificare la funzione di costo personalizzato in sklearn/python? Il mio vero problema ha 7 classi diverse, ma per renderlo più chiaro assumiamo che voglio specificare un costo diverso per l'errata classificazione di un problema con 3 classi diverse e sono principalmente interessato al fatto che il mio modello distingua correttamente tra classe 1 e classe 3 .Ineguali costi di errata classificazione in python/sklearn

  • se l'osservazione ha classe 1 e modello prevede di classe 1, penalità è 0 (corretta classificazione)
  • se l'osservazione ha classe 1 e il modello predice classe 2, pena è 1
  • se il punto ha classe 1 e il modello prevede la classe 3, la penalità è 2

  • se punto ha classe 2 e modello prevede di classe 2, penalità è 0 (corretta classificazione)
  • se punto ha classe 2 e modello predice classe 3, pena è 1
  • se il punto ha classe 2 e il modello predice classe 1, pena è 1

  • se il punto ha classe 3 e modello predice classe 3, penalità è 0 (clas corretti sificazione)
  • se il punto ha classe 3 e modello prevede di classe 2, pena è 1
  • se il punto ha classe 3 e modello prevede di classe 1, penalità è 2

Quindi la matrice di pena sarebbe il seguente aspetto:

 Class 1 Class 2 Class 3 
Class 1 0  1  2 
Class 2 1  0  1 
Class 3 2  1  0 

Suppongo che il parametro 'class_weight' in sklearn fa qualcosa di simile, ma accetta un dizionario piuttosto che una matrice. Passare class_weight = {1: 2,1: 1,1: 2} aumenterebbe semplicemente il peso per classificare erroneamente la classe 1 e la classe 3, tuttavia, voglio che il mio modello ottenga una penalità maggiore specificatamente quando sceglie la classe 1 e la vera classe è classe 3 e viceversa.

È possibile fare qualcosa di simile in sklearn? Potrebbero esserci altre librerie/algoritmi di apprendimento che consentono un ineguale costo di errata classificazione?

risposta

0

Innanzitutto, in sklearn non è possibile addestrare un modello utilizzando la perdita personalizzata. Tuttavia, è possibile implement your own evaluation function e regolare iperparametri del modello per ottimizzare questa metrica.

In secondo luogo, è possibile ottimizzare qualsiasi perdita personalizzata con reti neurali, for example, using Keras. Ma a questo scopo, la tua funzione dovrebbe essere liscia. La prima cosa che viene in mente è l'entropia incrociata ponderata. In this discussion, le persone stanno giocando con le implementazioni di questa funzione.

In terzo luogo, la struttura del proprio problema suggerisce che l'ordine di etichette di classe è ciò che conta davvero. In tal caso, è possibile provare la regressione logistica ordinata (una example dell'implementazione).

Inoltre, nel tuo problema il costo è precisamente sum(abs(predicted-fact)).Quindi, se non hai bisogno di una previsione probabilistica, puoi semplicemente utilizzare un regressore che ottimizza MAE (ad esempio, SGDRegressor con perdita "epsilon_insensitive" o DecisionRegressor con criterio mae). Dopo aver risolto la regressione, devi solo trovare le soglie che ottimizzano la tua funzione di costo.