Share via


microsoftml.rx_fast_linear: modello lineare con SDCA (Stochastic Dual Coordinate Ascent)

Utilizzo

microsoftml.rx_fast_linear()

Descrizione

Programma di training per l'ottimizzazione SDCA (Stochastic Dual Coordinate Ascent) per la regressione e la classificazione binaria lineari.

Dettagli

rx_fast_linear è un programma di training basato sul metodo SDCA (Stochastic Dual Coordinate Ascent), una tecnica di ottimizzazione all'avanguardia per le funzioni obiettivo convesse. L'algoritmo può essere ridimensionato per l'uso in set di dati di grandi dimensioni con memoria insufficiente a causa di un'implementazione semi asincronizzata che supporta il multithreading. La convergenza viene assicurata applicando periodicamente la sincronizzazione tra gli aggiornamenti primali e duali in un thread separato. Sono inoltre disponibili diverse opzioni di funzioni di perdita. Il metodo SDCA combina diverse delle migliori proprietà e funzionalità degli algoritmi di regressione logistica e SVM. Per altre informazioni su SDCA, vedere le citazioni nella sezione dei riferimenti.

Gli algoritmi di ottimizzazione tradizionali, ad esempio la discesa stocastica del gradiente (SGD, Stochastic Gradient Descent), ottimizzano direttamente la funzione di perdita empirica. SDCA sceglie invece un approccio diverso che ottimizza il problema duale. La funzione di perdita duale è parametrizzata da pesi per campione. In ogni iterazione, quando viene letto un esempio di training del set di dati di training, il peso di esempio corrispondente viene regolato in modo che la funzione di perdita duale sia ottimizzata rispetto all'esempio corrente. SDCA non necessita di alcuna velocità di apprendimento per determinare le dimensioni dei passaggi richiesti da vari metodi di discesa del gradiente.

rx_fast_linear supporta attualmente la classificazione binaria con tre tipi di funzioni di perdita: perdita logaritmica, perdita di cerniera e perdita di cerniera graduata. La regressione lineare supporta anche con la funzione di perdita al quadrato. La regolarizzazione della rete elastica può essere specificata dai parametri l2_weight e l1_weight. Si noti che l2_weight ha un effetto sul tasso di convergenza. In generale, più grande è l2_weight, più veloce sarà la convergenza di SDCA.

Si noti che rx_fast_linear è un algoritmo di ottimizzazione stocastico e di streaming. I risultati dipendono dall'ordine dei dati di training. Per i risultati riproducibili, è consigliabile impostare shuffle su False e train_threads su 1.

Argomenti

formula

Formula descritta in revoscalepy.rx_formula. I termini di interazione e F() non sono attualmente supportati in microsoftml.

data

Oggetto origine dati o stringa di caratteri che specifica un file con estensione xdf o un oggetto frame di dati.

method

Specifica il tipo di modello con una stringa di caratteri "binary" per la classificazione binaria predefinita o "regression" per la regressione lineare.

loss_function

Specifica la funzione di perdita empirica da ottimizzare. Per la classificazione binaria, sono disponibili le opzioni seguenti:

  • log_loss: perdita logaritmica. Questo è il valore predefinito.

  • hinge_loss: perdita di cerniera SVM. Il rispettivo parametro rappresenta le dimensioni del margine.

  • smooth_hinge_loss: perdita di cerniera graduata. Il relativo parametro rappresenta la costante di graduazione.

Per la regressione è attualmente supportata la perdita al quadrato squared_loss. Quando questo parametro è impostato su None, il rispettivo valore predefinito dipende dal tipo di apprendimento:

L'esempio seguente cambia loss_function in hinge_loss: rx_fast_linear(..., loss_function=hinge_loss()).

l1_weight

Specifica il peso di regolarizzazione L1. Il valore deve essere non negativo o None. Se viene specificato None, il valore effettivo verrà calcolato automaticamente in base al set di dati. None è il valore predefinito.

l2_weight

Specifica il peso di regolarizzazione L2. Il valore deve essere non negativo o None. Se viene specificato None, il valore effettivo verrà calcolato automaticamente in base al set di dati. None è il valore predefinito.

