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:
log_loss
per la classificazione binaria.squared_loss
per la regressione lineare.
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 variabileold
èTrue
.row_selection = (age > 20) & (age < 65) & (log(income) > 10)
usa solo osservazioni in cui il valore della variabileage
è compreso tra 20 e 65 e il valore dilog
della variabileincome
è 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_function
e 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)
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