microsoftml.rx_logistic_regression: regresión logística

Uso

microsoftml.rx_logistic_regression(formula: str,
    data: [revoscalepy.datasource.RxDataSource.RxDataSource,
    pandas.core.frame.DataFrame], method: ['binary',
    'multiClass'] = 'binary', l2_weight: float = 1,
    l1_weight: float = 1, opt_tol: float = 1e-07,
    memory_size: int = 20, init_wts_diameter: float = 0,
    max_iterations: int = 2147483647,
    show_training_stats: bool = False, sgd_init_tol: float = 0,
    train_threads: int = None, dense_optimizer: bool = False,
    normalize: ['No', 'Warn', 'Auto', 'Yes'] = 'Auto',
    ml_transforms: list = None, ml_transform_vars: list = None,
    row_selection: str = None, transforms: dict = None,
    transform_objects: dict = None, transform_function: str = None,
    transform_variables: list = None,
    transform_packages: list = None,
    transform_environment: dict = None, blocks_per_read: int = None,
    report_progress: int = None, verbose: int = 1,
    ensemble: microsoftml.modules.ensemble.EnsembleControl = None,
    compute_context: revoscalepy.computecontext.RxComputeContext.RxComputeContext = None)

Descripción

Regresión logística en el aprendizaje automático

Detalles

La regresión logística es un método de clasificación que se usa para predecir el valor de una variable dependiente categórica a partir de su relación con una o más variables independientes que se supone que tienen una distribución logística. Si la variable dependiente solo tiene dos valores posibles (correcto/incorrecto), la regresión logística es binaria. Si la variable dependiente tiene más de dos valores posibles (grupo sanguíneo según los resultados de una prueba diagnóstica), la regresión logística es multinomial.

La técnica de optimización que se usa para rx_logistic_regression es la memoria limitada Broyden-Fletcher-Goldfarb-Shanno (L-BFGS). Los algoritmos L-BFGS y BFGS normal usan métodos casi newtonianos para calcular la matriz hessiana de uso intensivo de recursos de proceso en la ecuación usada por el método de Newton para calcular los pasos. Pero la aproximación L-BFGS utiliza solo una cantidad limitada de memoria para calcular la dirección del siguiente paso, por lo que está especialmente indicada para problemas con un gran número de variables. El parámetro memory_size especifica el número de posiciones anteriores y gradientes que deben almacenarse para el cálculo del siguiente paso.

Este aprendiz puede usar la regularización de red elástica, que es una combinación lineal de las regularizaciones L1 (lazo) y L2 (cresta). La regularización es un método que puede hacer que un problema mal planteado sea más manejable imponiendo restricciones que proporcionan información para complementar los datos y que evita el sobreajuste mediante la penalización de modelos con valores de coeficiente extremos. Esto puede mejorar la generalización del modelo aprendido seleccionando la complejidad óptima en el equilibrio entre sesgo y varianza. La regularización funciona agregando la penalización asociada a los valores de coeficiente al error de la hipótesis. Un modelo preciso con valores de coeficiente extremos se penalizaría más, y un modelo menos preciso con valores más conservadores se penalizaría menos. Las regularizaciones L1 y L2 tienen efectos y usos diferentes que son complementarios en ciertos aspectos.

  • l1_weight: se puede aplicar a modelos dispersos, cuando se trabaja con datos de alta dimensionalidad. Extrae a 0 las características asociadas a pesos pequeños que son relativamente insignificantes.

  • l2_weight: es preferible para los datos que no están dispersos. Extrae los pesos grandes a cero.

Agregar la penalización de cresta a la regularización soluciona algunas de las limitaciones de la opción de lazo. Puede mejorar su precisión predictiva, por ejemplo, cuando el número de predictores es mayor que el tamaño de la muestra. Si x = l1_weight y y = l2_weight, entonces ax + by = c define el intervalo lineal de los términos de la regularización. El valor predeterminado de x e y es 1 en ambos casos. Una regularización agresiva puede dañar la capacidad predictiva al excluir variables importantes del modelo. Por tanto, elegir los valores óptimos para los parámetros de la regularización es importante de cara al rendimiento del modelo de regresión logística.

