NZFunTApply
Conozca la función ' NZFunTApply '.
Esto corresponde al caso de uso " 2. Construyendo un modelo ML contra todas las filas disponibles.. Esto da lugar a dos variantes: construir un modelo a partir de los datos del corte o construir un modelo a partir de los datos de toda la tabla.
- Aplicar funciones a todos y cada uno de los segmentos de los datos
- Una porción de datos es un fragmento de los datos de la tabla. Netezza distribuye los datos en distintos segmentos en función de la columna especificada en el momento de la creación de la tabla. Si no se especifica ninguna columna, se considerará la primera columna como columna de distribución. Por lo tanto, es importante identificar primero cómo se distribuyeron los datos antes de utilizar "
NZFunTApply. De lo contrario, podría tener resultados no deseados con la función que se aplica a las rebanadas que no era su intención.- Ejemplo de escenario: transformar los datos, construir un modelo ML y medir la precisión del modelo.
- Definamos una función que realice todos estos pasos. La función recibe dos parámetros por defecto, '
self(que representa el contexto AE) y 'df(dataframe para los datos de slice entrantes). Primero imputa las columnas (asignando algunos valores por defecto para los valores nulos), luego construye un clasificador de árbol de decisión y mide una precisión de CV de 3 veces. Y el resultado (tamaño del conjunto de datos, ubicación del primer registro, precisión) se imprime con 'self.output.from nzpyida import IdaDataBase, IdaDataFrame from nzpyida.ae import NZFunTApply idadb = IdaDataBase('weather', 'admin', 'password', verbose=True) idadf = IdaDataFrame(idadb, 'WEATHER') code_str_host_spus="""def decision_tree_ml(self, df): from sklearn.model_selection import cross_val_score from sklearn.impute import SimpleImputer from sklearn.tree import DecisionTreeClassifier from sklearn.preprocessing import LabelEncoder import numpy as np location = df.LOCATION[0] # data preparation imputed_df = df.copy() ds_size = len(imputed_df) imputed_df['CLOUD9AM'] = imputed_df.CLOUD9AM.astype('str') imputed_df['CLOUD3PM'] = imputed_df.CLOUD3PM.astype('str') imputed_df['SUNSHINE'] = imputed_df.SUNSHINE.astype('float') imputed_df['EVAPORATION'] = imputed_df.EVAPORATION.astype('float') #remove columns which have only null values columns = imputed_df.columns for column in columns: if imputed_df[column].isnull().sum()==len(imputed_df): imputed_df=imputed_df.drop(column, 1) for column in columns: if (imputed_df[column].dtype == 'float64' or imputed_df[column].dtype == 'int64'): imp = SimpleImputer(missing_values=np.nan, strategy='mean') imputed_df[column] = imp.fit_transform(imputed_df[column].values.reshape(-1, 1)) if (imputed_df[column].dtype == 'object'): # impute missing values for categorical variables imp = SimpleImputer(missing_values=None, strategy='constant', fill_value='missing') imputed_df[column] = imp.fit_transform(imputed_df[column].values.reshape(-1, 1)) imputed_df[column] = imputed_df[column].astype('str') le = LabelEncoder() #print(imputed_df[column].unique()) le.fit(imputed_df[column].unique()) # print(le.classes_) imputed_df[column] = le.transform(imputed_df[column]) X = imputed_df.drop(['RISK_MM', 'RAINTOMORROW'], axis=1) y = imputed_df['RAINTOMORROW'] # Create a decision tree dt = DecisionTreeClassifier(max_depth=5) cvscores_3 = cross_val_score(dt, X, y, cv=3) self.output(ds_size, location, np.mean(cvscores_3))Como desea aplicar la función a todos y cada uno de los segmentos de datos, elija 'parallel=Trueen la invocación del módulo.output_signature = {'DATASET_SIZE': 'int', 'LOCATION':'str', 'CLASSIFIER_ACCURACY':'double'} nz_fun_tapply = NZFunTApply(df=idadf, code_str=code_str_host_spus, fun_name ="decision_tree_ml", parallel=True, output_signature=output_signature) result = nz_fun_tapply.get_result()Observe que tiene varias filas en el resultado (correspondientes al número de rebanadas de datos generadas en el momento de la creación de la tabla). La primera columna es el tamaño del conjunto de datos, la segunda es la ubicación del primer registro en el conjunto de datos y la tercera es la precisión del clasificador construido.DATASET_SIZE LOCATION CLASSIFIER_ACCURACY 0 23673 Albury 0.824822 1 23734 Albury 0.827126 2 23686 Albury 0.813898 3 23706 Albury 0.818485 4 23739 Albury 0.832175 5 23655 Albury 0.826168
- Aplicación de funciones al conjunto de datos completo
- Es posible que desee aplicar una función a todo el conjunto de datos y no por trozos. Esto significa que los datos deben agregarse en un único lugar antes de poder aplicar la función. No se trata de un escenario óptimo, pero esta opción (
parallel=False) se ofrece en aras de la exhaustividad.output_signature = {'DATASET_SIZE': 'int', 'LOCATION':'str', 'CLASSIFIER_ACCURACY':'double'} nz_fun_tapply = NZFunTApply(df=idadf, code_str=code_str_host_spus, fun_name ="decision_tree_ml", parallel=False, output_signature=output_signature) result = nz_fun_tapply.get_result()Como ha elegido "parallel=False" (lo que significa que desea realizar la función en el conjunto de datos completo), sólo puede ver una fila en la salida. La primera columna es el tamaño del conjunto de datos, la segunda es la ubicación del primer registro en el conjunto de datos y la tercera es la precisión del clasificador construido.DATASET_SIZE LOCATION CLASSIFIER_ACCURACY 142193 Albury 0.827115Nota: Para funciones complejas, es mejor probarlas primero en el cliente antes de ejecutarlas en el servidor. Puede descargar un pequeño subconjunto (por ejemplo, 1.000 registros) con una consulta de selección (select * from weather limit 1000), probar la función en el marco de datos del cliente y, a continuación, enviar la función al servidor para ejecutarla con el conjunto de datos completo.