train_threads

Specifica il numero di thread simultanei che è possibile usare per eseguire l'algoritmo. Quando questo parametro è impostato su None, il numero di thread usati viene determinato in base al numero di processori logici disponibili per il processo, nonché alla sparsità dei dati. Impostarlo su 1 per eseguire l'algoritmo in un singolo thread.

convergence_tolerance

Specifica la soglia di tolleranza usata come criterio di convergenza. Deve essere un valore compreso tra 0 e 1. Il valore predefinito è 0.1. L'algoritmo viene considerato convergente se il divario di dualità relativo, ovvero il rapporto tra il divario di dualità e la perdita primale, scende al di sotto della tolleranza di convergenza specificata.

max_iterations

Specifica un limite superiore per il numero di iterazioni di training. Questo parametro deve essere positivo o None. Se viene specificato None, il valore effettivo verrà calcolato automaticamente in base al set di dati. Ogni iterazione richiede un passaggio completo sui dati di training. Il training termina dopo che il numero totale di iterazioni raggiunge il limite superiore specificato o quando la funzione di perdita converge, a seconda di quale evento si verifichi per primo.

shuffle

Specifica se mischiare i dati di training. Impostare True per mischiare i dati, False per non mischiarli. Il valore predefinito è True. SDCA è un algoritmo di ottimizzazione stocastica. Se l'opzione per mischiare i dati è attivata, i dati di training vengono mischiati per ogni iterazione.

check_frequency

Numero di iterazioni dopo le quali viene calcolata e verificata la funzione di perdita per determinare se è convergente. Il valore specificato deve essere un numero intero positivo o None. Se è None, il valore effettivo verrà calcolato automaticamente in base al set di dati. In caso contrario, se viene specificato checkFrequency = 5, la funzione di perdita verrà calcolata e la convergenza verrà controllata ogni 5 iterazioni. Il calcolo della funzione di perdita richiede un passaggio completo separato sui dati di training.

normalize

Specifica il tipo di normalizzazione automatica usata:

  • "Auto": se la normalizzazione è necessaria, viene eseguita automaticamente. Questa è l'opzione predefinita.

  • "No": non viene eseguita alcuna normalizzazione.

  • "Yes": la normalizzazione viene eseguita.

  • "Warn": se la normalizzazione è necessaria, viene visualizzato un avviso ma la normalizzazione non viene eseguita.

La normalizzazione ridimensiona diversi intervalli di dati in base a una scala standard. Il ridimensionamento delle funzioni assicura che le distanze tra i punti dati siano proporzionali e consente di accelerare significativamente la convergenza di diversi metodi di ottimizzazione, tra cui la discesa di gradiente. Se la normalizzazione viene eseguita, viene usato un normalizzatore MaxMin. I valori vengono normalizzati in un intervallo [a, b], dove -1 <= a <= 0 e 0 <= b <= 1 e b - a = 1. Questo normalizzatore mantiene la sparsità eseguendo il mapping di zero a zero.

ml_transforms

Specifica un elenco di trasformazioni di MicrosoftML da eseguire sui dati prima del training o None se non devono essere eseguite trasformazioni. Per informazioni sulle trasformazioni supportate, vedere featurize_text, categorical e categorical_hash. Queste trasformazioni vengono eseguite dopo eventuali trasformazioni Python specificate. Il valore predefinito è None.

ml_transform_vars

Specifica un vettore di caratteri di nomi di variabili da usare in ml_transforms o None se non è necessario usarne alcuno. Il valore predefinito è None.

row_selection

NON SUPPORTATO. Specifica le righe (osservazioni) dal set di dati che devono essere usate dal modello con il nome di una variabile logica dal set di dati (tra virgolette) o con un'espressione logica tramite variabili nel set di dati. Ad esempio:

  • row_selection = "old" userà solo osservazioni in cui il valore della variabile old è True.

  • row_selection = (age > 20) & (age < 65) & (log(income) > 10) usa solo osservazioni in cui il valore della variabile age è compreso tra 20 e 65 e il valore di log della variabile income è maggiore di 10.