Argumentos

formula

La fórmula como se describe 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.

método

Cadena de caracteres que especifica el tipo de regresión logística: "binary" para la regresión logística de clasificación binaria predeterminada, o "multiClass" para la regresión logística multinomial.

l2_weight

Peso de la regularización L2. Su valor debe ser mayor o igual que 0 y el valor predeterminado se establece en 1.

l1_weight

Peso de la regularización L1. Su valor debe ser mayor o igual que 0 y el valor predeterminado se establece en 1.

opt_tol

Umbral de convergencia del optimizador. Si la mejora entre las iteraciones es menor que el umbral, el algoritmo se detiene y devuelve el modelo actual. Los valores más pequeños son más lentos, pero más precisos. El valor predeterminado es 1e-07.

memory_size

El tamaño de la memoria para L-BFGS indica el número de posiciones anteriores y gradientes que deben almacenarse para el cálculo del siguiente paso. Este parámetro de optimización limita la cantidad de memoria que se usa para calcular la magnitud y la dirección del siguiente paso. Cuando especifica menos memoria, el entrenamiento es más rápido, pero menos preciso. Debe ser mayor o igual que 1 y el valor predeterminado se establece en 20.

max_iterations

Establece el número máximo de iteraciones. Después de este número de pasos, el algoritmo se detiene incluso si no ha cumplido los criterios de convergencia.

show_training_stats

Especifique True para mostrar las estadísticas de los datos de entrenamiento y el modelo entrenado; de lo contrario, especifique False. El valor predeterminado es False. Para obtener más información sobre las estadísticas de los modelos, vea summary.ml_model().

sgd_init_tol

Especifique un número mayor que 0 para usar el descenso del gradiente estocástico (SGD) con el fin de buscar los parámetros iniciales. Un conjunto de valores distinto de cero especifica la tolerancia que SGD usa para determinar la convergencia. El valor predeterminado es 0, que indica que no se use SGD.

init_wts_diameter

Establece el diámetro de pesos inicial que especifica el intervalo desde el que se dibujan los valores para los pesos iniciales. Estos pesos se inicializan aleatoriamente desde este intervalo. Por ejemplo, si se especifica que el diámetro es d, los pesos se distribuyen uniformemente entre -d/2 y d/2. El valor predeterminado es 0, que especifica que todos los pesos se inicializan en 0.

train_threads

Número de subprocesos que se usan en el entrenamiento del modelo. Debe establecerse en el número de núcleos de la máquina. Tenga en cuenta que la funcionalidad multithreading de L-BFGS intenta cargar el conjunto de datos en la memoria. En el caso de que no haya memoria suficiente, establezca train_threads en 1 para desactivar la funcionalidad multithreading. Si se especifica None, el número de subprocesos que se usa se determina internamente. El valor predeterminado es None.

dense_optimizer

Si es True, fuerza la densificación de los vectores de optimización internos. Si es False, habilita el optimizador de la regresión logística y usa los estados internos disperso o denso según lo considere apropiado. Si denseOptimizer se establece en True, el optimizador interno debe usar el estado interno denso, que puede ayudar a mitigar la carga en el recolector de elementos no utilizados para algunos tipos de problemas mayores.

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 variable old sea True.

  • row_selection = (age > 20) & (age < 65) & (log(income) > 10) solo usa observaciones en las que el valor de la variable age está entre 20 y 65, y el valor de log de la variable income 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 LogisticRegression con el modelo entrenado.

Nota

Este algoritmo intentará cargar todo el conjunto de datos en la memoria cuando se use train_threads > 1 (multithreading).

Vea también

rx_predict

Referencias

Wikipedia: L-BFGS

Wikipedia: Regresión logística

Entrenamiento escalable de modelos logísticos lineales con regularización L1

Serie de pruebas: Regularizaciones L1 y L2 para aprendizaje automático

Ejemplo de clasificación binaria

'''
Binary Classification.
'''
import numpy
import pandas
from microsoftml import rx_logistic_regression, 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)

