microsoftml.rx_fast_linear: Modelo lineal con ascenso estocástico de coordenadas duales

Usage

microsoftml.rx_fast_linear()

Description

Un entrenador de optimización para la clasificación binaria lineal y regresión de Asciendentes Estocásticos Duales (SDCA).

Detalles

rx_fast_linear es un entrenador basado en el método Stochastic Dual Coordinate Ascent (SDCA), una técnica de optimización de última generación para funciones objetivo convexas. El algoritmo puede escalarse para su uso en grandes conjuntos de datos fuera de memoria debido a una implementación semi-asincronizada que soporta multihilo. La convergencia se sostiene imponiendo periódicamente la sincronización entre actualizaciones primal y dual en un hilo separado. También se ofrecen varias opciones de funciones de pérdida. El método SDCA combina varias de las mejores propiedades y capacidades de la regresión logística y los algoritmos SVM. Para más información sobre SDCA, consulte las citas en la sección de referencias.

Los algoritmos tradicionales de optimización, como el descenso de gradiente estocástico (SGD), optimizan directamente la función de pérdida empírica. La SDCA elige un enfoque diferente que optimiza el problema dual. 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, el peso correspondiente del ejemplo se ajusta para que la función de pérdida dual se optimice respecto al ejemplo actual. SDCA no necesita tasa de aprendizaje para determinar el tamaño del paso, como sí requieren varios métodos de descenso en gradiente.

rx_fast_linear actualmente soporta clasificación binaria con tres tipos de funciones de pérdida: pérdida logarítmica, pérdida por bisagra y pérdida por bisagra suavizada. La regresión lineal también soporta la función de pérdida al cuadrado. La regularización elástica de la red puede especificarse mediante los l2_weight parámetros y l1_weight . Nótese que tiene l2_weight un efecto sobre la tasa de convergencia. En general, cuanto mayor sea , l2_weightmás rápido converge SDCA.

Nótese que rx_fast_linear es un algoritmo de optimización estocástica y de streaming. Los resultados dependen del orden de los datos de entrenamiento. Para obtener resultados reproducibles, se recomienda que se fije shuffle a False y train_threads a 1.

Argumentos

formula

La fórmula descrita en revoscalepy.rx_formula. Los términos de interacción y F() no se admiten actualmente en microsoftml.

datos

Objeto de origen de datos o cadena de caracteres que especifica un archivo .xdf o un objeto de trama de datos.

method

Especifica el tipo de modelo con una cadena de caracteres: "binary" para la clasificación binaria predeterminada o "regression" para regresión lineal.

loss_function

Especifica la función de pérdida empírica a optimizar. Para la clasificación binaria, están disponibles las siguientes opciones:

  • log_loss: La pérdida de tronco. Este es el valor predeterminado.

  • hinge_loss: La pérdida de bisagra SVM. Su parámetro representa el tamaño del margen.

  • smooth_hinge_loss: La pérdida suavizada de la bisagra. Su parámetro representa la constante de suavizado.

Para la regresión lineal, actualmente se soporta la pérdida squared_loss al cuadrado. Cuando este parámetro se establece en Ninguno, su valor por defecto depende del tipo de aprendizaje:

El siguiente ejemplo cambia la 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 o bien no negativo o Ninguno. Si se especifica Ninguno , el valor real se calcula automáticamente en función del conjunto de datos. Ninguno es el valor por defecto.

l2_weight

Especifica el peso de regularización L2. El valor debe ser o bien no negativo o Ninguno. Si se especifica Ninguno , el valor real se calcula automáticamente en función del conjunto de datos. Ninguno es el valor por defecto.

train_threads

Especifica cuántos hilos concurrentes pueden usarse para ejecutar el algoritmo. Cuando este parámetro se establece en Ninguno, el número de hilos utilizados se determina en función del número de procesadores lógicos disponibles para el proceso, así como de la escasez de datos. Configúralo para 1 ejecutar el algoritmo en un solo hilo.

convergence_tolerance

Especifica el umbral de tolerancia utilizado como criterio de convergencia. Debe estar entre 0 y 1. El valor por defecto es 0.1. Se considera que el algoritmo ha convergido si la brecha de dualidad relativa, que es la razón entre la brecha de dualidad y la pérdida primal, queda por debajo de la tolerancia de convergencia especificada.

max_iterations

Especifica un límite superior para el número de iteraciones de entrenamiento. Este parámetro debe ser positivo o Ninguno. Si se especifica Ninguno , 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 termina después de que el número total de iteraciones alcanza la cota superior especificada o cuando la función de pérdida converge, lo que ocurra antes.

barajar

Especifica si se deben barajar los datos de entrenamiento. Configura True para barajar los datos; False no para barajar. El valor por defecto es True. SDCA es un algoritmo de optimización estocástica. Si se activa el barajado, los datos de entrenamiento se barajan en cada iteración.