La selezione delle righe viene eseguita dopo l'elaborazione di eventuali trasformazioni dei dati. Vedere gli argomenti transforms o transform_function. Analogamente a tutte le espressioni, è possibile definire row_selection all'esterno della chiamata alla funzione usando la funzione expression.

trasformazioni

NON SUPPORTATO. Espressione con un formato che rappresenta il primo ciclo di trasformazioni delle variabili. Analogamente a tutte le espressioni, è possibile definire transforms o row_selection all'esterno della chiamata alla funzione usando la funzione expression.

transform_objects

NON SUPPORTATO. Elenco denominato che contiene oggetti a cui transforms, transform_functione row_selection possono fare riferimento.

transform_function

Funzione di trasformazione della variabile.

transform_variables

Vettore di caratteri delle variabili del set di dati di input necessario per la funzione di trasformazione.

transform_packages

NON SUPPORTATO. Vettore di caratteri che specifica altri pacchetti Python, oltre a quelli specificati in RxOptions.get_option("transform_packages"), da rendere disponibili e precaricati per l'uso nelle funzioni di trasformazione delle variabili. Ad esempio, quelli definiti in modo esplicito nelle funzioni revoscalepy tramite i relativi argomenti transforms e transform_function o quelli definiti in modo implicito tramite i relativi argomenti formula o row_selection. L'argomento transform_packages può anche essere NoneRxOptions.get_option("transform_packages"), che indica che non vengono precaricati pacchetti esterni a .

transform_environment

NON SUPPORTATO. Ambiente definito dall'utente da usare come elemento padre di tutti gli ambienti sviluppati internamente e usati per la trasformazione dei dati delle variabili. Se transform_environment = None, viene invece usato un nuovo ambiente "hash" con revoscalepy.baseenv padre.

blocks_per_read

Specifica il numero di blocchi da leggere per ogni blocco di dati letto dall'origine dati.

report_progress

Valore intero che specifica il livello di creazione di report sullo stato di elaborazione delle righe:

  • 0: non viene segnalato alcun avanzamento.

  • 1: il numero di righe elaborate viene stampato e aggiornato.

  • 2: vengono segnalate le righe elaborate e le tempistiche.

  • 3: vengono segnalate le righe elaborate e tutte le tempistiche.

verbose

Valore intero che specifica la quantità di output desiderata. Se 0, non viene stampato alcun output dettagliato durante i calcoli. Valori interi da 1 a 4 per fornire quantità crescenti di informazioni.

compute_context

Imposta il contesto in cui vengono eseguiti i calcoli, specificato con un revoscalepy.RxComputeContext valido. Sono attualmente supportati contesti di calcolo locali e revoscalepy.RxInSqlServer.

ensemble

Parametri di controllo per l'ensembling.

Restituisce

Oggetto FastLinear con il modello sottoposto a training.

Nota

Questo algoritmo è multithreading e non proverà a caricare l'intero set di dati in memoria.

Vedi anche

hinge_loss, log_loss, smoothed_hinge_loss, squared_loss, rx_predict

Riferimenti

Ridimensionamento di SDCA (Stochastic Dual Coordinate Ascent)

Metodi SDCA (Stochastic Dual Coordinate Ascent) per la riduzione al minimo delle perdite regolarizzate

Esempio di classificazione binaria

'''
Binary Classification.
'''
import numpy
import pandas
from microsoftml import rx_fast_linear, rx_predict
from revoscalepy.etl.RxDataStep import rx_data_step
from microsoftml.datasets.datasets import get_dataset

infert = get_dataset("infert")

import sklearn
if sklearn.__version__ < "0.18":
    from sklearn.cross_validation import train_test_split
else:
    from sklearn.model_selection import train_test_split

infertdf = infert.as_df()
infertdf["isCase"] = infertdf.case == 1
data_train, data_test, y_train, y_test = train_test_split(infertdf, infertdf.isCase)

forest_model = rx_fast_linear(
    formula=" isCase ~ age + parity + education + spontaneous + induced ",
    data=data_train)
    