model = rx_logistic_regression(
    formula=" isCase ~ age + parity + education + spontaneous + induced ",
    data=data_train)

print(model.coef_)
    
# RuntimeError: The type (RxTextData) for file is not supported.
score_ds = rx_predict(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.001, Transform Time: 0
Beginning processing data.
Beginning processing data.
Rows Read: 186, Read Time: 0, Transform Time: 0
Beginning processing data.
LBFGS multi-threading will attempt to load dataset into memory. In case of out-of-memory issues, turn off multi-threading by setting trainThreads to 1.
Beginning optimization
num vars: 6
improvement criterion: Mean Improvement
L1 regularization selected 5 of 6 weights.
Not training a calibrator because it is not needed.
Elapsed time: 00:00:00.0646405
Elapsed time: 00:00:00.0083991
OrderedDict([('(Bias)', -1.2366217374801636), ('spontaneous', 1.9391206502914429), ('induced', 0.7497404217720032), ('parity', -0.31517016887664795), ('age', -3.162723260174971e-06)])
Beginning processing data.
Rows Read: 62, Read Time: 0, Transform Time: 0
Beginning processing data.
Elapsed time: 00:00:00.0287290
Finished writing 62 rows.
Writing completed.
Rows Read: 5, Total Rows Processed: 5, Total Chunk Time: 0.001 seconds 
  isCase PredictedLabel     Score  Probability
0  False          False -1.341681     0.207234
1   True           True  0.597440     0.645070
2  False           True  0.544912     0.632954
3  False          False -1.289152     0.215996
4  False          False -1.019339     0.265156

Ejemplo de clasificación multiclase

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

iris = get_dataset("iris")

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

irisdf = iris.as_df()
irisdf["Species"] = irisdf["Species"].astype("category")
data_train, data_test, y_train, y_test = train_test_split(irisdf, irisdf.Species)

model = rx_logistic_regression(
    formula="  Species ~ Sepal_Length + Sepal_Width + Petal_Length + Petal_Width ",
    method="multiClass",
    data=data_train)

print(model.coef_)
    
# RuntimeError: The type (RxTextData) for file is not supported.
score_ds = rx_predict(model, data=data_test,
                     extra_vars_to_write=["Species", "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: 112, Read Time: 0, Transform Time: 0
Beginning processing data.
Beginning processing data.
Rows Read: 112, Read Time: 0, Transform Time: 0
Beginning processing data.
Beginning processing data.
Rows Read: 112, Read Time: 0, Transform Time: 0
Beginning processing data.
LBFGS multi-threading will attempt to load dataset into memory. In case of out-of-memory issues, turn off multi-threading by setting trainThreads to 1.
Beginning optimization
num vars: 15
improvement criterion: Mean Improvement
L1 regularization selected 9 of 15 weights.
Not training a calibrator because it is not needed.
Elapsed time: 00:00:00.0493224
Elapsed time: 00:00:00.0080558
OrderedDict([('setosa+(Bias)', 2.074636697769165), ('versicolor+(Bias)', 0.4899507164955139), ('virginica+(Bias)', -2.564580202102661), ('setosa+Petal_Width', -2.8389241695404053), ('setosa+Petal_Length', -2.4824044704437256), ('setosa+Sepal_Width', 0.274869441986084), ('versicolor+Sepal_Width', -0.2645561397075653), ('virginica+Petal_Width', 2.6924400329589844), ('virginica+Petal_Length', 1.5976412296295166)])
Beginning processing data.
Rows Read: 38, Read Time: 0, Transform Time: 0
Beginning processing data.
Elapsed time: 00:00:00.0331861
Finished writing 38 rows.
Writing completed.
Rows Read: 5, Total Rows Processed: 5, Total Chunk Time: 0.001 seconds 
      Species   Score.0   Score.1   Score.2
0   virginica  0.044230  0.364927  0.590843
1      setosa  0.767412  0.210586  0.022002
2      setosa  0.756523  0.221933  0.021543
3      setosa  0.767652  0.211191  0.021157
4  versicolor  0.116369  0.498615  0.385016