NZFunTApply
了解 "NZFunTApply函数。
这与用例 "相对应 2. 根据所有可用记录建立 ML 模型。. 这就导致了两种变化:针对切片数据建立模型或针对整个表数据建立模型。
- 在每个数据片上应用函数
- 数据片是表数据的一部分。 Netezza会根据创建表时指定的列将数据分发到不同的切片。 如果没有指定列,第一列将被视为分布列。 因此,在使用 "
NZFunTApply之前,必须首先确定数据的分布情况。 否则,可能会产生意想不到的结果,即函数被应用到了你并不打算应用的切片上。- 示例场景:转换数据、建立 ML 模型并测量模型的准确性。
- 让我们定义一个函数来完成所有这些步骤。 该函数默认获取两个参数:"
self(代表 AE 上下文)和 "df(输入切片数据的数据帧)。 它首先对列进行估算(为空值分配一些默认值),然后建立一个决策树分类器,并测量 3 倍的 CV 精度。 结果(数据集大小、第一条记录的位置、准确性)用 "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))由于要对每个数据片应用函数,因此在模块调用中选择 "parallel=True。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()请注意,结果中有多行(与创建表格时生成的数据片的数量相对应)。 第一列是数据集的大小,第二列是数据集中第一条记录的位置,第三列是建立的分类器的准确率。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
- 在完整数据集上应用函数
- 您可能希望对整个数据集而不是切片应用函数。 这意味着,在应用函数之前,需要在一个地方汇总数据。 这并不是一个最佳方案,但为了完整起见,还是提供了这个选项(
parallel=False)。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()由于您选择了 "parallel=False(意味着您想在完整的数据集上执行函数),因此在输出中只能看到一行。 第一列是数据集的大小,第二列是数据集中第一条记录的位置,第三列是建立的分类器的准确率。DATASET_SIZE LOCATION CLASSIFIER_ACCURACY 142193 Albury 0.827115注意:对于复杂的功能,最好先在客户端测试,然后再在服务器上运行。 您可以使用选择查询(select * from weather limit 1000)下载一小部分子集(例如 1000 条记录),在客户端数据帧上测试函数,然后将函数推送到服务器,在整个数据集上运行。