check_frequency

El número de iteraciones tras las cuales se calcula y comprueba la función de pérdida para determinar si ha convergido. El valor especificado debe ser un entero positivo o Ninguno. Si no es ninguno, el valor real se calcula automáticamente en función del conjunto de datos. De lo contrario, por ejemplo, si checkFrequency = 5 se especifica, entonces se calcula la función de pérdida y se comprueba la convergencia cada 5 iteraciones. El cálculo de la función de pérdida requiere un paso completo y separado sobre los datos de entrenamiento.

normalizar

Especifica el tipo de normalización automática usada:

  • "Auto": si se necesita normalización, se realiza automáticamente. Esta es la opción predeterminada.

  • "No": no se realiza ninguna normalización.

  • "Yes": se realiza la normalización.

  • "Warn": si se necesita normalización, se muestra un mensaje de advertencia, pero no se realiza la normalización.

La normalización vuelve a escalar intervalos de datos dispares a una escala estándar. El escalado de características garantiza que las distancias entre los puntos de datos son proporcionales y permite que varios métodos de optimización, como el descenso de degradado converjan mucho más rápido. Si se realiza la normalización, se usa un MaxMin normalizador. Normaliza los valores de un intervalo [a, b] donde -1 <= a <= 0 y 0 <= b <= 1 .b - a = 1 Este normalizador conserva la dispersidad asignando cero a cero.

ml_transforms

Especifica una lista de transformaciones de MicrosoftML que se van a realizar en los datos antes del entrenamiento o None si no se va a realizar ninguna transformación. Consulte featurize_text, categoricaly categorical_hash, para ver las transformaciones admitidas. Estas transformaciones se realizan después de las transformaciones de Python especificadas. El valor predeterminado es None.

ml_transform_vars

Especifica un vector de caracteres de nombres de variable que se van a usar en ml_transforms o Ninguno si no se va a usar ninguno. El valor predeterminado es None.

row_selection

NO SE ADMITE. Especifica las filas (observaciones) del conjunto de datos que va a usar el modelo con el nombre de una variable lógica del conjunto de datos (entre comillas) o con una expresión lógica mediante variables del conjunto de datos. Por ejemplo:

  • row_selection = "old" solo usará observaciones en las que el valor de la variable old es True.

  • row_selection = (age > 20) & (age < 65) & (log(income) > 10) solo usa observaciones en las que el valor de la age variable está comprendido entre 20 y 65 y el valor de log la income variable es mayor que 10.

La selección de filas 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 expression función .

Transforma

NO SE ADMITE. 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 expression función .

transform_objects

NO SE ADMITE. Lista con nombre que contiene objetos a los que puede hacer referencia transforms, transform_functiony 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 SE ADMITE. Vector de caracteres que especifica paquetes adicionales de Python (fuera de los especificados en RxOptions.get_option("transform_packages")) que se van a poner a disposición y cargar previamente para su uso en las funciones de transformación de variables. Por ejemplo, los definidos explícitamente en funciones de revoscalepy a través de sus transforms argumentos y transform_function o los definidos implícitamente a través de sus formula argumentos o row_selection . El transform_packages argumento también puede ser None, lo que indica que no hay paquetes externos RxOptions.get_option("transform_packages") cargados previamente.

transform_environment

NO SE ADMITE. Un entorno definido por el usuario que sirve como elemento primario para todos los entornos desarrollados internamente y se usa para la transformación de datos variables. Si transform_environment = Nonees , se usa en su lugar un nuevo entorno "hash" con revoscalepy.baseenv primario.

blocks_per_read

Especifica el número de bloques que se van a leer para cada fragmento de datos leídos desde el origen de datos.

report_progress

Valor entero que especifica el nivel de informes sobre el progreso del procesamiento de filas:

  • 0: no se notifica ningún progreso.

  • 1: el número de filas procesadas se imprime y actualiza.

  • 2: se notifican filas procesadas y tiempos.

  • 3: se notifican filas procesadas y todos los intervalos.

excesivamente detallado

Valor entero que especifica la cantidad de salida deseada. Si 0es , no se imprime ninguna salida detallada durante los cálculos. Valores enteros de 1 para 4 proporcionar cantidades crecientes de información.

compute_context

Establece el contexto en el que se ejecutan los cálculos, especificados con una revoscalepy válida. RxComputeContext. Actualmente local y revoscalepy. Se admiten contextos de proceso RxInSqlServer.

conjunto

Parámetros de control para el montaje.

Returns

Objeto FastLinear con el modelo entrenado.

Nota:

Este algoritmo es multihilo y no intentará cargar todo el conjunto de datos en memoria.

References

Escalando el ascenso estocástico de coordenadas duales

Métodos estocásticos de ascenso de coordenadas duales para la minimización regularizada de pérdidas

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

Funciones de pérdida