microsoftml.rx_fast_linear: modelo lineal con ascenso estocástico dual de coordenadas
Uso
microsoftml.rx_fast_linear()
Descripción
Instructor de optimización del ascenso estocástico dual de coordenadas (SDCA) para la regresión y clasificación binaria lineal.
Detalles
rx_fast_linear
es un instructor basado en el método de ascenso estocástico dual de coordenadas (SDCA), una técnica de optimización de última generación para las funciones objetivas convexas. El algoritmo se puede escalar para su uso en grandes conjuntos de datos sin memoria debido a una implementación semiasincronizada que admite varios subprocesos.
La convergencia se suscribe mediante la aplicación periódica de la sincronización entre las actualizaciones primarias y duales en un subproceso independiente. También se proporcionan varias opciones de funciones de pérdida. El método SDCA combina varias de las mejores propiedades y funcionalidades de la regresión logística y los algoritmos SVM.
Para obtener más información sobre el método SDCA, vea las citas de la sección de referencias.
Los algoritmos de optimización tradicionales, como el descenso por gradiente estocástico (SGD), optimizan directamente la función de pérdida empírica. El SDCA elige un enfoque diferente que optimiza el problema dual en su lugar. La función de pérdida dual se parametriza mediante pesos por ejemplo. En cada iteración, cuando se lee un ejemplo de entrenamiento del conjunto de datos de entrenamiento, se ajusta el peso del ejemplo correspondiente para que la función de pérdida dual se optimice con respecto al ejemplo actual. El SDCA no necesita ninguna velocidad de aprendizaje para determinar el tamaño del paso tal y como lo requieren varios métodos de descenso por gradiente.
rx_fast_linear
actualmente admite la clasificación binaria con tres tipos de funciones de pérdida: pérdida de registros, pérdida de bisagra y pérdida de bisagra suavizada.
La regresión lineal también admite la función de pérdida cuadrada. La regularización de red elástica se puede especificar mediante los parámetros l2_weight
y l1_weight
. Tenga en cuenta que l2_weight
tiene un efecto en la velocidad de convergencia. En general, cuanto mayor sea l2_weight
, más rápido convergerá SDCA.
Tenga en cuenta que rx_fast_linear
es un algoritmo estocástico y de optimización de transmisión. Los resultados dependen del orden de los datos de entrenamiento. Para obtener resultados reproducibles, se recomienda establecer shuffle
en False
y train_threads
en 1
.
Argumentos
formula
Fórmula que se describe en revoscalepy.rx_formula.
Los términos de interacción y F()
actualmente no se admiten en microsoftml.
datos
Objeto de origen de datos o cadena de caracteres que especifica un archivo .xdf o un objeto de trama de datos.
método
Especifica el tipo de modelo con una cadena de caracteres: "binary"
para la clasificación binaria predeterminada o "regression"
para la regresión lineal.
loss_function
Especifica la función de pérdida empírica que se optimizará. Para la clasificación binaria, están disponibles las siguientes opciones:
log_loss
: pérdida de registro. Este es el valor predeterminado.hinge_loss
: pérdida de bisagra de SVM. Su parámetro representa el tamaño del margen.smooth_hinge_loss
: pérdida de bisagra suavizada. Su parámetro representa la constante de suavizado.
En el caso de la regresión lineal, actualmente se admite squared_loss
de pérdida cuadrada. Cuando este parámetro se establece en None, su valor predeterminado depende del tipo de aprendizaje:
log_loss
para la clasificación binaria.squared_loss
para la regresión lineal.
En el ejemplo siguiente se cambia loss_function a hinge_loss
: rx_fast_linear(..., loss_function=hinge_loss())
.
l1_weight
Especifica el peso de regularización L1. El valor debe ser no negativo o None. Si se especifica None, el valor real se calcula automáticamente en función del conjunto de datos. None es el valor predeterminado.
l2_weight
Especifica el peso de regularización L2. El valor debe ser no negativo o None. Si se especifica None, el valor real se calcula automáticamente en función del conjunto de datos. None es el valor predeterminado.
train_threads
Especifica cuántos subprocesos simultáneos se pueden usar para ejecutar el algoritmo. Cuando este parámetro se establece en None, el número de subprocesos usados se determina en función del número de procesadores lógicos disponibles para el proceso, así como de la dispersión de los datos. Establézcalo en 1
para ejecutar el algoritmo en un único subproceso.
convergence_tolerance
Especifica el umbral de tolerancia utilizado como criterio de convergencia. Debe estar entre 0 y 1. El valor predeterminado es 0.1
. Se considera que el algoritmo ha convergido si la diferencia de dualidad relativa, que es la relación entre la diferencia de dualidad y la pérdida primaria, está por debajo de la tolerancia de convergencia especificada.
max_iterations
Especifica un límite superior en el número de iteraciones de entrenamiento. Este parámetro debe ser positivo o None. Si se especifica None, el valor real se calcula automáticamente en función del conjunto de datos. Cada iteración requiere un paso completo sobre los datos de entrenamiento. El entrenamiento finaliza una vez que el número total de iteraciones alcanza el límite superior especificado o cuando converge la función de pérdida, lo que ocurra primero.
shuffle
Especifica si se ordenan aleatoriamente los datos de entrenamiento. Establezca este valor en True
para ordenar aleatoriamente los datos y en False
para no ordenarlos aleatoriamente. El valor predeterminado es True
. El SDCA es un algoritmo de optimización estocástico. Si se activa el orden aleatorio, los datos de entrenamiento se ordenan aleatoriamente en cada iteración.
check_frequency
Número de iteraciones después de las cuales la función de pérdida se calcula y se comprueba para determinar si ha convergido. El valor especificado debe ser un entero positivo o None. Si es None, el valor real se calcula automáticamente en función del conjunto de datos. De lo contrario, por ejemplo, si se especifica checkFrequency = 5
, el cálculo de la función de pérdida y la comprobación de la convergencia se realizan cada 5 iteraciones. El cálculo de la función de pérdida requiere un paso completo independiente sobre los datos de entrenamiento.
normalize
Especifica el tipo de normalización automática que se usa:
"Auto"
: si la normalización es necesaria, se realiza automáticamente. Esta es la opción predeterminada."No"
: no se realiza ninguna normalización."Yes"
: se lleva a cabo la normalización."Warn"
: si la normalización es necesaria, se muestra un mensaje de advertencia, pero no se lleva a cabo la normalización.
La normalización aplica una escala estándar a intervalos de datos dispares. El escalado de características asegura que las distancias entre los puntos de datos sean proporcionales y permite que varios métodos de optimización, como el descenso del gradiente, converjan mucho más rápido. Si se lleva a cabo la normalización, se usa un normalizador MaxMin
. Normaliza los valores de un intervalo [a, b], donde -1 <= a <= 0
, 0 <= b <= 1
y b - a = 1
. Este normalizador mantiene la dispersión asignando cero a cero.
ml_transforms
Especifica una lista de transformaciones de MicrosoftML que deben realizarse en los datos antes del entrenamiento, o bien None si no hay que realizar ninguna transformación. Vea featurize_text
, categorical
y categorical_hash
para saber las transformaciones que se admiten.
Estas transformaciones se realizan después de cualquier transformación de Python especificada.
El valor predeterminado es None.
ml_transform_vars
Especifica un vector de caracteres de nombres de variable que deben usarse en ml_transforms
, o bien None si no hay que usar ninguno.
El valor predeterminado es None.
row_selection
NO ADMITIDO. Especifica las filas (observaciones) del conjunto de datos que debe usar el modelo con el nombre de una variable lógica del conjunto de datos (entre comillas) o con una expresión lógica que usa variables en el conjunto de datos. Por ejemplo:
row_selection = "old"
solo usará observaciones en las que el valor de la variableold
seaTrue
.row_selection = (age > 20) & (age < 65) & (log(income) > 10)
solo usa observaciones en las que el valor de la variableage
está entre 20 y 65, y el valor delog
de la variableincome
es mayor que 10.
La selección de fila se realiza después de procesar las transformaciones de datos (vea los argumentos transforms
o transform_function
). Al igual que con todas las expresiones, row_selection
se puede definir fuera de la llamada de función mediante la función expression
.
transformaciones
NO ADMITIDO. Expresión del formulario que representa la primera ronda de transformaciones de variables. Al igual que con todas las expresiones, transforms
(o row_selection
) se puede definir fuera de la llamada de función mediante la función expression
.
transform_objects
NO ADMITIDO. Lista con nombre que contiene objetos a los que pueden hacer referencia transforms
, transform_function
y row_selection
.
transform_function
Función de transformación de variables.
transform_variables
Vector de caracteres de variables del conjunto de datos de entrada necesarias para la función de transformación.
transform_packages
NO ADMITIDO. Vector de caracteres que especifica paquetes de Python adicionales (aparte de los especificados en RxOptions.get_option("transform_packages")
) que deben cargarse previamente y estar disponibles para usarlos en las funciones de transformación de variables.
Por ejemplo, los definidos explícitamente en las funciones de revoscalepy mediante los argumentos transforms
y transform_function
, o los definidos implícitamente con los argumentos formula
y row_selection
. El argumento transform_packages
también puede ser None, que indica que no se cargan previamente más paquetes aparte de los de RxOptions.get_option("transform_packages")
.
transform_environment
NO ADMITIDO. Entorno definido por el usuario que sirve como primario de todos los entornos desarrollados internamente y que se usa para la transformación de datos variables.
Si es transform_environment = None
, se usa un nuevo entorno "hash" con revoscalepy.baseenv como primario.
blocks_per_read
Especifica el número de bloques que se leerán para cada fragmento de datos leídos del origen de datos.
report_progress
Valor entero que especifica el nivel de notificación del progreso del procesamiento de filas:
0
: no se notifica el progreso.1
: se imprime y actualiza el número de filas procesadas.2
: se notifican las filas procesadas y los intervalos.3
: se notifican las filas procesadas y todos los intervalos.
verbose
Valor entero que especifica la cantidad de salida deseada.
Si es 0
, no se imprime ninguna salida detallada durante los cálculos. Los valores enteros de 1
a 4
proporcionan cantidades crecientes de información.
compute_context
Establece el contexto en el que se ejecutan los cálculos, especificado con revoscalepy.RxComputeContext. Actualmente, se admiten los contextos de proceso local y revoscalepy.RxInSqlServer.
ensemble
Parámetros de control para la formación de conjuntos.
Devoluciones
Objeto FastLinear
con el modelo entrenado.
Nota
Este algoritmo es de varios subprocesos y no intentará cargar todo el conjunto de datos en la memoria.
Vea también
hinge_loss
, log_loss
, smoothed_hinge_loss
, squared_loss
, rx_predict
Referencias
Escalado del ascenso estocástico dual de coordenadas
Métodos de ascenso estocástico dual de coordenadas para la minimización de pérdidas regularizadas
Ejemplo de clasificación 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))
Salida:
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
Ejemplo de regresión
'''
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))
Salida:
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