# RuntimeError: The type (RxTextData) for file is not supported.
score_ds = rx_predict(forest_model, data=data_test,
                     extra_vars_to_write=["isCase", "Score"])
                     
# Print the first five rows
print(rx_data_step(score_ds, number_rows_read=5))

Output:

Automatically adding a MinMax normalization transform, use 'norm=Warn' or 'norm=No' to turn this behavior off.
Beginning processing data.
Rows Read: 186, Read Time: 0, Transform Time: 0
Beginning processing data.
Beginning processing data.
Rows Read: 186, Read Time: 0, Transform Time: 0
Beginning processing data.
Beginning processing data.
Rows Read: 186, Read Time: 0, Transform Time: 0
Beginning processing data.
Using 2 threads to train.
Automatically choosing a check frequency of 2.
Auto-tuning parameters: maxIterations = 8064.
Auto-tuning parameters: L2 = 2.666837E-05.
Auto-tuning parameters: L1Threshold (L1/L2) = 0.
Using best model from iteration 568.
Not training a calibrator because it is not needed.
Elapsed time: 00:00:00.5810985
Elapsed time: 00:00:00.0084876
Beginning processing data.
Rows Read: 62, Read Time: 0, Transform Time: 0
Beginning processing data.
Elapsed time: 00:00:00.0292334
Finished writing 62 rows.
Writing completed.
Rows Read: 5, Total Rows Processed: 5, Total Chunk Time: Less than .001 seconds 
  isCase PredictedLabel     Score  Probability
0   True           True  0.990544     0.729195
1  False          False -2.307120     0.090535
2  False          False -0.608565     0.352387
3   True           True  1.028217     0.736570
4   True          False -3.913066     0.019588

Esempio di regressione

'''
Regression.
'''
import numpy
import pandas
from microsoftml import rx_fast_linear, rx_predict
from revoscalepy.etl.RxDataStep import rx_data_step
from microsoftml.datasets.datasets import get_dataset

attitude = get_dataset("attitude")

import sklearn
if sklearn.__version__ < "0.18":
    from sklearn.cross_validation import train_test_split
else:
    from sklearn.model_selection import train_test_split

attitudedf = attitude.as_df()
data_train, data_test = train_test_split(attitudedf)

model = rx_fast_linear(
    formula="rating ~ complaints + privileges + learning + raises + critical + advance",
    method="regression",
    data=data_train)
    
# RuntimeError: The type (RxTextData) for file is not supported.
score_ds = rx_predict(model, data=data_test,
                     extra_vars_to_write=["rating"])
                     
# Print the first five rows
print(rx_data_step(score_ds, number_rows_read=5))

Output:

Automatically adding a MinMax normalization transform, use 'norm=Warn' or 'norm=No' to turn this behavior off.
Beginning processing data.
Rows Read: 22, Read Time: 0.001, Transform Time: 0
Beginning processing data.
Beginning processing data.
Rows Read: 22, Read Time: 0.001, Transform Time: 0
Beginning processing data.
Beginning processing data.
Rows Read: 22, Read Time: 0, Transform Time: 0
Beginning processing data.
Using 2 threads to train.
Automatically choosing a check frequency of 2.
Auto-tuning parameters: maxIterations = 68180.
Auto-tuning parameters: L2 = 0.01.
Auto-tuning parameters: L1Threshold (L1/L2) = 0.
Using best model from iteration 54.
Not training a calibrator because it is not needed.
Elapsed time: 00:00:00.1114324
Elapsed time: 00:00:00.0090901
Beginning processing data.
Rows Read: 8, Read Time: 0, Transform Time: 0
Beginning processing data.
Elapsed time: 00:00:00.0330772
Finished writing 8 rows.
Writing completed.
Rows Read: 5, Total Rows Processed: 5, Total Chunk Time: Less than .001 seconds 
   rating      Score
0    71.0  72.630440
1    67.0  56.995350
2    67.0  52.958641
3    72.0  80.894539
4    50.0  38.375427

funzioni di perdita