From 0671b592bbd0fde497515c8acbf25e8141f9ac39 Mon Sep 17 00:00:00 2001 From: zanshuxun <631763140@qq.com> Date: Sun, 26 Jun 2022 16:33:23 +0800 Subject: [PATCH 01/47] mtl --- deepctr_torch/models/__init__.py | 4 +- deepctr_torch/models/multitask/__init__.py | 4 + deepctr_torch/models/multitask/mmoe.py | 122 +++++++++++++ examples/census-income.sample | 200 +++++++++++++++++++++ examples/run_classification_criteo.py | 2 +- examples/run_mtl.py | 76 ++++++++ 6 files changed, 406 insertions(+), 2 deletions(-) create mode 100644 deepctr_torch/models/multitask/__init__.py create mode 100644 deepctr_torch/models/multitask/mmoe.py create mode 100644 examples/census-income.sample create mode 100644 examples/run_mtl.py diff --git a/deepctr_torch/models/__init__.py b/deepctr_torch/models/__init__.py index e72de07a..3204f8a5 100644 --- a/deepctr_torch/models/__init__.py +++ b/deepctr_torch/models/__init__.py @@ -15,4 +15,6 @@ from .ccpm import CCPM from .dien import DIEN from .din import DIN -from .afn import AFN \ No newline at end of file +from .afn import AFN +from .multitask import MMOE +# from .multitask import SharedBottom, ESMM, MMOE, PLE \ No newline at end of file diff --git a/deepctr_torch/models/multitask/__init__.py b/deepctr_torch/models/multitask/__init__.py new file mode 100644 index 00000000..a62e8d6f --- /dev/null +++ b/deepctr_torch/models/multitask/__init__.py @@ -0,0 +1,4 @@ +from .esmm import ESMM +from .mmoe import MMOE +from .ple import PLE +from .sharedbottom import SharedBottom \ No newline at end of file diff --git a/deepctr_torch/models/multitask/mmoe.py b/deepctr_torch/models/multitask/mmoe.py new file mode 100644 index 00000000..681aa6ee --- /dev/null +++ b/deepctr_torch/models/multitask/mmoe.py @@ -0,0 +1,122 @@ +# -*- coding:utf-8 -*- +""" +Author: + zanshuxun, zanshuxun@aliyun.com + +Reference: + [1] [Jiaqi Ma, Zhe Zhao, Xinyang Yi, et al. Modeling Task Relationships in Multi-task Learning with Multi-gate Mixture-of-Experts[C]](https://dl.acm.org/doi/10.1145/3219819.3220007) +""" +import torch +import torch.nn as nn + +from .basemodel import BaseModel +from .h.inputs import combined_dnn_input +from .h.layers import DNN, PredictionLayer + + +class MMOELayer(nn.Module): + """ + The Multi-gate Mixture-of-Experts layer in MMOE model + Input shape + - 2D tensor with shape: ``(batch_size,units)``. + + Output shape + - A list with **num_tasks** elements, which is a 2D tensor with shape: ``(batch_size, output_dim)`` . + + Arguments + - **input_dim** : Positive integer, dimensionality of input features. + - **num_tasks**: integer, the number of tasks, equal to the number of outputs. + - **num_experts**: integer, the number of experts. + - **output_dim**: integer, the dimension of each output of MMOELayer. + + References + - [Jiaqi Ma, Zhe Zhao, Xinyang Yi, et al. Modeling Task Relationships in Multi-task Learning with Multi-gate Mixture-of-Experts[C]](https://dl.acm.org/doi/10.1145/3219819.3220007) + """ + + def __init__(self, input_dim, num_tasks, num_experts, output_dim): + super(MMOELayer, self).__init__() + self.input_dim = input_dim + self.num_experts = num_experts + self.num_tasks = num_tasks + self.output_dim = output_dim + self.expert_network = nn.Linear(self.input_dim, self.num_experts * self.output_dim, bias=True) + self.gating_networks = nn.ModuleList( + [nn.Linear(self.input_dim, self.num_experts, bias=False) for _ in range(self.num_tasks)]) + + def forward(self, inputs): + outputs = [] + expert_out = self.expert_network(inputs) + expert_out = expert_out.reshape([-1, self.output_dim, self.num_experts]) + for i in range(self.num_tasks): + gate_out = self.gating_networks[i](inputs) + gate_out = gate_out.softmax(1).unsqueeze(-1) + output = torch.bmm(expert_out, gate_out).squeeze() + outputs.append(output) + return outputs + + +class MMOE(BaseModel): + """Instantiates the Multi-gate Mixture-of-Experts architecture. + + :param dnn_feature_columns: An iterable containing all the features used by deep part of the model. + :param num_tasks: integer, number of tasks, equal to number of outputs, must be greater than 1. + :param tasks: list of str, indicating the loss of each tasks, ``"binary"`` for binary logloss, ``"regression"`` for regression loss. e.g. ['binary', 'regression'] + :param num_experts: integer, number of experts. + :param expert_dim: integer, the hidden units of each expert. + :param dnn_hidden_units: list,list of positive integer or empty list, the layer number and units in each layer of shared-bottom DNN + :param l2_reg_embedding: float. L2 regularizer strength applied to embedding vector + :param l2_reg_dnn: float. L2 regularizer strength applied to DNN + :param init_std: float,to use as the initialize std of embedding vector + :param task_dnn_units: list,list of positive integer or empty list, the layer number and units in each layer of task-specific DNN + :param seed: integer ,to use as random seed. + :param dnn_dropout: float in [0,1), the probability we will drop out a given DNN coordinate. + :param dnn_activation: Activation function to use in DNN + :param dnn_use_bn: bool. Whether use BatchNormalization before activation or not in DNN + :param device: str, ``"cpu"`` or ``"cuda:0"`` + + :return: A PyTorch model instance. + """ + + def __init__(self, dnn_feature_columns, num_tasks, tasks, num_experts=4, expert_dim=8, dnn_hidden_units=(128, 128), + l2_reg_embedding=1e-5, l2_reg_dnn=0, init_std=0.0001, task_dnn_units=None, seed=1024, dnn_dropout=0, + dnn_activation='relu', dnn_use_bn=False, device='cpu'): + super(MMOE, self).__init__(linear_feature_columns=[], dnn_feature_columns=dnn_feature_columns, + l2_reg_embedding=l2_reg_embedding, seed=seed, device=device) + if num_tasks <= 1: + raise ValueError("num_tasks must be greater than 1") + if len(tasks) != num_tasks: + raise ValueError("num_tasks must be equal to the length of tasks") + for task in tasks: + if task not in ['binary', 'regression']: + raise ValueError("task must be binary or regression, {} is illegal".format(task)) + + self.tasks = tasks + self.task_dnn_units = task_dnn_units + self.dnn = DNN(self.compute_input_dim(dnn_feature_columns), dnn_hidden_units, + activation=dnn_activation, l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, + init_std=init_std, device=device) + self.mmoe_layer = MMOELayer(dnn_hidden_units[-1], num_tasks, num_experts, expert_dim) + if task_dnn_units is not None: + # the last layer of task_dnn should be expert_dim + self.task_dnn = nn.ModuleList([DNN(expert_dim, task_dnn_units+(expert_dim,)) for _ in range(num_tasks)]) + self.tower_network = nn.ModuleList([nn.Linear(expert_dim, 1, bias=False) for _ in range(num_tasks)]) + self.out = nn.ModuleList([PredictionLayer(task) for task in self.tasks]) + self.to(device) + + def forward(self, X): + sparse_embedding_list, dense_value_list = self.input_from_feature_columns(X, self.dnn_feature_columns, + self.embedding_dict) + dnn_input = combined_dnn_input(sparse_embedding_list, dense_value_list) + dnn_output = self.dnn(dnn_input) + mmoe_outs = self.mmoe_layer(dnn_output) + if self.task_dnn_units is not None: + mmoe_outs = [self.task_dnn[i](mmoe_out) for i, mmoe_out in enumerate(mmoe_outs)] + + task_outputs = [] + for i, mmoe_out in enumerate(mmoe_outs): + logit = self.tower_network[i](mmoe_out) + output = self.out[i](logit) + task_outputs.append(output) + + task_outputs = torch.cat(task_outputs, -1) + return task_outputs diff --git a/examples/census-income.sample b/examples/census-income.sample new file mode 100644 index 00000000..76069905 --- /dev/null +++ b/examples/census-income.sample @@ -0,0 +1,200 @@ +138481,62, Private,43,23, High school graduate,0, Not in universe, Married-civilian spouse present, Education, Adm support including clerical, White, All other, Female, Not in universe, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Householder, Householder,1819.08, ?, ?, ?, Not in universe under 1 year old, ?,4, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, 50000+. +91960,18, Private,40,19, 11th grade,0, High school, Never married, Entertainment, Sales, Black, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Single, Not in universe, Not in universe, Child 18+ never marr Not in a subfamily, Child 18 or older,645.07, Nonmover, Nonmover, Nonmover, Yes, Not in universe,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. +112171,19, Not in universe,0,0, High school graduate,0, College or university, Never married, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Single, Not in universe, Not in universe, Child 18+ never marr Not in a subfamily, Child 18 or older,396.66, Nonmover, Nonmover, Nonmover, Yes, Not in universe,1, Not in universe, United-States, United-States, United-States, Native- Born in the United States,2, Not in universe,2,16,94, - 50000. +118554,9, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, Mexican-American, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,2052.26, ?, ?, ?, Not in universe under 1 year old, ?,0, Mother only present, Mexico, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. +193623,31, Private,45,3, Bachelors degree(BA AB BS),0, Not in universe, Never married, Other professional services, Executive admin and managerial, Black, All other, Male, Not in universe, Not in universe, Full-time schedules,0,0,0, Single, Not in universe, Not in universe, Nonfamily householder, Householder,614.61, ?, ?, ?, Not in universe under 1 year old, ?,3, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. +198699,29, Private,33,29, Bachelors degree(BA AB BS),0, Not in universe, Married-civilian spouse present, Retail trade, Other service, White, All other, Female, Not in universe, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Householder, Householder,1971.05, ?, ?, ?, Not in universe under 1 year old, ?,2, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. +85495,52, Not in universe,0,0, High school graduate,0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Not in labor force,0,0,0, Nonfiler, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1079.49, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, Peru, Peru, Peru, Foreign born- U S citizen by naturalization,0, Not in universe,2,0,95, - 50000. +196125,0, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, Asian or Pacific Islander, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,1774.28, Not in universe, Not in universe, Not in universe, Not in universe under 1 year old, Not in universe,0, Both parents present, Taiwan, Taiwan, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. +132109,16, Private,33,41, 9th grade,0, High school, Never married, Retail trade, Handlers equip cleaners etc , White, All other, Male, Not in universe, Job loser - on layoff, Children or Armed Forces,0,0,0, Single, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,368.31, Nonmover, Nonmover, Nonmover, Yes, Not in universe,4, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. +31996,6, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,1272.86, ?, ?, ?, Not in universe under 1 year old, ?,0, Both parents present, United-States, Italy, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. +197276,25, Private,8,36, 12th grade no diploma,0, Not in universe, Married-civilian spouse present, Manufacturing-durable goods, Machine operators assmblrs & inspctrs, White, Central or South American, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Joint both under 65, West, California, Householder, Householder,1964.79, MSA to MSA, Same county, Same county, No, Yes,2, Not in universe, El-Salvador, El-Salvador, El-Salvador, Foreign born- Not a citizen of U S ,0, Not in universe,2,20,94, - 50000. +43637,52, Private,37,31, 11th grade,0, Not in universe, Never married, Business and repair services, Other service, Black, All other, Female, Not in universe, Not in universe, Full-time schedules,0,0,0, Single, Not in universe, Not in universe, Nonfamily householder, Householder,4059.47, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,2, Not in universe,2,52,95, - 50000. +160024,3, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, Mexican-American, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,927.49, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. +184841,7, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, NA, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,1516.17, ?, ?, ?, Not in universe under 1 year old, ?,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. +90343,2, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, Asian or Pacific Islander, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,890.26, ?, ?, ?, Not in universe under 1 year old, ?,0, Both parents present, Philippines, Philippines, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. +196773,72, Not in universe,0,0, High school graduate,0, Not in universe, Widowed, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Not in labor force,0,0,0, Nonfiler, Not in universe, Not in universe, Nonfamily householder, Householder,589.54, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, Germany, Germany, Germany, Foreign born- U S citizen by naturalization,0, Not in universe,2,0,95, - 50000. +102326,61, Private,35,26, High school graduate,0, Not in universe, Divorced, Finance insurance and real estate, Adm support including clerical, White, All other, Female, No, Not in universe, Full-time schedules,0,0,0, Single, Not in universe, Not in universe, Nonfamily householder, Householder,1042.72, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. +94179,45, Self-employed-not incorporated,33,19, Associates degree-occup /vocational,0, Not in universe, Divorced, Retail trade, Sales, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,1602,0, Single, Not in universe, Not in universe, Child 18+ ever marr Not in a subfamily, Child 18 or older,4184.67, Nonmover, Nonmover, Nonmover, Yes, Not in universe,1, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. +115094,45, Private,3,39, Some college but no degree,725, Not in universe, Married-civilian spouse present, Mining, Transportation and material moving, White, All other, Male, No, Not in universe, Children or Armed Forces,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1361.67, Nonmover, Nonmover, Nonmover, Yes, Not in universe,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,2, Not in universe,2,48,94, - 50000. +139808,13, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, Other, Mexican-American, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,1749.06, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. +10547,12, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,2473.12, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Mother only present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. +140760,27, Not in universe,0,0, 5th or 6th grade,0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, Mexican (Mexicano), Female, Not in universe, Not in universe, Not in labor force,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,2523.97, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, Mexico, Mexico, Mexico, Foreign born- Not a citizen of U S ,0, Not in universe,2,0,95, - 50000. +143136,11, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,2195.61, ?, ?, ?, Not in universe under 1 year old, ?,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. +198740,25, Private,37,2, Bachelors degree(BA AB BS),0, Not in universe, Never married, Business and repair services, Executive admin and managerial, Asian or Pacific Islander, All other, Female, Not in universe, Not in universe, Full-time schedules,0,0,10, Single, Not in universe, Not in universe, Other Rel 18+ never marr not in subfamily, Other relative of householder,1152.64, ?, ?, ?, Not in universe under 1 year old, ?,3, Not in universe, Philippines, Philippines, Philippines, Foreign born- Not a citizen of U S ,0, Not in universe,2,50,95, - 50000. +171302,5, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, Black, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,467.65, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. +51270,45, Private,38,31, High school graduate,0, Not in universe, Married-civilian spouse present, Business and repair services, Other service, White, All other, Female, Not in universe, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1155.2, ?, ?, ?, Not in universe under 1 year old, ?,4, Not in universe, Poland, Poland, Poland, Foreign born- Not a citizen of U S ,0, Not in universe,2,16,95, - 50000. +102571,16, Private,33,19, 10th grade,0, High school, Never married, Retail trade, Sales, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Single, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,2072.15, Nonmover, Nonmover, Nonmover, Yes, Not in universe,6, Mother only present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,20,94, - 50000. +87901,46, Private,45,4, Bachelors degree(BA AB BS),0, Not in universe, Never married, Other professional services, Professional specialty, White, All other, Male, No, Not in universe, Full-time schedules,0,0,0, Single, Not in universe, Not in universe, Nonfamily householder, Householder,2405.49, ?, ?, ?, Not in universe under 1 year old, ?,2, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,45,95, 50000+. +40034,37, Private,39,2, High school graduate,0, Not in universe, Divorced, Personal services except private HH, Executive admin and managerial, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Head of household, Not in universe, Not in universe, Householder, Householder,1456.55, Nonmover, Nonmover, Nonmover, Yes, Not in universe,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. +91671,42, Self-employed-not incorporated,44,32, High school graduate,0, Not in universe, Married-civilian spouse present, Social services, Other service, White, All other, Female, Not in universe, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1141.93, ?, ?, ?, Not in universe under 1 year old, ?,1, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,50,95, - 50000. +97009,14, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,900.5, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Mother only present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. +178794,76, Not in universe,0,0, 10th grade,0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Not in labor force,0,0,0, Nonfiler, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1131.39, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,95, - 50000. +84772,30, Not in universe,0,0, Bachelors degree(BA AB BS),0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, Mexican (Mexicano), Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Joint both under 65, West, California, Spouse of householder, Spouse of householder,1707.88, MSA to MSA, Same county, Same county, No, Yes,0, Not in universe, Mexico, Mexico, Mexico, Foreign born- Not a citizen of U S ,0, Not in universe,2,0,94, - 50000. +7953,79, Not in universe,0,0, 11th grade,0, Not in universe, Widowed, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,119, Head of household, Not in universe, Not in universe, Householder, Householder,1644.11, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,94, - 50000. +56916,27, Private,39,32, High school graduate,0, Not in universe, Never married, Personal services except private HH, Other service, Black, All other, Female, Not in universe, Not in universe, Full-time schedules,0,0,0, Head of household, Not in universe, Not in universe, RP of unrelated subfamily, Nonrelative of householder,1717.06, ?, ?, ?, Not in universe under 1 year old, ?,2, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. +150887,5, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, Black, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child under 18 of RP of unrel subfamily, Nonrelative of householder,4578.98, ?, ?, ?, Not in universe under 1 year old, ?,0, Mother only present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. +182649,5, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, Amer Indian Aleut or Eskimo, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,1020.52, ?, ?, ?, Not in universe under 1 year old, ?,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. +177755,69, State government,50,28, High school graduate,0, Not in universe, Married-civilian spouse present, Public administration, Protective services, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,5, Joint one under 65 & one 65+, Not in universe, Not in universe, Householder, Householder,404.72, Nonmover, Nonmover, Nonmover, Yes, Not in universe,1, Not in universe, ?, ?, United-States, Native- Born in the United States,0, Not in universe,2,6,94, - 50000. +143031,69, Not in universe,0,0, 7th and 8th grade,0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,400, Nonfiler, Not in universe, Not in universe, Householder, Householder,1723.61, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Not in universe, Poland, Poland, Poland, Foreign born- U S citizen by naturalization,0, Not in universe,2,0,94, - 50000. +17047,46, Local government,43,10, Masters degree(MA MS MEng MEd MSW MBA),0, Not in universe, Divorced, Education, Professional specialty, White, All other, Female, Yes, Not in universe, Children or Armed Forces,0,1876,139, Single, Not in universe, Not in universe, Nonfamily householder, Householder,1722.26, Nonmover, Nonmover, Nonmover, Yes, Not in universe,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,36,94, - 50000. +5446,57, Private,42,13, Associates degree-occup /vocational,1329, Not in universe, Divorced, Medical except hospital, Technicians and related support, White, All other, Female, No, Not in universe, Children or Armed Forces,2202,0,0, Single, Not in universe, Not in universe, Nonfamily householder, Householder,1168.63, Nonmover, Nonmover, Nonmover, Yes, Not in universe,2, Not in universe, United-States, United-States, United-States, Native- Born in the United States,2, Not in universe,2,52,94, - 50000. +171213,14, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,1793.11, ?, ?, ?, Not in universe under 1 year old, ?,0, Mother only present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. +173292,43, Private,21,26, High school graduate,0, Not in universe, Married-civilian spouse present, Manufacturing-nondurable goods, Adm support including clerical, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,3762.14, Nonmover, Nonmover, Nonmover, Yes, Not in universe,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. +79813,5, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,3050.97, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Both parents present, ?, ?, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. +181506,57, Private,27,35, High school graduate,0, Not in universe, Married-civilian spouse present, Manufacturing-nondurable goods, Precision production craft & repair, White, Puerto Rican, Male, Not in universe, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1101.85, ?, ?, ?, Not in universe under 1 year old, ?,3, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. +67884,0, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,970.2, Not in universe, Not in universe, Not in universe, Not in universe under 1 year old, Not in universe,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. +1095,0, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, Asian or Pacific Islander, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,1952.21, ?, ?, ?, Not in universe under 1 year old, ?,0, Both parents present, Poland, ?, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. +47621,47, Private,39,31, 11th grade,0, Not in universe, Married-civilian spouse present, Personal services except private HH, Other service, White, Central or South American, Male, Not in universe, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Householder, Householder,791.11, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, Columbia, Native- Born abroad of American Parent(s),0, Not in universe,2,52,95, - 50000. +65460,49, State government,43,3, Bachelors degree(BA AB BS),0, Not in universe, Divorced, Education, Executive admin and managerial, White, All other, Male, Not in universe, Not in universe, Full-time schedules,0,0,0, Single, Not in universe, Not in universe, Householder, Householder,251.25, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, Canada, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. +140996,47, Private,33,26, 5th or 6th grade,0, Not in universe, Married-civilian spouse present, Retail trade, Adm support including clerical, White, Mexican-American, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1283.79, Nonmover, Nonmover, Nonmover, Yes, Not in universe,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,1,94, - 50000. +23431,31, Self-employed-not incorporated,2,43, High school graduate,0, Not in universe, Married-civilian spouse present, Agriculture, Farming forestry and fishing, White, All other, Female, Not in universe, Not in universe, PT for non-econ reasons usually FT,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,823.78, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,95, - 50000. +18488,57, Not in universe,0,0, High school graduate,0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, Black, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Joint both under 65, Not in universe, Not in universe, Householder, Householder,548.37, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,94, - 50000. +63908,19, Private,33,29, Some college but no degree,0, College or university, Never married, Retail trade, Other service, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Single, Not in universe, Not in universe, Grandchild 18+ never marr not in subfamily, Other relative of householder,942.2, Nonmover, Nonmover, Nonmover, Yes, Not in universe,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,2, Not in universe,2,52,94, - 50000. +147955,25, Not in universe,0,0, Bachelors degree(BA AB BS),0, Not in universe, Never married, Not in universe or children, Not in universe, White, Other Spanish, Male, Not in universe, Not in universe, Not in labor force,0,0,0, Nonfiler, Not in universe, Not in universe, Nonfamily householder, Householder,1087.39, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, Mexico, Puerto-Rico, Mexico, Native- Born abroad of American Parent(s),0, Not in universe,2,0,95, - 50000. +1219,43, Private,33,26, High school graduate,0, Not in universe, Married-civilian spouse present, Retail trade, Adm support including clerical, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,50, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,3440.67, Nonmover, Nonmover, Nonmover, Yes, Not in universe,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. +98929,44, Private,30,26, Bachelors degree(BA AB BS),0, Not in universe, Never married, Communications, Adm support including clerical, Black, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Head of household, Not in universe, Not in universe, Householder, Householder,1040.96, Nonmover, Nonmover, Nonmover, Yes, Not in universe,5, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. +64415,34, Local government,47,28, Some college but no degree,0, Not in universe, Never married, Public administration, Protective services, White, All other, Male, Not in universe, Not in universe, Full-time schedules,0,0,0, Single, Not in universe, Not in universe, Nonfamily householder, Householder,1161.47, ?, ?, ?, Not in universe under 1 year old, ?,3, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, No,1,52,95, - 50000. +197617,14, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,2177.31, ?, ?, ?, Not in universe under 1 year old, ?,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. +178368,35, Not in universe,0,0, 9th grade,0, Not in universe, Never married, Not in universe or children, Not in universe, Black, All other, Male, Not in universe, Not in universe, Not in labor force,0,0,0, Nonfiler, Not in universe, Not in universe, Nonfamily householder, Householder,1864.42, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,95, - 50000. +40399,19, Not in universe,0,0, Some college but no degree,0, College or university, Never married, Not in universe or children, Not in universe, Asian or Pacific Islander, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child 18+ never marr Not in a subfamily, Child 18 or older,598.21, Nonmover, Nonmover, Nonmover, Yes, Not in universe,2, Not in universe, United-States, ?, United-States, Native- Born in the United States,0, Not in universe,2,13,94, - 50000. +157159,22, Self-employed-not incorporated,37,15, Associates degree-occup /vocational,0, Not in universe, Never married, Business and repair services, Technicians and related support, White, All other, Male, Not in universe, Not in universe, Full-time schedules,0,0,0, Single, Not in universe, Not in universe, Secondary individual, Nonrelative of householder,4074.15, ?, ?, ?, Not in universe under 1 year old, ?,1, Not in universe, United-States, United-States, Holand-Netherlands, Native- Born abroad of American Parent(s),0, Not in universe,2,36,95, - 50000. +39951,45, Federal government,49,1, Masters degree(MA MS MEng MEd MSW MBA),0, Not in universe, Divorced, Public administration, Executive admin and managerial, White, All other, Female, Not in universe, Not in universe, Full-time schedules,0,1980,0, Single, Not in universe, Not in universe, Householder, Householder,1632.8, ?, ?, ?, Not in universe under 1 year old, ?,3, Not in universe, United-States, United-States, United-States, Native- Born in the United States,2, Not in universe,2,52,95, - 50000. +80149,28, Private,39,31, 5th or 6th grade,0, Not in universe, Never married, Personal services except private HH, Other service, White, Mexican (Mexicano), Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Single, Not in universe, Not in universe, Other Rel 18+ never marr not in subfamily, Other relative of householder,2028.73, Nonmover, Nonmover, Nonmover, Yes, Not in universe,6, Not in universe, Mexico, Mexico, Mexico, Foreign born- U S citizen by naturalization,2, Not in universe,2,52,94, - 50000. +33078,70, Not in universe,0,0, High school graduate,0, Not in universe, Widowed, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Not in labor force,401,0,0, Single, Not in universe, Not in universe, Nonfamily householder, Householder,983.2, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, Canada, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,95, - 50000. +118945,6, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,1702.46, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. +173073,17, Not in universe,0,0, 11th grade,0, High school, Never married, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Not in labor force,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,1522.83, ?, ?, ?, Not in universe under 1 year old, ?,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,95, - 50000. +154955,33, Private,42,13, Some college but no degree,0, Not in universe, Divorced, Medical except hospital, Technicians and related support, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,177, Single, Not in universe, Not in universe, Nonfamily householder, Householder,2359.01, Nonmover, Nonmover, Nonmover, Yes, Not in universe,4, Not in universe, United-States, Germany, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. +22221,63, Not in universe,0,0, 10th grade,0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,7959.51, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,94, - 50000. +38335,33, Not in universe,0,0, 5th or 6th grade,0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, Mexican-American, Female, Not in universe, Not in universe, Not in labor force,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1363.13, ?, ?, ?, Not in universe under 1 year old, ?,4, Not in universe, Mexico, Mexico, Mexico, Foreign born- Not a citizen of U S ,0, Not in universe,2,52,95, - 50000. +123934,10, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,1778.48, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. +185904,64, Not in universe,0,0, High school graduate,0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Not in labor force,0,0,24, Joint one under 65 & one 65+, Not in universe, Not in universe, Spouse of householder, Spouse of householder,2461.72, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,95, - 50000. +71771,39, Private,29,38, Some college but no degree,0, Not in universe, Never married, Transportation, Transportation and material moving, White, Mexican-American, Male, Not in universe, Not in universe, Full-time schedules,0,0,0, Single, Not in universe, Not in universe, Nonfamily householder, Householder,702.43, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. +69160,2, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,926.58, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. +147725,77, Not in universe,0,0, Prof school degree (MD DDS DVM LLB JD),0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,1455,0,0, Joint both 65+, Not in universe, Not in universe, Householder, Householder,1623.8, Nonmover, Nonmover, Nonmover, Yes, Not in universe,1, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,1,94, - 50000. +84225,6, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,2589.81, ?, ?, ?, Not in universe under 1 year old, ?,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. +58184,42, Private,5,36, High school graduate,0, Not in universe, Married-civilian spouse present, Manufacturing-durable goods, Machine operators assmblrs & inspctrs, White, All other, Male, Not in universe, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Householder, Householder,2553.09, ?, ?, ?, Not in universe under 1 year old, ?,4, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. +191708,30, Private,33,19, High school graduate,0, Not in universe, Never married, Retail trade, Sales, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Single, Midwest, Tennessee, Child 18+ never marr Not in a subfamily, Child 18 or older,433.4, NonMSA to nonMSA, Same county, Same county, No, No,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. +73103,48, Private,33,12, Some college but no degree,0, Not in universe, Married-civilian spouse present, Retail trade, Professional specialty, White, All other, Female, Not in universe, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Householder, Householder,281.59, ?, ?, ?, Not in universe under 1 year old, ?,2, Not in universe, United-States, United-States, United-States, Native- Born in the United States,1, Not in universe,2,25,95, - 50000. +25855,20, Never worked,0,0, Some college but no degree,0, College or university, Never married, Not in universe or children, Not in universe, Asian or Pacific Islander, All other, Female, Not in universe, New entrant, Unemployed part- time,0,0,0, Nonfiler, Not in universe, Not in universe, In group quarters, Group Quarters- Secondary individual,1394.7, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, South Korea, South Korea, South Korea, Foreign born- Not a citizen of U S ,0, Not in universe,2,0,95, - 50000. +20809,65, State government,43,9, Doctorate degree(PhD EdD),0, Not in universe, Married-civilian spouse present, Education, Professional specialty, White, All other, Male, Not in universe, Not in universe, Full-time schedules,0,2174,250, Joint both 65+, Not in universe, Not in universe, Householder, Householder,1580.56, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, 50000+. +121724,31, Local government,43,10, Bachelors degree(BA AB BS),0, Not in universe, Never married, Education, Professional specialty, White, All other, Male, Yes, Not in universe, Children or Armed Forces,0,0,0, Single, Not in universe, Not in universe, Nonfamily householder, Householder,2220.04, Nonmover, Nonmover, Nonmover, Yes, Not in universe,4, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,43,94, - 50000. +87147,51, Not in universe,0,0, 9th grade,0, Not in universe, Widowed, Not in universe or children, Not in universe, Black, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, South, Texas, Nonfamily householder, Householder,2542.38, MSA to MSA, Same county, Same county, No, Yes,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,94, - 50000. +45361,6, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, Black, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,1423.77, ?, ?, ?, Not in universe under 1 year old, ?,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. +10963,42, Private,38,42, Some college but no degree,0, Not in universe, Married-civilian spouse present, Business and repair services, Handlers equip cleaners etc , White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Joint both under 65, Midwest, Montana, Spouse of householder, Spouse of householder,6282.42, MSA to MSA, Different county same state, Different county same state, No, No,6, Not in universe, El-Salvador, United-States, United-States, Native- Born in the United States,2, Not in universe,2,52,94, - 50000. +43878,20, Private,2,44, High school graduate,0, Not in universe, Never married, Agriculture, Farming forestry and fishing, White, All other, Male, Not in universe, Re-entrant, Unemployed full-time,0,0,0, Single, Not in universe, Not in universe, Child 18+ never marr Not in a subfamily, Child 18 or older,258.24, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,2, Not in universe,2,4,95, - 50000. +19256,9, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,1509.08, ?, ?, ?, Not in universe under 1 year old, ?,0, Mother only present, United-States, United-States, Germany, Native- Born abroad of American Parent(s),0, Not in universe,0,0,95, - 50000. +71391,48, Private,38,42, 1st 2nd 3rd or 4th grade,0, Not in universe, Married-civilian spouse present, Business and repair services, Handlers equip cleaners etc , Asian or Pacific Islander, All other, Male, Not in universe, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Householder, Householder,2395.72, ?, ?, ?, Not in universe under 1 year old, ?,1, Not in universe, ?, ?, ?, Foreign born- Not a citizen of U S ,0, Not in universe,2,52,95, - 50000. +138769,17, Not in universe,0,0, 10th grade,0, High school, Never married, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Not in labor force,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,588.0, ?, ?, ?, Not in universe under 1 year old, ?,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,95, - 50000. +98200,33, Private,42,30, High school graduate,0, Not in universe, Married-civilian spouse present, Medical except hospital, Other service, White, Chicano, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Joint both under 65, West, New York, Householder, Householder,438.7, MSA to MSA, Same county, Same county, No, Yes,3, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,15,94, - 50000. +7213,2, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,1043.07, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Mother only present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. +891,15, Not in universe,0,0, 9th grade,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,1206.13, Nonmover, Nonmover, Nonmover, Yes, Not in universe,1, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,2,94, - 50000. +45910,68, Not in universe,0,0, High school graduate,0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Joint one under 65 & one 65+, Not in universe, Not in universe, Householder, Householder,1634.16, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,94, - 50000. +68156,16, Not in universe,0,0, 9th grade,0, High school, Never married, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Not in labor force,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,662.39, ?, ?, ?, Not in universe under 1 year old, ?,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,95, - 50000. +111042,52, Not in universe,0,0, Masters degree(MA MS MEng MEd MSW MBA),0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Not in labor force,0,0,10000, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1024.89, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,95, 50000+. +197422,67, Private,34,2, High school graduate,0, Not in universe, Widowed, Finance insurance and real estate, Executive admin and managerial, White, All other, Male, No, Not in universe, Children or Armed Forces,0,0,0, Single, Not in universe, Not in universe, Householder, Householder,1539.89, Nonmover, Nonmover, Nonmover, Yes, Not in universe,4, Not in universe, Ireland, Ireland, United-States, Native- Born in the United States,0, Not in universe,2,52,94, 50000+. +10440,8, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Grandchild <18 never marr not in subfamily, Other relative of householder,938.92, ?, ?, ?, Not in universe under 1 year old, ?,0, Neither parent present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. +9427,42, Not in universe,0,0, 10th grade,0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,2701.7, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,94, - 50000. +7449,48, Private,12,2, High school graduate,0, Not in universe, Married-civilian spouse present, Manufacturing-durable goods, Executive admin and managerial, Asian or Pacific Islander, All other, Female, Not in universe, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1965.34, ?, ?, ?, Not in universe under 1 year old, ?,1, Not in universe, China, Vietnam, Vietnam, Foreign born- U S citizen by naturalization,0, Not in universe,2,52,95, - 50000. +128836,8, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,2298.82, ?, ?, ?, Not in universe under 1 year old, ?,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. +48918,72, Not in universe,0,0, 7th and 8th grade,0, Not in universe, Never married, Not in universe or children, Not in universe, Black, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Nonfamily householder, Householder,419.51, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,94, - 50000. +93667,23, Private,33,19, Associates degree-academic program,825, Not in universe, Married-civilian spouse present, Retail trade, Sales, White, All other, Female, No, Not in universe, Full-time schedules,0,0,75, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,2615.23, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. +29020,42, Private,45,15, Associates degree-academic program,0, Not in universe, Widowed, Other professional services, Technicians and related support, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,290, Head of household, Not in universe, Not in universe, Householder, Householder,1552.03, Nonmover, Nonmover, Nonmover, Yes, Not in universe,1, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. +109337,10, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,1640.4, ?, ?, ?, Not in universe under 1 year old, ?,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. +40199,4, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,2397.57, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. +39475,37, Private,41,8, Associates degree-occup /vocational,2355, Not in universe, Never married, Hospital services, Professional specialty, White, All other, Female, No, Not in universe, Children or Armed Forces,0,0,0, Single, Not in universe, Not in universe, Nonfamily householder, Householder,1196.52, Nonmover, Nonmover, Nonmover, Yes, Not in universe,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Yes,1,52,94, 50000+. +159112,63, Without pay,6,35, High school graduate,0, Not in universe, Married-civilian spouse present, Manufacturing-durable goods, Precision production craft & repair, White, All other, Male, Not in universe, Not in universe, PT for non-econ reasons usually FT,0,0,0, Joint both under 65, Not in universe, Not in universe, Householder, Householder,4441.94, ?, ?, ?, Not in universe under 1 year old, ?,1, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. +152918,41, Not in universe,0,0, 1st 2nd 3rd or 4th grade,0, Not in universe, Separated, Not in universe or children, Not in universe, Black, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, South, ?, Secondary individual, Nonrelative of householder,2745.08, NonMSA to nonMSA, Different county same state, Different county same state, No, No,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,94, - 50000. +88096,4, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, Asian or Pacific Islander, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,777.43, ?, ?, ?, Not in universe under 1 year old, ?,0, Both parents present, Philippines, Philippines, Philippines, Foreign born- Not a citizen of U S ,0, Not in universe,0,0,95, - 50000. +175317,43, Private,44,12, Masters degree(MA MS MEng MEd MSW MBA),0, Not in universe, Divorced, Social services, Professional specialty, White, All other, Female, Not in universe, Not in universe, Full-time schedules,0,0,0, Head of household, Not in universe, Not in universe, Householder, Householder,2639.54, ?, ?, ?, Not in universe under 1 year old, ?,5, Not in universe, United-States, United-States, United-States, Native- Born in the United States,2, Not in universe,2,52,95, - 50000. +80470,49, Private,34,17, Bachelors degree(BA AB BS),0, Not in universe, Divorced, Finance insurance and real estate, Sales, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,500, Single, Not in universe, Not in universe, Nonfamily householder, Householder,1811.45, Nonmover, Nonmover, Nonmover, Yes, Not in universe,5, Not in universe, United-States, ?, United-States, Native- Born in the United States,0, Not in universe,2,52,94, 50000+. +161690,6, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,281.98, ?, ?, ?, Not in universe under 1 year old, ?,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. +3630,41, Not in universe,0,0, High school graduate,0, Not in universe, Divorced, Not in universe or children, Not in universe, Black, All other, Female, Not in universe, Not in universe, Not in labor force,0,0,0, Nonfiler, Not in universe, Not in universe, Householder, Householder,1689.66, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,95, - 50000. +12305,46, State government,43,29, High school graduate,840, Not in universe, Married-civilian spouse present, Education, Other service, White, All other, Female, No, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1227.32, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,36,95, - 50000. +100405,33, Not in universe,0,0, Some college but no degree,0, Not in universe, Divorced, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child 18+ ever marr Not in a subfamily, Child 18 or older,2798.03, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,94, - 50000. +181953,35, Private,11,37, 11th grade,0, Not in universe, Married-civilian spouse present, Manufacturing-durable goods, Machine operators assmblrs & inspctrs, White, All other, Female, Not in universe, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,3603.1, ?, ?, ?, Not in universe under 1 year old, ?,4, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. +165427,43, Private,35,23, Some college but no degree,0, Not in universe, Divorced, Finance insurance and real estate, Adm support including clerical, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Single, South, Utah, Secondary individual, Nonrelative of householder,450.49, MSA to MSA, Different region, Different state in South, No, Yes,1, Not in universe, United-States, United-States, United-States, Native- Born in the United States,2, Not in universe,2,48,94, - 50000. +48964,25, Private,34,3, Bachelors degree(BA AB BS),0, Not in universe, Never married, Finance insurance and real estate, Executive admin and managerial, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,10, Single, South, Utah, Nonfamily householder, Householder,2776.11, MSA to MSA, Same county, Same county, No, Yes,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,2, Not in universe,2,52,94, - 50000. +111549,80, Not in universe,0,0, 11th grade,0, Not in universe, Widowed, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Not in labor force,0,0,0, Single, Not in universe, Not in universe, Nonfamily householder, Householder,2674.96, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,95, - 50000. +12284,37, Local government,40,23, High school graduate,0, Not in universe, Married-civilian spouse present, Entertainment, Adm support including clerical, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,2434.3, Nonmover, Nonmover, Nonmover, Yes, Not in universe,3, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. +111003,24, Private,1,44, 11th grade,0, Not in universe, Never married, Agriculture, Farming forestry and fishing, White, Puerto Rican, Male, Not in universe, Job loser - on layoff, Children or Armed Forces,2463,0,0, Single, Not in universe, Not in universe, Householder, Householder,895.49, Nonmover, Nonmover, Nonmover, Yes, Not in universe,4, Not in universe, Puerto-Rico, Puerto-Rico, United-States, Native- Born in the United States,0, Not in universe,2,40,94, - 50000. +4035,52, State government,43,10, Masters degree(MA MS MEng MEd MSW MBA),0, Not in universe, Married-civilian spouse present, Education, Professional specialty, White, All other, Female, Not in universe, Not in universe, Full-time schedules,0,0,3000, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1559.39, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,2, Not in universe,2,15,95, 50000+. +57559,34, Private,24,26, High school graduate,0, Not in universe, Divorced, Manufacturing-nondurable goods, Adm support including clerical, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Single, Not in universe, Not in universe, Child 18+ ever marr Not in a subfamily, Child 18 or older,2878.31, Nonmover, Nonmover, Nonmover, Yes, Not in universe,4, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. +197612,6, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, Black, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,1985.13, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Mother only present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. +186539,35, Not in universe,0,0, 1st 2nd 3rd or 4th grade,0, Not in universe, Separated, Not in universe or children, Not in universe, White, Mexican (Mexicano), Female, Not in universe, Not in universe, Not in labor force,0,0,0, Nonfiler, Not in universe, Not in universe, Householder, Householder,1346.86, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, Mexico, Mexico, Mexico, Foreign born- Not a citizen of U S ,0, Not in universe,2,0,95, - 50000. +80242,45, Private,22,36, 5th or 6th grade,0, Not in universe, Married-civilian spouse present, Manufacturing-nondurable goods, Machine operators assmblrs & inspctrs, White, Mexican (Mexicano), Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1108.95, Nonmover, Nonmover, Nonmover, Yes, Not in universe,2, Not in universe, Mexico, Mexico, Mexico, Foreign born- Not a citizen of U S ,0, Not in universe,2,52,94, - 50000. +180617,14, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,1932.0, ?, ?, ?, Not in universe under 1 year old, ?,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. +88587,3, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child under 18 of RP of unrel subfamily, Nonrelative of householder,4108.89, ?, ?, ?, Not in universe under 1 year old, ?,0, Mother only present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. +7041,45, Not in universe,0,0, Some college but no degree,0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, Black, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Joint both under 65, Midwest, Oklahoma, Spouse of householder, Spouse of householder,1443.81, MSA to MSA, Same county, Same county, No, No,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,94, - 50000. +139291,44, Private,44,41, 5th or 6th grade,0, Not in universe, Never married, Social services, Handlers equip cleaners etc , White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, South, Delaware, Secondary individual, Nonrelative of householder,982.19, NonMSA to nonMSA, Different county same state, Different county same state, No, No,5, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. +184023,49, Local government,42,30, High school graduate,0, Not in universe, Widowed, Medical except hospital, Other service, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Single, Not in universe, Not in universe, Nonfamily householder, Householder,993.85, Nonmover, Nonmover, Nonmover, Yes, Not in universe,4, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. +9438,69, Not in universe,0,0, High school graduate,0, Not in universe, Widowed, Not in universe or children, Not in universe, Black, All other, Female, Not in universe, Not in universe, Not in labor force,0,0,0, Single, Not in universe, Not in universe, Householder, Householder,2296.9, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,95, - 50000. +33628,65, Not in universe,0,0, High school graduate,0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Joint one under 65 & one 65+, Not in universe, Not in universe, Householder, Householder,2588.07, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,94, - 50000. +129715,43, Private,31,42, High school graduate,0, Not in universe, Married-civilian spouse present, Utilities and sanitary services, Handlers equip cleaners etc , White, All other, Male, Not in universe, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1036.94, ?, ?, ?, Not in universe under 1 year old, ?,3, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. +13495,19, Private,33,19, Some college but no degree,0, College or university, Never married, Retail trade, Sales, White, Puerto Rican, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Single, Not in universe, Not in universe, Child 18+ never marr Not in a subfamily, Child 18 or older,1243.04, Nonmover, Nonmover, Nonmover, Yes, Not in universe,2, Not in universe, United-States, ?, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. +50850,10, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, Asian or Pacific Islander, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,2245.99, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Both parents present, Philippines, Philippines, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. +138847,46, Private,34,25, Some college but no degree,0, Not in universe, Married-civilian spouse present, Finance insurance and real estate, Adm support including clerical, Black, All other, Male, Not in universe, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Householder, Householder,688.01, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. +150171,34, Private,33,19, Associates degree-academic program,0, Not in universe, Divorced, Retail trade, Sales, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Single, Not in universe, Not in universe, Nonfamily householder, Householder,2227.01, Nonmover, Nonmover, Nonmover, Yes, Not in universe,4, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. +156089,48, State government,40,23, High school graduate,0, Not in universe, Married-civilian spouse present, Entertainment, Adm support including clerical, White, All other, Female, Not in universe, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,607.6, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. +197936,19, Private,33,19, High school graduate,0, College or university, Never married, Retail trade, Sales, White, All other, Female, Not in universe, Not in universe, Full-time schedules,0,0,0, Single, Not in universe, Not in universe, Child 18+ never marr Not in a subfamily, Child 18 or older,2578.61, ?, ?, ?, Not in universe under 1 year old, ?,4, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. +78488,45, Local government,48,21, Bachelors degree(BA AB BS),0, Not in universe, Separated, Public administration, Adm support including clerical, Black, All other, Female, Yes, Not in universe, Full-time schedules,0,0,0, Single, Not in universe, Not in universe, Householder, Householder,1569.36, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. +44829,38, Private,33,16, High school graduate,0, Not in universe, Never married, Retail trade, Sales, White, All other, Female, Not in universe, Not in universe, Full-time schedules,0,0,268, Single, Not in universe, Not in universe, Child 18+ never marr Not in a subfamily, Child 18 or older,3254.97, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. +132454,41, Private,36,27, High school graduate,0, Not in universe, Married-civilian spouse present, Private household services, Private household services, White, Central or South American, Female, No, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,812.57, ?, ?, ?, Not in universe under 1 year old, ?,1, Not in universe, ?, ?, ?, Foreign born- Not a citizen of U S ,0, Not in universe,2,52,95, - 50000. +52840,71, Not in universe,0,0, 5th or 6th grade,0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, Black, All other, Male, Not in universe, Not in universe, Not in labor force,0,0,0, Joint both 65+, Not in universe, Not in universe, Householder, Householder,1823.75, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,95, - 50000. +121217,27, Federal government,29,25, Associates degree-occup /vocational,1575, Not in universe, Married-civilian spouse present, Transportation, Adm support including clerical, White, All other, Male, Yes, Not in universe, Children or Armed Forces,7298,0,0, Joint both under 65, Northeast, Michigan, Householder, Householder,1031.69, MSA to MSA, Same county, Same county, No, No,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. +198823,29, Not in universe,0,0, Bachelors degree(BA AB BS),0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, Asian or Pacific Islander, All other, Female, Not in universe, Not in universe, Not in labor force,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1205.55, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, India, India, India, Foreign born- Not a citizen of U S ,0, Not in universe,2,0,95, - 50000. +148775,36, Not in universe,0,0, High school graduate,0, Not in universe, Separated, Not in universe or children, Not in universe, White, Mexican (Mexicano), Female, Not in universe, Not in universe, Not in labor force,0,0,0, Single, Not in universe, Not in universe, Child 18+ ever marr Not in a subfamily, Child 18 or older,1307.46, ?, ?, ?, Not in universe under 1 year old, ?,3, Not in universe, Mexico, Mexico, United-States, Native- Born in the United States,0, Not in universe,2,45,95, - 50000. +1702,52, Self-employed-not incorporated,39,32, Bachelors degree(BA AB BS),0, Not in universe, Divorced, Personal services except private HH, Other service, White, All other, Female, Not in universe, Not in universe, Full-time schedules,0,0,2000, Single, Not in universe, Not in universe, Nonfamily householder, Householder,984.25, ?, ?, ?, Not in universe under 1 year old, ?,1, Not in universe, United-States, United-States, United-States, Native- Born in the United States,2, Not in universe,2,46,95, - 50000. +120926,2, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,2596.51, ?, ?, ?, Not in universe under 1 year old, ?,0, Mother only present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. +125722,40, Self-employed-not incorporated,33,2, Associates degree-occup /vocational,0, Not in universe, Married-civilian spouse present, Retail trade, Executive admin and managerial, White, All other, Male, Not in universe, Not in universe, Full-time schedules,0,0,0, Nonfiler, Not in universe, Not in universe, Spouse of householder, Spouse of householder,198.29, ?, ?, ?, Not in universe under 1 year old, ?,1, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. +110416,31, Private,45,12, Bachelors degree(BA AB BS),0, Not in universe, Married-civilian spouse present, Other professional services, Professional specialty, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,300, Joint both under 65, Not in universe, Not in universe, Householder, Householder,1920.41, Nonmover, Nonmover, Nonmover, Yes, Not in universe,4, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. +47866,5, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,2154.9, ?, ?, ?, Not in universe under 1 year old, ?,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. +35144,31, Not in universe,0,0, Associates degree-occup /vocational,0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Joint both under 65, Northeast, Connecticut, Householder, Householder,2491.83, MSA to MSA, Different county same state, Different county same state, No, No,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,94, - 50000. +167869,1, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, Asian or Pacific Islander, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,2046.83, ?, ?, ?, Not in universe under 1 year old, ?,0, Mother only present, Philippines, Philippines, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. +12432,32, Federal government,49,26, High school graduate,0, Not in universe, Married-civilian spouse present, Public administration, Adm support including clerical, White, Puerto Rican, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1020.27, Nonmover, Nonmover, Nonmover, Yes, Not in universe,3, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. +71994,35, Self-employed-not incorporated,37,10, Bachelors degree(BA AB BS),0, Not in universe, Married-civilian spouse present, Business and repair services, Professional specialty, White, All other, Male, Not in universe, Other job loser, Children or Armed Forces,0,0,0, Joint both under 65, Not in universe, Not in universe, Householder, Householder,1132.61, Nonmover, Nonmover, Nonmover, Yes, Not in universe,1, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,27,94, - 50000. +190244,34, Not in universe,0,0, Masters degree(MA MS MEng MEd MSW MBA),0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Joint both under 65, South, District of Columbia, Householder, Householder,2031.36, MSA to MSA, Different state same division, Different state in South, No, No,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. +1881,45, Private,33,16, Some college but no degree,0, Not in universe, Never married, Retail trade, Sales, White, Mexican-American, Female, Not in universe, Not in universe, Full-time schedules,0,0,0, Head of household, Not in universe, Not in universe, Householder, Householder,1537.21, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. +48449,40, Private,4,34, Some college but no degree,0, Not in universe, Married-civilian spouse present, Construction, Precision production craft & repair, White, All other, Male, Not in universe, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Householder, Householder,1631.75, ?, ?, ?, Not in universe under 1 year old, ?,4, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. +99405,59, Private,4,2, Some college but no degree,2100, Not in universe, Married-civilian spouse present, Construction, Executive admin and managerial, White, All other, Male, Yes, Not in universe, Full-time schedules,0,0,200, Joint both under 65, Not in universe, Not in universe, Householder, Householder,2477.26, ?, ?, ?, Not in universe under 1 year old, ?,1, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, 50000+. +71526,26, State government,43,12, Masters degree(MA MS MEng MEd MSW MBA),0, Not in universe, Married-civilian spouse present, Education, Professional specialty, White, All other, Female, Not in universe, Not in universe, PT for econ reasons usually PT,0,0,0, Joint both under 65, Not in universe, Not in universe, In group quarters, Householder,1108.83, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. +107493,14, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,1651.17, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. +142743,54, Federal government,45,4, Masters degree(MA MS MEng MEd MSW MBA),0, Not in universe, Married-civilian spouse present, Other professional services, Professional specialty, White, All other, Male, Not in universe, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Householder, Householder,1081.54, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, 50000+. +2258,30, Private,35,2, High school graduate,0, Not in universe, Divorced, Finance insurance and real estate, Executive admin and managerial, White, All other, Female, No, Not in universe, Children or Armed Forces,2354,0,0, Single, Not in universe, Not in universe, Nonfamily householder, Householder,2924.14, Nonmover, Nonmover, Nonmover, Yes, Not in universe,2, Not in universe, United-States, United-States, United-States, Native- Born in the United States,1, Not in universe,2,52,94, - 50000. +66048,68, Not in universe,0,0, Some college but no degree,0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Not in labor force,0,0,0, Joint both 65+, Not in universe, Not in universe, Spouse of householder, Spouse of householder,2467.44, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,95, - 50000. +174145,57, Local government,50,5, Bachelors degree(BA AB BS),0, Not in universe, Married-civilian spouse present, Public administration, Professional specialty, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,1902,0, Joint both under 65, Not in universe, Not in universe, Householder, Householder,1455.29, Nonmover, Nonmover, Nonmover, Yes, Not in universe,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. +7609,28, Private,43,44, Associates degree-occup /vocational,0, Not in universe, Separated, Education, Farming forestry and fishing, White, All other, Male, Not in universe, Not in universe, Full-time schedules,0,0,0, Single, Not in universe, Not in universe, Nonfamily householder, Householder,4173.77, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. +1906,33, Private,41,7, Prof school degree (MD DDS DVM LLB JD),0, Not in universe, Married-civilian spouse present, Hospital services, Professional specialty, White, Central or South American, Male, Not in universe, Not in universe, Children or Armed Forces,3103,0,0, Joint both under 65, Not in universe, Not in universe, Householder, Householder,2406.32, Nonmover, Nonmover, Nonmover, Yes, Not in universe,6, Not in universe, ?, ?, ?, Foreign born- Not a citizen of U S ,0, Not in universe,2,52,94, - 50000. +8197,51, Private,14,37, High school graduate,0, Not in universe, Married-civilian spouse present, Manufacturing-durable goods, Machine operators assmblrs & inspctrs, Black, All other, Male, Not in universe, Not in universe, Children or Armed Forces,3137,0,0, Joint both under 65, Not in universe, Not in universe, Householder, Householder,2659.34, Nonmover, Nonmover, Nonmover, Yes, Not in universe,2, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,42,94, - 50000. +7752,59, Private,9,36, High school graduate,0, Not in universe, Married-civilian spouse present, Manufacturing-durable goods, Machine operators assmblrs & inspctrs, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Joint both under 65, Not in universe, Not in universe, Householder, Householder,761.06, Nonmover, Nonmover, Nonmover, Yes, Not in universe,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. +74808,19, Private,40,28, Some college but no degree,0, College or university, Never married, Entertainment, Protective services, Asian or Pacific Islander, All other, Male, Not in universe, Not in universe, Full-time schedules,0,0,0, Single, Not in universe, Not in universe, Child 18+ never marr Not in a subfamily, Child 18 or older,1264.75, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,2, Not in universe,2,52,95, - 50000. +194746,64, Not in universe,0,0, High school graduate,0, Not in universe, Divorced, Not in universe or children, Not in universe, White, Other Spanish, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Single, Not in universe, Not in universe, Nonfamily householder, Householder,915.28, Nonmover, Nonmover, Nonmover, Yes, Not in universe,4, Not in universe, ?, United-States, United-States, Native- Born in the United States,0, Not in universe,2,4,94, - 50000. +156141,38, Private,41,8, Bachelors degree(BA AB BS),0, Not in universe, Married-civilian spouse present, Hospital services, Professional specialty, White, All other, Female, Not in universe, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,991.45, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,2, Not in universe,2,52,95, - 50000. +132259,41, Not in universe,0,0, High school graduate,0, Not in universe, Never married, Not in universe or children, Not in universe, Black, All other, Male, Not in universe, Not in universe, Not in labor force,0,0,0, Nonfiler, Not in universe, Not in universe, Child 18+ never marr Not in a subfamily, Child 18 or older,3270.26, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,95, - 50000. +90484,0, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, Black, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,2294.02, Not in universe, Not in universe, Not in universe, Not in universe under 1 year old, Not in universe,0, Both parents present, United-States, ?, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. +78109,9, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, Black, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,4408.46, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Mother only present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. +145093,60, Private,13,37, Some college but no degree,0, Not in universe, Married-spouse absent, Manufacturing-durable goods, Machine operators assmblrs & inspctrs, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,500, Single, Not in universe, Not in universe, Nonfamily householder, Householder,1392.3, Nonmover, Nonmover, Nonmover, Yes, Not in universe,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, 50000+. +108692,52, Not in universe,0,0, 11th grade,0, Not in universe, Divorced, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Not in labor force,0,0,0, Nonfiler, Not in universe, Not in universe, Householder, Householder,1476.96, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,95, - 50000. +155779,70, Not in universe,0,0, High school graduate,0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,67, Joint both 65+, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1385.67, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,94, - 50000. +38262,14, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, Puerto Rican, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Northeast, North Carolina, Child <18 never marr not in subfamily, Child under 18 never married,1153.13, MSA to MSA, Same county, Same county, No, No,0, Mother only present, Puerto-Rico, Puerto-Rico, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. +89021,30, Not in universe,0,0, High school graduate,0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Joint both under 65, West, California, Spouse of householder, Spouse of householder,463.68, MSA to nonMSA, Different division same region, Different state in West, No, No,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,94, - 50000. +177664,74, Not in universe,0,0, Bachelors degree(BA AB BS),0, Not in universe, Widowed, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,4882, Single, Northeast, ?, Nonfamily householder, Householder,1591.41, MSA to MSA, Different county same state, Different county same state, No, No,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,94, - 50000. +188163,10, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,776.08, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Both parents present, ?, ?, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. +125830,46, Local government,43,10, Bachelors degree(BA AB BS),0, Not in universe, Married-civilian spouse present, Education, Professional specialty, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,3103,0,100, Joint both under 65, Not in universe, Not in universe, Householder, Householder,1006.86, Nonmover, Nonmover, Nonmover, Yes, Not in universe,3, Not in universe, United-States, United-States, United-States, Native- Born in the United States,1, Not in universe,2,52,94, - 50000. +78253,26, Federal government,29,25, High school graduate,0, Not in universe, Never married, Transportation, Adm support including clerical, Asian or Pacific Islander, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,1000, Single, Not in universe, Not in universe, Nonfamily householder, Householder,915.75, Nonmover, Nonmover, Nonmover, Yes, Not in universe,6, Not in universe, ?, ?, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. +171521,25, Private,31,37, Some college but no degree,0, Not in universe, Never married, Utilities and sanitary services, Machine operators assmblrs & inspctrs, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Single, Midwest, Kentucky, Nonfamily householder, Householder,1417.25, MSA to MSA, Same county, Same county, No, No,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. +122703,30, Private,45,31, 5th or 6th grade,0, Not in universe, Married-civilian spouse present, Other professional services, Other service, White, Mexican (Mexicano), Male, Not in universe, Not in universe, Full-time schedules,2885,0,0, Joint both under 65, Not in universe, Not in universe, Householder, Householder,1207.48, ?, ?, ?, Not in universe under 1 year old, ?,2, Not in universe, Mexico, Mexico, Mexico, Foreign born- Not a citizen of U S ,0, Not in universe,2,52,95, - 50000. +57986,62, State government,41,36, High school graduate,0, Not in universe, Married-civilian spouse present, Hospital services, Machine operators assmblrs & inspctrs, White, All other, Female, No, Not in universe, Full-time schedules,0,0,0, Joint one under 65 & one 65+, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1252.17, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. +100807,58, Not in universe,0,0, Some college but no degree,0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Not in labor force,0,0,330, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1550.66, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,95, - 50000. +199197,39, Not in universe,0,0, Bachelors degree(BA AB BS),0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Not in labor force,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,3802.81, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, ?, ?, ?, Foreign born- Not a citizen of U S ,0, Not in universe,2,0,95, - 50000. +44919,55, Private,33,16, High school graduate,1400, Not in universe, Married-civilian spouse present, Retail trade, Sales, White, All other, Female, No, Not in universe, Children or Armed Forces,0,0,100, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,2392.55, Nonmover, Nonmover, Nonmover, Yes, Not in universe,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. +48655,74, Not in universe,0,0, Some college but no degree,0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Spouse of householder, Spouse of householder,2367.66, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,94, - 50000. +37451,76, Not in universe,0,0, High school graduate,0, Not in universe, Widowed, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Not in labor force,0,0,0, Nonfiler, Not in universe, Not in universe, Householder, Householder,1551.72, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,95, - 50000. +9376,39, Private,37,3, Some college but no degree,0, Not in universe, Never married, Business and repair services, Executive admin and managerial, White, Puerto Rican, Female, Not in universe, Not in universe, Full-time schedules,0,0,0, Head of household, Not in universe, Not in universe, Householder, Householder,774.83, ?, ?, ?, Not in universe under 1 year old, ?,2, Not in universe, Puerto-Rico, Puerto-Rico, Puerto-Rico, Native- Born in Puerto Rico or U S Outlying,0, Not in universe,2,52,95, - 50000. +176075,71, Not in universe,0,0, 9th grade,0, Not in universe, Divorced, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Nonfamily householder, Householder,609.05, Nonmover, Nonmover, Nonmover, Yes, Not in universe,1, Not in universe, United-States, United-States, United-States, Native- Born in the United States,2, Not in universe,2,20,94, - 50000. +40950,37, Private,42,2, Associates degree-academic program,0, Not in universe, Married-civilian spouse present, Medical except hospital, Executive admin and managerial, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,4000, Joint both under 65, Midwest, Mississippi, Spouse of householder, Spouse of householder,1532.26, MSA to nonMSA, Different region, Different state in Midwest, No, No,4, Not in universe, United-States, United-States, United-States, Native- Born in the United States,1, Not in universe,2,52,94, - 50000. +187455,31, Private,33,19, 11th grade,0, Not in universe, Married-spouse absent, Retail trade, Sales, Asian or Pacific Islander, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Single, Not in universe, Not in universe, Child 18+ ever marr Not in a subfamily, Child 18 or older,1366.06, Nonmover, Nonmover, Nonmover, Yes, Not in universe,4, Not in universe, India, India, India, Foreign born- Not a citizen of U S ,0, Not in universe,2,52,94, - 50000. +94473,0, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, Black, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,558.42, Not in universe, Not in universe, Not in universe, Not in universe under 1 year old, Not in universe,0, Mother only present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. +177027,77, Not in universe,0,0, High school graduate,0, Not in universe, Divorced, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Not in labor force,0,0,0, Nonfiler, Not in universe, Not in universe, Nonfamily householder, Householder,3316.65, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, ?, ?, United-States, Native- Born in the United States,0, Not in universe,2,0,95, - 50000. +98120,76, Private,21,31, 7th and 8th grade,0, Not in universe, Married-civilian spouse present, Manufacturing-nondurable goods, Other service, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Joint both 65+, Not in universe, Not in universe, Householder, Householder,785.0, Nonmover, Nonmover, Nonmover, Yes, Not in universe,6, Not in universe, Canada, Canada, United-States, Native- Born in the United States,0, No,1,52,94, - 50000. +179503,34, Private,25,37, High school graduate,0, Not in universe, Married-civilian spouse present, Manufacturing-nondurable goods, Machine operators assmblrs & inspctrs, White, All other, Female, Not in universe, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1515.34, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, 50000+. diff --git a/examples/run_classification_criteo.py b/examples/run_classification_criteo.py index 881fdfbb..67fb3d9a 100644 --- a/examples/run_classification_criteo.py +++ b/examples/run_classification_criteo.py @@ -27,7 +27,7 @@ # 2.count #unique features for each sparse field,and record dense feature field name - fixlen_feature_columns = [SparseFeat(feat, data[feat].nunique()) + fixlen_feature_columns = [SparseFeat(feat, vocabulary_size=data[feat].max() + 1, embedding_dim=4) for feat in sparse_features] + [DenseFeat(feat, 1, ) for feat in dense_features] diff --git a/examples/run_mtl.py b/examples/run_mtl.py new file mode 100644 index 00000000..220e63c3 --- /dev/null +++ b/examples/run_mtl.py @@ -0,0 +1,76 @@ +# -*- coding: utf-8 -*- +import pandas as pd +import torch +from sklearn.metrics import roc_auc_score +from sklearn.model_selection import train_test_split +from sklearn.preprocessing import LabelEncoder, MinMaxScaler + +from deepctr_torch.inputs import SparseFeat, DenseFeat, get_feature_names +from deepctr_torch.models import MMOE + +if __name__ == "__main__": + column_names = ['age', 'class_worker', 'det_ind_code', 'det_occ_code', 'education', 'wage_per_hour', 'hs_college', + 'marital_stat', 'major_ind_code', 'major_occ_code', 'race', 'hisp_origin', 'sex', 'union_member', + 'unemp_reason', 'full_or_part_emp', 'capital_gains', 'capital_losses', 'stock_dividends', + 'tax_filer_stat', 'region_prev_res', 'state_prev_res', 'det_hh_fam_stat', 'det_hh_summ', + 'instance_weight', 'mig_chg_msa', 'mig_chg_reg', 'mig_move_reg', 'mig_same', 'mig_prev_sunbelt', + 'num_emp', 'fam_under_18', 'country_father', 'country_mother', 'country_self', 'citizenship', + 'own_or_self', 'vet_question', 'vet_benefits', 'weeks_worked', 'year', 'income_50k'] + data = pd.read_csv('./census-income.sample', header=None, names=column_names) + + data['label_income'] = data['income_50k'].map({' - 50000.': 0, ' 50000+.': 1}) + data['label_marital'] = data['marital_stat'].apply(lambda x: 1 if x == ' Never married' else 0) + data.drop(labels=['income_50k', 'marital_stat'], axis=1, inplace=True) + + columns = data.columns.values.tolist() + sparse_features = ['class_worker', 'det_ind_code', 'det_occ_code', 'education', 'hs_college', 'major_ind_code', + 'major_occ_code', 'race', 'hisp_origin', 'sex', 'union_member', 'unemp_reason', + 'full_or_part_emp', 'tax_filer_stat', 'region_prev_res', 'state_prev_res', 'det_hh_fam_stat', + 'det_hh_summ', 'mig_chg_msa', 'mig_chg_reg', 'mig_move_reg', 'mig_same', 'mig_prev_sunbelt', + 'fam_under_18', 'country_father', 'country_mother', 'country_self', 'citizenship', + 'vet_question'] + dense_features = [col for col in columns if + col not in sparse_features and col not in ['label_income', 'label_marital']] + + data[sparse_features] = data[sparse_features].fillna('-1', ) + data[dense_features] = data[dense_features].fillna(0, ) + mms = MinMaxScaler(feature_range=(0, 1)) + data[dense_features] = mms.fit_transform(data[dense_features]) + + for feat in sparse_features: + lbe = LabelEncoder() + data[feat] = lbe.fit_transform(data[feat]) + + fixlen_feature_columns = [SparseFeat(feat, vocabulary_size=data[feat].max() + 1, embedding_dim=4) + for feat in sparse_features] + [DenseFeat(feat, 1, ) for feat in dense_features] + + dnn_feature_columns = fixlen_feature_columns + linear_feature_columns = fixlen_feature_columns + + feature_names = get_feature_names(linear_feature_columns + dnn_feature_columns) + + # 3.generate input data for model + + train, test = train_test_split(data, test_size=0.2, random_state=2020) + train_model_input = {name: train[name] for name in feature_names} + test_model_input = {name: test[name] for name in feature_names} + + # 4.Define Model,train,predict and evaluate + + device = 'cpu' + use_cuda = True + if use_cuda and torch.cuda.is_available(): + print('cuda ready...') + device = 'cuda:0' + + model = MMOE(dnn_feature_columns, tower_dnn_hidden_units=[], task_types=['binary', 'binary'], + task_names=['label_income', 'label_marital']) + model.compile("adam", loss=["binary_crossentropy", "binary_crossentropy"], + metrics=['binary_crossentropy'], ) + + history = model.fit(train_model_input, [train['label_income'].values, train['label_marital'].values], + batch_size=256, epochs=10, verbose=2, validation_split=0.2) + pred_ans = model.predict(test_model_input, batch_size=256) + + print("test income AUC", round(roc_auc_score(test['label_income'], pred_ans[0]), 4)) + print("test marital AUC", round(roc_auc_score(test['label_marital'], pred_ans[1]), 4)) From 5267cf84d63dad0240edabc907eb5add2364fe47 Mon Sep 17 00:00:00 2001 From: zanshuxun <631763140@qq.com> Date: Sun, 26 Jun 2022 18:47:54 +0800 Subject: [PATCH 02/47] inplace operation --- deepctr_torch/models/basemodel.py | 30 ++-- deepctr_torch/models/multitask/__init__.py | 6 +- deepctr_torch/models/multitask/mmoe.py | 153 ++++++++++----------- examples/run_mtl.py | 9 +- 4 files changed, 97 insertions(+), 101 deletions(-) diff --git a/deepctr_torch/models/basemodel.py b/deepctr_torch/models/basemodel.py index 17e57b90..d3dccc6a 100644 --- a/deepctr_torch/models/basemodel.py +++ b/deepctr_torch/models/basemodel.py @@ -195,7 +195,7 @@ def fit(self, x=None, y=None, batch_size=None, epochs=1, verbose=1, initial_epoc train_tensor_data = Data.TensorDataset( torch.from_numpy( np.concatenate(x, axis=-1)), - torch.from_numpy(y)) + torch.from_numpy(np.array(y))) if batch_size is None: batch_size = 256 @@ -245,7 +245,11 @@ def fit(self, x=None, y=None, batch_size=None, epochs=1, verbose=1, initial_epoc y_pred = model(x).squeeze() optim.zero_grad() - loss = loss_func(y_pred, y.squeeze(), reduction='sum') + if isinstance(loss_func, list): + loss = loss_func[0](y_pred.mean(1), y.squeeze()[:, 0], reduction='sum') + # loss = sum([loss_func[i](y_pred[:, i], y[:, i], reduction='sum') for i in range(self.num_tasks)]) + else: + loss = loss_func(y_pred, y.squeeze(), reduction='sum') reg_loss = self.get_regularization_loss() total_loss = loss + reg_loss + self.aux_loss @@ -456,18 +460,24 @@ def _get_optim(self, optimizer): def _get_loss_func(self, loss): if isinstance(loss, str): - if loss == "binary_crossentropy": - loss_func = F.binary_cross_entropy - elif loss == "mse": - loss_func = F.mse_loss - elif loss == "mae": - loss_func = F.l1_loss - else: - raise NotImplementedError + loss_func = self._get_loss_func_single(loss) + elif isinstance(loss, list): + loss_func = [self._get_loss_func_single(loss_single) for loss_single in loss] else: loss_func = loss return loss_func + def _get_loss_func_single(self, loss): + if loss == "binary_crossentropy": + loss_func = F.binary_cross_entropy + elif loss == "mse": + loss_func = F.mse_loss + elif loss == "mae": + loss_func = F.l1_loss + else: + raise NotImplementedError + return loss_func + def _log_loss(self, y_true, y_pred, eps=1e-7, normalize=True, sample_weight=None, labels=None): # change eps to improve calculation accuracy return log_loss(y_true, diff --git a/deepctr_torch/models/multitask/__init__.py b/deepctr_torch/models/multitask/__init__.py index a62e8d6f..788aca41 100644 --- a/deepctr_torch/models/multitask/__init__.py +++ b/deepctr_torch/models/multitask/__init__.py @@ -1,4 +1,4 @@ -from .esmm import ESMM +# from .esmm import ESMM from .mmoe import MMOE -from .ple import PLE -from .sharedbottom import SharedBottom \ No newline at end of file +# from .ple import PLE +# from .sharedbottom import SharedBottom \ No newline at end of file diff --git a/deepctr_torch/models/multitask/mmoe.py b/deepctr_torch/models/multitask/mmoe.py index 681aa6ee..88de383b 100644 --- a/deepctr_torch/models/multitask/mmoe.py +++ b/deepctr_torch/models/multitask/mmoe.py @@ -9,114 +9,99 @@ import torch import torch.nn as nn -from .basemodel import BaseModel -from .h.inputs import combined_dnn_input -from .h.layers import DNN, PredictionLayer - - -class MMOELayer(nn.Module): - """ - The Multi-gate Mixture-of-Experts layer in MMOE model - Input shape - - 2D tensor with shape: ``(batch_size,units)``. - - Output shape - - A list with **num_tasks** elements, which is a 2D tensor with shape: ``(batch_size, output_dim)`` . - - Arguments - - **input_dim** : Positive integer, dimensionality of input features. - - **num_tasks**: integer, the number of tasks, equal to the number of outputs. - - **num_experts**: integer, the number of experts. - - **output_dim**: integer, the dimension of each output of MMOELayer. - - References - - [Jiaqi Ma, Zhe Zhao, Xinyang Yi, et al. Modeling Task Relationships in Multi-task Learning with Multi-gate Mixture-of-Experts[C]](https://dl.acm.org/doi/10.1145/3219819.3220007) - """ - - def __init__(self, input_dim, num_tasks, num_experts, output_dim): - super(MMOELayer, self).__init__() - self.input_dim = input_dim - self.num_experts = num_experts - self.num_tasks = num_tasks - self.output_dim = output_dim - self.expert_network = nn.Linear(self.input_dim, self.num_experts * self.output_dim, bias=True) - self.gating_networks = nn.ModuleList( - [nn.Linear(self.input_dim, self.num_experts, bias=False) for _ in range(self.num_tasks)]) - - def forward(self, inputs): - outputs = [] - expert_out = self.expert_network(inputs) - expert_out = expert_out.reshape([-1, self.output_dim, self.num_experts]) - for i in range(self.num_tasks): - gate_out = self.gating_networks[i](inputs) - gate_out = gate_out.softmax(1).unsqueeze(-1) - output = torch.bmm(expert_out, gate_out).squeeze() - outputs.append(output) - return outputs +from ..basemodel import BaseModel +from ...inputs import combined_dnn_input +from ...layers import DNN, PredictionLayer class MMOE(BaseModel): """Instantiates the Multi-gate Mixture-of-Experts architecture. :param dnn_feature_columns: An iterable containing all the features used by deep part of the model. - :param num_tasks: integer, number of tasks, equal to number of outputs, must be greater than 1. - :param tasks: list of str, indicating the loss of each tasks, ``"binary"`` for binary logloss, ``"regression"`` for regression loss. e.g. ['binary', 'regression'] :param num_experts: integer, number of experts. - :param expert_dim: integer, the hidden units of each expert. - :param dnn_hidden_units: list,list of positive integer or empty list, the layer number and units in each layer of shared-bottom DNN + :param expert_dnn_hidden_units: list, list of positive integer or empty list, the layer number and units in each layer of expert DNN. + :param gate_dnn_hidden_units: list, list of positive integer or empty list, the layer number and units in each layer of gate DNN. + :param tower_dnn_hidden_units: list, list of positive integer or empty list, the layer number and units in each layer of task-specific DNN. :param l2_reg_embedding: float. L2 regularizer strength applied to embedding vector :param l2_reg_dnn: float. L2 regularizer strength applied to DNN :param init_std: float,to use as the initialize std of embedding vector - :param task_dnn_units: list,list of positive integer or empty list, the layer number and units in each layer of task-specific DNN - :param seed: integer ,to use as random seed. + :param seed: integer, to use as random seed. :param dnn_dropout: float in [0,1), the probability we will drop out a given DNN coordinate. :param dnn_activation: Activation function to use in DNN :param dnn_use_bn: bool. Whether use BatchNormalization before activation or not in DNN + :param task_types: list of str, indicating the loss of each tasks, ``"binary"`` for binary logloss, ``"regression"`` for regression loss. e.g. ['binary', 'regression'] + :param task_names: list of str, indicating the predict target of each tasks :param device: str, ``"cpu"`` or ``"cuda:0"`` :return: A PyTorch model instance. """ - def __init__(self, dnn_feature_columns, num_tasks, tasks, num_experts=4, expert_dim=8, dnn_hidden_units=(128, 128), - l2_reg_embedding=1e-5, l2_reg_dnn=0, init_std=0.0001, task_dnn_units=None, seed=1024, dnn_dropout=0, - dnn_activation='relu', dnn_use_bn=False, device='cpu'): + def __init__(self, dnn_feature_columns, num_experts=3, expert_dnn_hidden_units=(64, 32), + gate_dnn_hidden_units=(), tower_dnn_hidden_units=(64,), l2_reg_embedding=0.00001, l2_reg_dnn=0, + init_std=0.0001, seed=1024, dnn_dropout=0, dnn_activation='relu', dnn_use_bn=False, + task_types=('binary', 'binary'), task_names=('ctr', 'ctcvr'), device='cpu'): super(MMOE, self).__init__(linear_feature_columns=[], dnn_feature_columns=dnn_feature_columns, l2_reg_embedding=l2_reg_embedding, seed=seed, device=device) - if num_tasks <= 1: + self.num_tasks = len(task_names) + if self.num_tasks <= 1: raise ValueError("num_tasks must be greater than 1") - if len(tasks) != num_tasks: - raise ValueError("num_tasks must be equal to the length of tasks") - for task in tasks: - if task not in ['binary', 'regression']: - raise ValueError("task must be binary or regression, {} is illegal".format(task)) - - self.tasks = tasks - self.task_dnn_units = task_dnn_units - self.dnn = DNN(self.compute_input_dim(dnn_feature_columns), dnn_hidden_units, - activation=dnn_activation, l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, - init_std=init_std, device=device) - self.mmoe_layer = MMOELayer(dnn_hidden_units[-1], num_tasks, num_experts, expert_dim) - if task_dnn_units is not None: - # the last layer of task_dnn should be expert_dim - self.task_dnn = nn.ModuleList([DNN(expert_dim, task_dnn_units+(expert_dim,)) for _ in range(num_tasks)]) - self.tower_network = nn.ModuleList([nn.Linear(expert_dim, 1, bias=False) for _ in range(num_tasks)]) - self.out = nn.ModuleList([PredictionLayer(task) for task in self.tasks]) + if num_experts <= 1: + raise ValueError("num_experts must be greater than 1") + + if len(task_types) != self.num_tasks: + raise ValueError("num_tasks must be equal to the length of task_types") + + for task_type in task_types: + if task_type not in ['binary', 'regression']: + raise ValueError("task must be binary or regression, {} is illegal".format(task_type)) + + self.num_experts = num_experts + self.task_names = task_names + self.input_dim = self.compute_input_dim(dnn_feature_columns) + self.expert_dnn_hidden_units = expert_dnn_hidden_units + self.gate_dnn_hidden_units = gate_dnn_hidden_units + self.tower_dnn_hidden_units = tower_dnn_hidden_units + + self.expert_dnn = nn.ModuleList([DNN(self.input_dim, expert_dnn_hidden_units, + activation=dnn_activation, l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, + use_bn=dnn_use_bn, + init_std=init_std, device=device) for _ in range(self.num_experts)]) + self.gate_dnn = nn.ModuleList( + [nn.Linear(self.input_dim, self.num_experts, bias=False) for _ in range(self.num_tasks)]) + if len(tower_dnn_hidden_units) > 0: + self.tower_dnn = nn.ModuleList( + [DNN(expert_dnn_hidden_units[-1], tower_dnn_hidden_units + [1]) for _ in range(self.num_tasks)]) + else: + # self.tower_dnn = nn.ModuleList([DNN(expert_dnn_hidden_units[-1], [1], activation='prelu') for _ in range(self.num_tasks)]) + self.tower_dnn = nn.ModuleList([DNN(expert_dnn_hidden_units[-1], [1]) for _ in range(self.num_tasks)]) + + self.out = nn.ModuleList([PredictionLayer(task) for task in task_types]) self.to(device) def forward(self, X): sparse_embedding_list, dense_value_list = self.input_from_feature_columns(X, self.dnn_feature_columns, self.embedding_dict) dnn_input = combined_dnn_input(sparse_embedding_list, dense_value_list) - dnn_output = self.dnn(dnn_input) - mmoe_outs = self.mmoe_layer(dnn_output) - if self.task_dnn_units is not None: - mmoe_outs = [self.task_dnn[i](mmoe_out) for i, mmoe_out in enumerate(mmoe_outs)] - - task_outputs = [] - for i, mmoe_out in enumerate(mmoe_outs): - logit = self.tower_network[i](mmoe_out) - output = self.out[i](logit) - task_outputs.append(output) - - task_outputs = torch.cat(task_outputs, -1) - return task_outputs + + # expert dnn + expert_outs = [] + for i in range(self.num_experts): + expert_out = self.expert_dnn[i](dnn_input) + expert_outs.append(expert_out) + expert_outs = torch.stack(expert_outs, 1) # (bs, num_experts, dim) + + # gate dnn + mmoe_outs = [] + for i in range(self.num_tasks): + gate_out = self.gate_dnn[i](dnn_input).softmax(1) + gate_mul_expert = torch.matmul(gate_out.unsqueeze(1), expert_outs) + mmoe_outs.append(gate_mul_expert.squeeze()) + + # tower dnn (task-specified) + task_outs = [] + for i in range(self.num_tasks): + tower_logit = self.tower_dnn[i](mmoe_outs[i]) + output = self.out[i](tower_logit) + task_outs.append(output) + task_outs = torch.cat(task_outs, -1) + return task_outs diff --git a/examples/run_mtl.py b/examples/run_mtl.py index 220e63c3..d330d12d 100644 --- a/examples/run_mtl.py +++ b/examples/run_mtl.py @@ -21,6 +21,7 @@ data['label_income'] = data['income_50k'].map({' - 50000.': 0, ' 50000+.': 1}) data['label_marital'] = data['marital_stat'].apply(lambda x: 1 if x == ' Never married' else 0) data.drop(labels=['income_50k', 'marital_stat'], axis=1, inplace=True) + target = ["label_income", "label_marital"] columns = data.columns.values.tolist() sparse_features = ['class_worker', 'det_ind_code', 'det_occ_code', 'education', 'hs_college', 'major_ind_code', @@ -30,7 +31,7 @@ 'fam_under_18', 'country_father', 'country_mother', 'country_self', 'citizenship', 'vet_question'] dense_features = [col for col in columns if - col not in sparse_features and col not in ['label_income', 'label_marital']] + col not in sparse_features and col not in target] data[sparse_features] = data[sparse_features].fillna('-1', ) data[dense_features] = data[dense_features].fillna(0, ) @@ -56,7 +57,7 @@ test_model_input = {name: test[name] for name in feature_names} # 4.Define Model,train,predict and evaluate - + torch.autograd.set_detect_anomaly(True) device = 'cpu' use_cuda = True if use_cuda and torch.cuda.is_available(): @@ -64,11 +65,11 @@ device = 'cuda:0' model = MMOE(dnn_feature_columns, tower_dnn_hidden_units=[], task_types=['binary', 'binary'], - task_names=['label_income', 'label_marital']) + task_names=target) model.compile("adam", loss=["binary_crossentropy", "binary_crossentropy"], metrics=['binary_crossentropy'], ) - history = model.fit(train_model_input, [train['label_income'].values, train['label_marital'].values], + history = model.fit(train_model_input, train[target].values, batch_size=256, epochs=10, verbose=2, validation_split=0.2) pred_ans = model.predict(test_model_input, batch_size=256) From 25cf51679531d4b640abe9dfcfb50ec8f455f27a Mon Sep 17 00:00:00 2001 From: zanshuxun <631763140@qq.com> Date: Sun, 26 Jun 2022 20:48:18 +0800 Subject: [PATCH 03/47] 1 --- deepctr_torch/models/multitask/mmoe.py | 14 +++--- examples/run_mtl.py | 20 ++++---- examples/run_mtl_criteo.py | 65 ++++++++++++++++++++++++++ 3 files changed, 84 insertions(+), 15 deletions(-) create mode 100644 examples/run_mtl_criteo.py diff --git a/deepctr_torch/models/multitask/mmoe.py b/deepctr_torch/models/multitask/mmoe.py index 88de383b..0d93a49f 100644 --- a/deepctr_torch/models/multitask/mmoe.py +++ b/deepctr_torch/models/multitask/mmoe.py @@ -62,18 +62,20 @@ def __init__(self, dnn_feature_columns, num_experts=3, expert_dnn_hidden_units=( self.gate_dnn_hidden_units = gate_dnn_hidden_units self.tower_dnn_hidden_units = tower_dnn_hidden_units - self.expert_dnn = nn.ModuleList([DNN(self.input_dim, expert_dnn_hidden_units, - activation=dnn_activation, l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, - use_bn=dnn_use_bn, + self.expert_dnn = nn.ModuleList([DNN(self.input_dim, expert_dnn_hidden_units, activation=dnn_activation, + l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, init_std=init_std, device=device) for _ in range(self.num_experts)]) self.gate_dnn = nn.ModuleList( [nn.Linear(self.input_dim, self.num_experts, bias=False) for _ in range(self.num_tasks)]) if len(tower_dnn_hidden_units) > 0: self.tower_dnn = nn.ModuleList( - [DNN(expert_dnn_hidden_units[-1], tower_dnn_hidden_units + [1]) for _ in range(self.num_tasks)]) + [DNN(expert_dnn_hidden_units[-1], tower_dnn_hidden_units + [1], activation=dnn_activation, + l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, + init_std=init_std, device=device) for _ in range(self.num_tasks)]) else: - # self.tower_dnn = nn.ModuleList([DNN(expert_dnn_hidden_units[-1], [1], activation='prelu') for _ in range(self.num_tasks)]) - self.tower_dnn = nn.ModuleList([DNN(expert_dnn_hidden_units[-1], [1]) for _ in range(self.num_tasks)]) + self.tower_dnn = nn.ModuleList([DNN(expert_dnn_hidden_units[-1], [1], activation=dnn_activation, + l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, + init_std=init_std, device=device) for _ in range(self.num_tasks)]) self.out = nn.ModuleList([PredictionLayer(task) for task in task_types]) self.to(device) diff --git a/examples/run_mtl.py b/examples/run_mtl.py index d330d12d..dc3691a7 100644 --- a/examples/run_mtl.py +++ b/examples/run_mtl.py @@ -30,20 +30,21 @@ 'det_hh_summ', 'mig_chg_msa', 'mig_chg_reg', 'mig_move_reg', 'mig_same', 'mig_prev_sunbelt', 'fam_under_18', 'country_father', 'country_mother', 'country_self', 'citizenship', 'vet_question'] - dense_features = [col for col in columns if - col not in sparse_features and col not in target] - - data[sparse_features] = data[sparse_features].fillna('-1', ) - data[dense_features] = data[dense_features].fillna(0, ) - mms = MinMaxScaler(feature_range=(0, 1)) - data[dense_features] = mms.fit_transform(data[dense_features]) + sparse_features = ['age'] + # dense_features = [col for col in columns if + # col not in sparse_features and col not in target] + # + # data[sparse_features] = data[sparse_features].fillna('-1', ) + # data[dense_features] = data[dense_features].fillna(0, ) + # mms = MinMaxScaler(feature_range=(0, 1)) + # data[dense_features] = mms.fit_transform(data[dense_features]) for feat in sparse_features: lbe = LabelEncoder() data[feat] = lbe.fit_transform(data[feat]) fixlen_feature_columns = [SparseFeat(feat, vocabulary_size=data[feat].max() + 1, embedding_dim=4) - for feat in sparse_features] + [DenseFeat(feat, 1, ) for feat in dense_features] + for feat in sparse_features] #+ [DenseFeat(feat, 1, ) for feat in dense_features] dnn_feature_columns = fixlen_feature_columns linear_feature_columns = fixlen_feature_columns @@ -70,8 +71,9 @@ metrics=['binary_crossentropy'], ) history = model.fit(train_model_input, train[target].values, - batch_size=256, epochs=10, verbose=2, validation_split=0.2) + batch_size=4, epochs=10, verbose=2) pred_ans = model.predict(test_model_input, batch_size=256) print("test income AUC", round(roc_auc_score(test['label_income'], pred_ans[0]), 4)) print("test marital AUC", round(roc_auc_score(test['label_marital'], pred_ans[1]), 4)) + print(pred_ans) diff --git a/examples/run_mtl_criteo.py b/examples/run_mtl_criteo.py new file mode 100644 index 00000000..9534485a --- /dev/null +++ b/examples/run_mtl_criteo.py @@ -0,0 +1,65 @@ +# -*- coding: utf-8 -*- +import pandas as pd +import torch +from sklearn.metrics import log_loss, roc_auc_score +from sklearn.model_selection import train_test_split +from sklearn.preprocessing import LabelEncoder, MinMaxScaler + +from deepctr_torch.inputs import SparseFeat, DenseFeat, get_feature_names +from deepctr_torch.models import * + +if __name__ == "__main__": + data = pd.read_csv('./criteo_sample.txt') + + sparse_features = ['C' + str(i) for i in range(1, 27)] + dense_features = ['I' + str(i) for i in range(1, 14)] + + data[sparse_features] = data[sparse_features].fillna('-1', ) + data[dense_features] = data[dense_features].fillna(0, ) + target = ['label','label'] + + # 1.Label Encoding for sparse features,and do simple Transformation for dense features + for feat in sparse_features: + lbe = LabelEncoder() + data[feat] = lbe.fit_transform(data[feat]) + mms = MinMaxScaler(feature_range=(0, 1)) + data[dense_features] = mms.fit_transform(data[dense_features]) + + # 2.count #unique features for each sparse field,and record dense feature field name + + fixlen_feature_columns = [SparseFeat(feat, vocabulary_size=data[feat].max() + 10000, embedding_dim=4) + for feat in sparse_features] + [DenseFeat(feat, 1, ) + for feat in dense_features] + + dnn_feature_columns = fixlen_feature_columns + linear_feature_columns = fixlen_feature_columns + + feature_names = get_feature_names( + linear_feature_columns + dnn_feature_columns) + + # 3.generate input data for model + + train, test = train_test_split(data, test_size=0.2, random_state=2020) + train_model_input = {name: train[name] for name in feature_names} + test_model_input = {name: test[name] for name in feature_names} + + # 4.Define Model,train,predict and evaluate + torch.autograd.set_detect_anomaly(True) + device = 'cpu' + use_cuda = True + if use_cuda and torch.cuda.is_available(): + print('cuda ready...') + device = 'cuda:0' + + model = MMOE(dnn_feature_columns, tower_dnn_hidden_units=[], task_types=['binary', 'binary'], + task_names=target,init_std=1) + model.compile("adam", loss=["binary_crossentropy", "binary_crossentropy"], + metrics=['binary_crossentropy'], ) + + history = model.fit(train_model_input, train[target].values, batch_size=32, epochs=10, verbose=2, + validation_split=0.2) + pred_ans = model.predict(test_model_input, 256) + print("") + print("test LogLoss", round(log_loss(test[target].values, pred_ans), 4)) + print("test AUC", round(roc_auc_score(test[target].values, pred_ans), 4)) + print(pred_ans) From 567576a9b5820514ec21d072b7d8304ee00e9b81 Mon Sep 17 00:00:00 2001 From: zanshuxun <631763140@qq.com> Date: Sun, 26 Jun 2022 21:25:29 +0800 Subject: [PATCH 04/47] 1 --- deepctr_torch/models/__init__.py | 2 +- deepctr_torch/models/basemodel.py | 1 + deepctr_torch/models/multitask/__init__.py | 4 +- deepctr_torch/models/multitask/mmoe.py | 14 +-- .../models/multitask/sharedbottom.py | 89 +++++++++++++++++++ .../models/multitask/sharedbottom1.py | 80 +++++++++++++++++ examples/run_mtl_criteo.py | 6 +- examples/run_mtl_criteo1.py | 70 +++++++++++++++ 8 files changed, 255 insertions(+), 11 deletions(-) create mode 100644 deepctr_torch/models/multitask/sharedbottom.py create mode 100644 deepctr_torch/models/multitask/sharedbottom1.py create mode 100644 examples/run_mtl_criteo1.py diff --git a/deepctr_torch/models/__init__.py b/deepctr_torch/models/__init__.py index 3204f8a5..f10ce7d6 100644 --- a/deepctr_torch/models/__init__.py +++ b/deepctr_torch/models/__init__.py @@ -16,5 +16,5 @@ from .dien import DIEN from .din import DIN from .afn import AFN -from .multitask import MMOE +from .multitask import SharedBottom, SharedBottom1, MMOE # from .multitask import SharedBottom, ESMM, MMOE, PLE \ No newline at end of file diff --git a/deepctr_torch/models/basemodel.py b/deepctr_torch/models/basemodel.py index d3dccc6a..b00156c6 100644 --- a/deepctr_torch/models/basemodel.py +++ b/deepctr_torch/models/basemodel.py @@ -245,6 +245,7 @@ def fit(self, x=None, y=None, batch_size=None, epochs=1, verbose=1, initial_epoc y_pred = model(x).squeeze() optim.zero_grad() + # loss = loss_func(y_pred, y.squeeze(), reduction='sum') if isinstance(loss_func, list): loss = loss_func[0](y_pred.mean(1), y.squeeze()[:, 0], reduction='sum') # loss = sum([loss_func[i](y_pred[:, i], y[:, i], reduction='sum') for i in range(self.num_tasks)]) diff --git a/deepctr_torch/models/multitask/__init__.py b/deepctr_torch/models/multitask/__init__.py index 788aca41..2c81bbb3 100644 --- a/deepctr_torch/models/multitask/__init__.py +++ b/deepctr_torch/models/multitask/__init__.py @@ -1,4 +1,6 @@ + +from .sharedbottom import SharedBottom +from .sharedbottom1 import SharedBottom1 # from .esmm import ESMM from .mmoe import MMOE # from .ple import PLE -# from .sharedbottom import SharedBottom \ No newline at end of file diff --git a/deepctr_torch/models/multitask/mmoe.py b/deepctr_torch/models/multitask/mmoe.py index 0d93a49f..4346b1d4 100644 --- a/deepctr_torch/models/multitask/mmoe.py +++ b/deepctr_torch/models/multitask/mmoe.py @@ -69,13 +69,14 @@ def __init__(self, dnn_feature_columns, num_experts=3, expert_dnn_hidden_units=( [nn.Linear(self.input_dim, self.num_experts, bias=False) for _ in range(self.num_tasks)]) if len(tower_dnn_hidden_units) > 0: self.tower_dnn = nn.ModuleList( - [DNN(expert_dnn_hidden_units[-1], tower_dnn_hidden_units + [1], activation=dnn_activation, + [DNN(expert_dnn_hidden_units[-1], tower_dnn_hidden_units, activation=dnn_activation, l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, init_std=init_std, device=device) for _ in range(self.num_tasks)]) + self.tower_dnn_linear = nn.ModuleList([nn.Linear(tower_dnn_hidden_units[-1], 1, bias=False) + for _ in range(self.num_tasks)]) else: - self.tower_dnn = nn.ModuleList([DNN(expert_dnn_hidden_units[-1], [1], activation=dnn_activation, - l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, - init_std=init_std, device=device) for _ in range(self.num_tasks)]) + self.tower_dnn_linear = nn.ModuleList([nn.Linear(expert_dnn_hidden_units[-1], 1, bias=False) + for _ in range(self.num_tasks)]) self.out = nn.ModuleList([PredictionLayer(task) for task in task_types]) self.to(device) @@ -102,8 +103,9 @@ def forward(self, X): # tower dnn (task-specified) task_outs = [] for i in range(self.num_tasks): - tower_logit = self.tower_dnn[i](mmoe_outs[i]) - output = self.out[i](tower_logit) + tower_dnn_out = self.tower_dnn[i](mmoe_outs[i]) + tower_dnn_logit = self.tower_dnn_linear[i](tower_dnn_out) + output = self.out[i](tower_dnn_logit) task_outs.append(output) task_outs = torch.cat(task_outs, -1) return task_outs diff --git a/deepctr_torch/models/multitask/sharedbottom.py b/deepctr_torch/models/multitask/sharedbottom.py new file mode 100644 index 00000000..aa58c080 --- /dev/null +++ b/deepctr_torch/models/multitask/sharedbottom.py @@ -0,0 +1,89 @@ +# -*- coding:utf-8 -*- +""" +Author: + zanshuxun, zanshuxun@aliyun.com + +Reference: + [1] Ruder S. An overview of multi-task learning in deep neural networks[J]. arXiv preprint arXiv:1706.05098, 2017.(https://arxiv.org/pdf/1706.05098.pdf) +""" +import torch +import torch.nn as nn + +from ..basemodel import BaseModel +from ...inputs import combined_dnn_input +from ...layers import DNN, PredictionLayer + + +class SharedBottom(BaseModel): + """Instantiates the Multi-gate Mixture-of-Experts architecture. + + :param dnn_feature_columns: An iterable containing all the features used by deep part of the model. + :param bottom_dnn_hidden_units: list,list of positive integer or empty list, the layer number and units in each layer of shared bottom DNN. + :param tower_dnn_hidden_units: list,list of positive integer or empty list, the layer number and units in each layer of task-specific DNN. + :param l2_reg_embedding: float. L2 regularizer strength applied to embedding vector + :param l2_reg_dnn: float. L2 regularizer strength applied to DNN + :param init_std: float,to use as the initialize std of embedding vector + :param seed: integer ,to use as random seed. + :param dnn_dropout: float in [0,1), the probability we will drop out a given DNN coordinate. + :param dnn_activation: Activation function to use in DNN + :param dnn_use_bn: bool. Whether use BatchNormalization before activation or not in DNN + :param task_types: list of str, indicating the loss of each tasks, ``"binary"`` for binary logloss or ``"regression"`` for regression loss. e.g. ['binary', 'regression'] + :param task_names: list of str, indicating the predict target of each tasks + :param device: str, ``"cpu"`` or ``"cuda:0"`` + + :return: A PyTorch model instance. + """ + + def __init__(self, dnn_feature_columns, bottom_dnn_hidden_units=(256, 128), tower_dnn_hidden_units=(64,), + l2_reg_embedding=0.00001, l2_reg_dnn=0, init_std=0.0001, seed=1024, dnn_dropout=0, + dnn_activation='relu', dnn_use_bn=False, task_types=('binary', 'binary'), + task_names=('ctr', 'ctcvr'), device='cpu'): + super(SharedBottom, self).__init__(linear_feature_columns=[], dnn_feature_columns=dnn_feature_columns, + l2_reg_embedding=l2_reg_embedding, seed=seed, device=device) + self.num_tasks = len(task_names) + if self.num_tasks <= 1: + raise ValueError("num_tasks must be greater than 1") + if len(task_types) != self.num_tasks: + raise ValueError("num_tasks must be equal to the length of task_types") + + for task_type in task_types: + if task_type not in ['binary', 'regression']: + raise ValueError("task must be binary or regression, {} is illegal".format(task_type)) + + self.task_names = task_names + self.input_dim = self.compute_input_dim(dnn_feature_columns) + self.bottom_dnn_hidden_units = bottom_dnn_hidden_units + self.tower_dnn_hidden_units = tower_dnn_hidden_units + + self.bottom_dnn = DNN(self.input_dim, bottom_dnn_hidden_units, activation=dnn_activation, + l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, + init_std=init_std, device=device) + if len(tower_dnn_hidden_units) > 0: + self.tower_dnn = nn.ModuleList( + [DNN(bottom_dnn_hidden_units[-1], tower_dnn_hidden_units, activation=dnn_activation, + l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, + init_std=init_std, device=device) for _ in range(self.num_tasks)]) + self.tower_dnn_linear = nn.ModuleList([nn.Linear(tower_dnn_hidden_units[-1], 1, bias=False) + for _ in range(self.num_tasks)]) + else: + self.tower_dnn_linear = nn.ModuleList([nn.Linear(bottom_dnn_hidden_units[-1], 1, bias=False) + for _ in range(self.num_tasks)]) + + self.out = nn.ModuleList([PredictionLayer(task) for task in task_types]) + self.to(device) + + def forward(self, X): + sparse_embedding_list, dense_value_list = self.input_from_feature_columns(X, self.dnn_feature_columns, + self.embedding_dict) + dnn_input = combined_dnn_input(sparse_embedding_list, dense_value_list) + shared_bottom_output = self.bottom_dnn(dnn_input) + + # tower dnn (task-specified) + task_outs = [] + for i in range(self.num_tasks): + tower_dnn_out = self.tower_dnn[i](shared_bottom_output) + tower_dnn_logit = self.tower_dnn_linear[i](tower_dnn_out) + output = self.out[i](tower_dnn_logit) + task_outs.append(output) + task_outs = torch.cat(task_outs, -1) + return task_outs diff --git a/deepctr_torch/models/multitask/sharedbottom1.py b/deepctr_torch/models/multitask/sharedbottom1.py new file mode 100644 index 00000000..f8356af5 --- /dev/null +++ b/deepctr_torch/models/multitask/sharedbottom1.py @@ -0,0 +1,80 @@ +# -*- coding:utf-8 -*- +""" +Author: + zanshuxun, zanshuxun@aliyun.com + +Reference: + [1] Ruder S. An overview of multi-task learning in deep neural networks[J]. arXiv preprint arXiv:1706.05098, 2017.(https://arxiv.org/pdf/1706.05098.pdf) +""" +import torch +import torch.nn as nn + +from ..basemodel import BaseModel +from ...inputs import combined_dnn_input +from ...layers import DNN, PredictionLayer + + +class SharedBottom1(BaseModel): + """Instantiates the Multi-gate Mixture-of-Experts architecture. + + :param dnn_feature_columns: An iterable containing all the features used by deep part of the model. + :param bottom_dnn_hidden_units: list,list of positive integer or empty list, the layer number and units in each layer of shared bottom DNN. + :param tower_dnn_hidden_units: list,list of positive integer or empty list, the layer number and units in each layer of task-specific DNN. + :param l2_reg_embedding: float. L2 regularizer strength applied to embedding vector + :param l2_reg_dnn: float. L2 regularizer strength applied to DNN + :param init_std: float,to use as the initialize std of embedding vector + :param seed: integer ,to use as random seed. + :param dnn_dropout: float in [0,1), the probability we will drop out a given DNN coordinate. + :param dnn_activation: Activation function to use in DNN + :param dnn_use_bn: bool. Whether use BatchNormalization before activation or not in DNN + :param task_types: list of str, indicating the loss of each tasks, ``"binary"`` for binary logloss or ``"regression"`` for regression loss. e.g. ['binary', 'regression'] + :param task_names: list of str, indicating the predict target of each tasks + :param device: str, ``"cpu"`` or ``"cuda:0"`` + + :return: A PyTorch model instance. + """ + + def __init__(self, dnn_feature_columns, bottom_dnn_hidden_units=(256, 128), tower_dnn_hidden_units=(64,), + l2_reg_embedding=0.00001, l2_reg_dnn=0, init_std=0.0001, seed=1024, dnn_dropout=0, + dnn_activation='relu', dnn_use_bn=False, task_types=('binary', 'binary'), + task_names=('ctr', 'ctcvr'), device='cpu'): + super(SharedBottom1, self).__init__(linear_feature_columns=[], dnn_feature_columns=dnn_feature_columns, + l2_reg_embedding=l2_reg_embedding, seed=seed, device=device) + self.num_tasks = len(task_names) + if len(task_types) != self.num_tasks: + raise ValueError("num_tasks must be equal to the length of task_types") + + for task_type in task_types: + if task_type not in ['binary', 'regression']: + raise ValueError("task must be binary or regression, {} is illegal".format(task_type)) + + self.task_names = task_names + self.input_dim = self.compute_input_dim(dnn_feature_columns) + self.bottom_dnn_hidden_units = bottom_dnn_hidden_units + self.tower_dnn_hidden_units = tower_dnn_hidden_units + + self.bottom_dnn = DNN(self.input_dim, bottom_dnn_hidden_units, activation=dnn_activation, + l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, + init_std=init_std, device=device) + self.tower_dnn = nn.ModuleList( + [DNN(bottom_dnn_hidden_units[-1], list(tower_dnn_hidden_units) + [1], activation=dnn_activation, + l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, + init_std=init_std, device=device) for _ in range(self.num_tasks)]) + + self.out = nn.ModuleList([PredictionLayer(task) for task in task_types]) + self.to(device) + + def forward(self, X): + sparse_embedding_list, dense_value_list = self.input_from_feature_columns(X, self.dnn_feature_columns, + self.embedding_dict) + dnn_input = combined_dnn_input(sparse_embedding_list, dense_value_list) + shared_bottom_output = self.bottom_dnn(dnn_input) + + # tower dnn (task-specified) + task_outs = [] + for i in range(self.num_tasks): + tower_logit = self.tower_dnn[i](shared_bottom_output) + output = self.out[i](tower_logit) + task_outs.append(output) + task_outs = torch.cat(task_outs, -1) + return task_outs diff --git a/examples/run_mtl_criteo.py b/examples/run_mtl_criteo.py index 9534485a..1edfc468 100644 --- a/examples/run_mtl_criteo.py +++ b/examples/run_mtl_criteo.py @@ -16,7 +16,7 @@ data[sparse_features] = data[sparse_features].fillna('-1', ) data[dense_features] = data[dense_features].fillna(0, ) - target = ['label','label'] + target = ['label', 'label'] # 1.Label Encoding for sparse features,and do simple Transformation for dense features for feat in sparse_features: @@ -51,8 +51,8 @@ print('cuda ready...') device = 'cuda:0' - model = MMOE(dnn_feature_columns, tower_dnn_hidden_units=[], task_types=['binary', 'binary'], - task_names=target,init_std=1) + model = SharedBottom(dnn_feature_columns, task_types=['binary', 'binary'], + task_names=target) model.compile("adam", loss=["binary_crossentropy", "binary_crossentropy"], metrics=['binary_crossentropy'], ) diff --git a/examples/run_mtl_criteo1.py b/examples/run_mtl_criteo1.py new file mode 100644 index 00000000..ead4a96b --- /dev/null +++ b/examples/run_mtl_criteo1.py @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- +import pandas as pd +import torch +from sklearn.metrics import log_loss, roc_auc_score +from sklearn.model_selection import train_test_split +from sklearn.preprocessing import LabelEncoder, MinMaxScaler + +from deepctr_torch.inputs import SparseFeat, DenseFeat, get_feature_names +from deepctr_torch.models import * + +if __name__ == "__main__": + data = pd.read_csv('./criteo_sample.txt') + + sparse_features = ['C' + str(i) for i in range(1, 27)] + dense_features = ['I' + str(i) for i in range(1, 14)] + + data[sparse_features] = data[sparse_features].fillna('-1', ) + data[dense_features] = data[dense_features].fillna(0, ) + target = ['label'] + + # 1.Label Encoding for sparse features,and do simple Transformation for dense features + for feat in sparse_features: + lbe = LabelEncoder() + data[feat] = lbe.fit_transform(data[feat]) + mms = MinMaxScaler(feature_range=(0, 1)) + data[dense_features] = mms.fit_transform(data[dense_features]) + + # 2.count #unique features for each sparse field,and record dense feature field name + + fixlen_feature_columns = [SparseFeat(feat, vocabulary_size=data[feat].max() + 10000, embedding_dim=4) + for feat in sparse_features] + [DenseFeat(feat, 1, ) + for feat in dense_features] + + dnn_feature_columns = fixlen_feature_columns + linear_feature_columns = fixlen_feature_columns + + feature_names = get_feature_names( + linear_feature_columns + dnn_feature_columns) + + # 3.generate input data for model + + train, test = train_test_split(data, test_size=0.2, random_state=2020) + train_model_input = {name: train[name] for name in feature_names} + test_model_input = {name: test[name] for name in feature_names} + + # 4.Define Model,train,predict and evaluate + torch.autograd.set_detect_anomaly(True) + device = 'cpu' + use_cuda = True + if use_cuda and torch.cuda.is_available(): + print('cuda ready...') + device = 'cuda:0' + + model = SharedBottom1(dnn_feature_columns=dnn_feature_columns, task_types=['binary'], + task_names=target, tower_dnn_hidden_units=[]) + + # model = DeepFM(linear_feature_columns=linear_feature_columns, dnn_feature_columns=dnn_feature_columns, + # task='binary', use_fm=False, + # l2_reg_embedding=1e-5, device=device) + # task_names=target, init_std=1) + model.compile("adam", loss="binary_crossentropy", + metrics=['binary_crossentropy'], ) + + history = model.fit(train_model_input, train[target].values, batch_size=32, epochs=10, verbose=2, + validation_split=0.2) + pred_ans = model.predict(test_model_input, 256) + print("") + print("test LogLoss", round(log_loss(test[target].values, pred_ans), 4)) + print("test AUC", round(roc_auc_score(test[target].values, pred_ans), 4)) + print(pred_ans) From 30d0fc7da6916d34ead893dcaf4b775defc820e0 Mon Sep 17 00:00:00 2001 From: zanshuxun <631763140@qq.com> Date: Sun, 26 Jun 2022 21:26:47 +0800 Subject: [PATCH 05/47] 1 --- deepctr_torch/models/__init__.py | 2 +- deepctr_torch/models/multitask/__init__.py | 2 - .../models/multitask/sharedbottom1.py | 80 ------------------- examples/run_mtl_criteo1.py | 70 ---------------- 4 files changed, 1 insertion(+), 153 deletions(-) delete mode 100644 deepctr_torch/models/multitask/sharedbottom1.py delete mode 100644 examples/run_mtl_criteo1.py diff --git a/deepctr_torch/models/__init__.py b/deepctr_torch/models/__init__.py index f10ce7d6..3d43685d 100644 --- a/deepctr_torch/models/__init__.py +++ b/deepctr_torch/models/__init__.py @@ -16,5 +16,5 @@ from .dien import DIEN from .din import DIN from .afn import AFN -from .multitask import SharedBottom, SharedBottom1, MMOE +from .multitask import SharedBottom, MMOE # from .multitask import SharedBottom, ESMM, MMOE, PLE \ No newline at end of file diff --git a/deepctr_torch/models/multitask/__init__.py b/deepctr_torch/models/multitask/__init__.py index 2c81bbb3..1f026448 100644 --- a/deepctr_torch/models/multitask/__init__.py +++ b/deepctr_torch/models/multitask/__init__.py @@ -1,6 +1,4 @@ - from .sharedbottom import SharedBottom -from .sharedbottom1 import SharedBottom1 # from .esmm import ESMM from .mmoe import MMOE # from .ple import PLE diff --git a/deepctr_torch/models/multitask/sharedbottom1.py b/deepctr_torch/models/multitask/sharedbottom1.py deleted file mode 100644 index f8356af5..00000000 --- a/deepctr_torch/models/multitask/sharedbottom1.py +++ /dev/null @@ -1,80 +0,0 @@ -# -*- coding:utf-8 -*- -""" -Author: - zanshuxun, zanshuxun@aliyun.com - -Reference: - [1] Ruder S. An overview of multi-task learning in deep neural networks[J]. arXiv preprint arXiv:1706.05098, 2017.(https://arxiv.org/pdf/1706.05098.pdf) -""" -import torch -import torch.nn as nn - -from ..basemodel import BaseModel -from ...inputs import combined_dnn_input -from ...layers import DNN, PredictionLayer - - -class SharedBottom1(BaseModel): - """Instantiates the Multi-gate Mixture-of-Experts architecture. - - :param dnn_feature_columns: An iterable containing all the features used by deep part of the model. - :param bottom_dnn_hidden_units: list,list of positive integer or empty list, the layer number and units in each layer of shared bottom DNN. - :param tower_dnn_hidden_units: list,list of positive integer or empty list, the layer number and units in each layer of task-specific DNN. - :param l2_reg_embedding: float. L2 regularizer strength applied to embedding vector - :param l2_reg_dnn: float. L2 regularizer strength applied to DNN - :param init_std: float,to use as the initialize std of embedding vector - :param seed: integer ,to use as random seed. - :param dnn_dropout: float in [0,1), the probability we will drop out a given DNN coordinate. - :param dnn_activation: Activation function to use in DNN - :param dnn_use_bn: bool. Whether use BatchNormalization before activation or not in DNN - :param task_types: list of str, indicating the loss of each tasks, ``"binary"`` for binary logloss or ``"regression"`` for regression loss. e.g. ['binary', 'regression'] - :param task_names: list of str, indicating the predict target of each tasks - :param device: str, ``"cpu"`` or ``"cuda:0"`` - - :return: A PyTorch model instance. - """ - - def __init__(self, dnn_feature_columns, bottom_dnn_hidden_units=(256, 128), tower_dnn_hidden_units=(64,), - l2_reg_embedding=0.00001, l2_reg_dnn=0, init_std=0.0001, seed=1024, dnn_dropout=0, - dnn_activation='relu', dnn_use_bn=False, task_types=('binary', 'binary'), - task_names=('ctr', 'ctcvr'), device='cpu'): - super(SharedBottom1, self).__init__(linear_feature_columns=[], dnn_feature_columns=dnn_feature_columns, - l2_reg_embedding=l2_reg_embedding, seed=seed, device=device) - self.num_tasks = len(task_names) - if len(task_types) != self.num_tasks: - raise ValueError("num_tasks must be equal to the length of task_types") - - for task_type in task_types: - if task_type not in ['binary', 'regression']: - raise ValueError("task must be binary or regression, {} is illegal".format(task_type)) - - self.task_names = task_names - self.input_dim = self.compute_input_dim(dnn_feature_columns) - self.bottom_dnn_hidden_units = bottom_dnn_hidden_units - self.tower_dnn_hidden_units = tower_dnn_hidden_units - - self.bottom_dnn = DNN(self.input_dim, bottom_dnn_hidden_units, activation=dnn_activation, - l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, - init_std=init_std, device=device) - self.tower_dnn = nn.ModuleList( - [DNN(bottom_dnn_hidden_units[-1], list(tower_dnn_hidden_units) + [1], activation=dnn_activation, - l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, - init_std=init_std, device=device) for _ in range(self.num_tasks)]) - - self.out = nn.ModuleList([PredictionLayer(task) for task in task_types]) - self.to(device) - - def forward(self, X): - sparse_embedding_list, dense_value_list = self.input_from_feature_columns(X, self.dnn_feature_columns, - self.embedding_dict) - dnn_input = combined_dnn_input(sparse_embedding_list, dense_value_list) - shared_bottom_output = self.bottom_dnn(dnn_input) - - # tower dnn (task-specified) - task_outs = [] - for i in range(self.num_tasks): - tower_logit = self.tower_dnn[i](shared_bottom_output) - output = self.out[i](tower_logit) - task_outs.append(output) - task_outs = torch.cat(task_outs, -1) - return task_outs diff --git a/examples/run_mtl_criteo1.py b/examples/run_mtl_criteo1.py deleted file mode 100644 index ead4a96b..00000000 --- a/examples/run_mtl_criteo1.py +++ /dev/null @@ -1,70 +0,0 @@ -# -*- coding: utf-8 -*- -import pandas as pd -import torch -from sklearn.metrics import log_loss, roc_auc_score -from sklearn.model_selection import train_test_split -from sklearn.preprocessing import LabelEncoder, MinMaxScaler - -from deepctr_torch.inputs import SparseFeat, DenseFeat, get_feature_names -from deepctr_torch.models import * - -if __name__ == "__main__": - data = pd.read_csv('./criteo_sample.txt') - - sparse_features = ['C' + str(i) for i in range(1, 27)] - dense_features = ['I' + str(i) for i in range(1, 14)] - - data[sparse_features] = data[sparse_features].fillna('-1', ) - data[dense_features] = data[dense_features].fillna(0, ) - target = ['label'] - - # 1.Label Encoding for sparse features,and do simple Transformation for dense features - for feat in sparse_features: - lbe = LabelEncoder() - data[feat] = lbe.fit_transform(data[feat]) - mms = MinMaxScaler(feature_range=(0, 1)) - data[dense_features] = mms.fit_transform(data[dense_features]) - - # 2.count #unique features for each sparse field,and record dense feature field name - - fixlen_feature_columns = [SparseFeat(feat, vocabulary_size=data[feat].max() + 10000, embedding_dim=4) - for feat in sparse_features] + [DenseFeat(feat, 1, ) - for feat in dense_features] - - dnn_feature_columns = fixlen_feature_columns - linear_feature_columns = fixlen_feature_columns - - feature_names = get_feature_names( - linear_feature_columns + dnn_feature_columns) - - # 3.generate input data for model - - train, test = train_test_split(data, test_size=0.2, random_state=2020) - train_model_input = {name: train[name] for name in feature_names} - test_model_input = {name: test[name] for name in feature_names} - - # 4.Define Model,train,predict and evaluate - torch.autograd.set_detect_anomaly(True) - device = 'cpu' - use_cuda = True - if use_cuda and torch.cuda.is_available(): - print('cuda ready...') - device = 'cuda:0' - - model = SharedBottom1(dnn_feature_columns=dnn_feature_columns, task_types=['binary'], - task_names=target, tower_dnn_hidden_units=[]) - - # model = DeepFM(linear_feature_columns=linear_feature_columns, dnn_feature_columns=dnn_feature_columns, - # task='binary', use_fm=False, - # l2_reg_embedding=1e-5, device=device) - # task_names=target, init_std=1) - model.compile("adam", loss="binary_crossentropy", - metrics=['binary_crossentropy'], ) - - history = model.fit(train_model_input, train[target].values, batch_size=32, epochs=10, verbose=2, - validation_split=0.2) - pred_ans = model.predict(test_model_input, 256) - print("") - print("test LogLoss", round(log_loss(test[target].values, pred_ans), 4)) - print("test AUC", round(roc_auc_score(test[target].values, pred_ans), 4)) - print(pred_ans) From 71cf99a633baabd487e24cf59a4b4c2ad0041a8b Mon Sep 17 00:00:00 2001 From: zanshuxun <631763140@qq.com> Date: Sun, 26 Jun 2022 21:46:13 +0800 Subject: [PATCH 06/47] 11 --- deepctr_torch/models/basemodel.py | 8 ++-- deepctr_torch/models/multitask/mmoe.py | 39 ++++++++++++++----- .../models/multitask/sharedbottom.py | 9 +++-- examples/run_classification_criteo.py | 2 + examples/run_mtl_criteo.py | 4 +- 5 files changed, 44 insertions(+), 18 deletions(-) diff --git a/deepctr_torch/models/basemodel.py b/deepctr_torch/models/basemodel.py index b00156c6..4d2d4b94 100644 --- a/deepctr_torch/models/basemodel.py +++ b/deepctr_torch/models/basemodel.py @@ -245,12 +245,14 @@ def fit(self, x=None, y=None, batch_size=None, epochs=1, verbose=1, initial_epoc y_pred = model(x).squeeze() optim.zero_grad() - # loss = loss_func(y_pred, y.squeeze(), reduction='sum') if isinstance(loss_func, list): - loss = loss_func[0](y_pred.mean(1), y.squeeze()[:, 0], reduction='sum') - # loss = sum([loss_func[i](y_pred[:, i], y[:, i], reduction='sum') for i in range(self.num_tasks)]) + time1 = time.time() + loss = sum([loss_func[i](y_pred[:, i], y[:, i], reduction='sum') for i in range(self.num_tasks)]) + print('time', time.time()-time1) else: + time1 = time.time() loss = loss_func(y_pred, y.squeeze(), reduction='sum') + print('time', time.time()-time1) reg_loss = self.get_regularization_loss() total_loss = loss + reg_loss + self.aux_loss diff --git a/deepctr_torch/models/multitask/mmoe.py b/deepctr_torch/models/multitask/mmoe.py index 4346b1d4..1824ce52 100644 --- a/deepctr_torch/models/multitask/mmoe.py +++ b/deepctr_torch/models/multitask/mmoe.py @@ -62,21 +62,33 @@ def __init__(self, dnn_feature_columns, num_experts=3, expert_dnn_hidden_units=( self.gate_dnn_hidden_units = gate_dnn_hidden_units self.tower_dnn_hidden_units = tower_dnn_hidden_units + # expert dnn self.expert_dnn = nn.ModuleList([DNN(self.input_dim, expert_dnn_hidden_units, activation=dnn_activation, l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, init_std=init_std, device=device) for _ in range(self.num_experts)]) - self.gate_dnn = nn.ModuleList( - [nn.Linear(self.input_dim, self.num_experts, bias=False) for _ in range(self.num_tasks)]) + + # gate dnn + if len(gate_dnn_hidden_units) > 0: + self.gate_dnn = nn.ModuleList([DNN(self.input_dim, gate_dnn_hidden_units, activation=dnn_activation, + l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, + init_std=init_std, device=device) for _ in range(self.num_experts)]) + self.gate_dnn_final_layer = nn.ModuleList( + [nn.Linear(gate_dnn_hidden_units[-1], self.num_experts, bias=False) for _ in range(self.num_tasks)]) + else: + self.gate_dnn_final_layer = nn.ModuleList( + [nn.Linear(self.input_dim, self.num_experts, bias=False) for _ in range(self.num_tasks)]) + + # tower dnn (task-specified) if len(tower_dnn_hidden_units) > 0: self.tower_dnn = nn.ModuleList( [DNN(expert_dnn_hidden_units[-1], tower_dnn_hidden_units, activation=dnn_activation, l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, init_std=init_std, device=device) for _ in range(self.num_tasks)]) - self.tower_dnn_linear = nn.ModuleList([nn.Linear(tower_dnn_hidden_units[-1], 1, bias=False) - for _ in range(self.num_tasks)]) + self.tower_dnn_final_layer = nn.ModuleList([nn.Linear(tower_dnn_hidden_units[-1], 1, bias=False) + for _ in range(self.num_tasks)]) else: - self.tower_dnn_linear = nn.ModuleList([nn.Linear(expert_dnn_hidden_units[-1], 1, bias=False) - for _ in range(self.num_tasks)]) + self.tower_dnn_final_layer = nn.ModuleList([nn.Linear(expert_dnn_hidden_units[-1], 1, bias=False) + for _ in range(self.num_tasks)]) self.out = nn.ModuleList([PredictionLayer(task) for task in task_types]) self.to(device) @@ -96,15 +108,22 @@ def forward(self, X): # gate dnn mmoe_outs = [] for i in range(self.num_tasks): - gate_out = self.gate_dnn[i](dnn_input).softmax(1) - gate_mul_expert = torch.matmul(gate_out.unsqueeze(1), expert_outs) + if len(self.gate_dnn_hidden_units) > 0: + gate_dnn_out = self.gate_dnn[i](dnn_input) + gate_dnn_out = self.gate_dnn_final_layer[i](gate_dnn_out) + else: + gate_dnn_out = self.gate_dnn_final_layer[i](dnn_input) + gate_mul_expert = torch.matmul(gate_dnn_out.softmax(1).unsqueeze(1), expert_outs) mmoe_outs.append(gate_mul_expert.squeeze()) # tower dnn (task-specified) task_outs = [] for i in range(self.num_tasks): - tower_dnn_out = self.tower_dnn[i](mmoe_outs[i]) - tower_dnn_logit = self.tower_dnn_linear[i](tower_dnn_out) + if len(self.tower_dnn_hidden_units) > 0: + tower_dnn_out = self.tower_dnn[i](mmoe_outs[i]) + tower_dnn_logit = self.tower_dnn_final_layer[i](tower_dnn_out) + else: + tower_dnn_logit = self.tower_dnn_final_layer[i](mmoe_outs[i]) output = self.out[i](tower_dnn_logit) task_outs.append(output) task_outs = torch.cat(task_outs, -1) diff --git a/deepctr_torch/models/multitask/sharedbottom.py b/deepctr_torch/models/multitask/sharedbottom.py index aa58c080..bc95fefb 100644 --- a/deepctr_torch/models/multitask/sharedbottom.py +++ b/deepctr_torch/models/multitask/sharedbottom.py @@ -58,7 +58,7 @@ def __init__(self, dnn_feature_columns, bottom_dnn_hidden_units=(256, 128), towe self.bottom_dnn = DNN(self.input_dim, bottom_dnn_hidden_units, activation=dnn_activation, l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, init_std=init_std, device=device) - if len(tower_dnn_hidden_units) > 0: + if len(self.tower_dnn_hidden_units) > 0: self.tower_dnn = nn.ModuleList( [DNN(bottom_dnn_hidden_units[-1], tower_dnn_hidden_units, activation=dnn_activation, l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, @@ -81,8 +81,11 @@ def forward(self, X): # tower dnn (task-specified) task_outs = [] for i in range(self.num_tasks): - tower_dnn_out = self.tower_dnn[i](shared_bottom_output) - tower_dnn_logit = self.tower_dnn_linear[i](tower_dnn_out) + if len(self.tower_dnn_hidden_units) > 0: + tower_dnn_out = self.tower_dnn[i](shared_bottom_output) + tower_dnn_logit = self.tower_dnn_linear[i](tower_dnn_out) + else: + tower_dnn_logit = self.tower_dnn_linear[i](shared_bottom_output) output = self.out[i](tower_dnn_logit) task_outs.append(output) task_outs = torch.cat(task_outs, -1) diff --git a/examples/run_classification_criteo.py b/examples/run_classification_criteo.py index 67fb3d9a..1a5fd9c3 100644 --- a/examples/run_classification_criteo.py +++ b/examples/run_classification_criteo.py @@ -64,3 +64,5 @@ print("") print("test LogLoss", round(log_loss(test[target].values, pred_ans), 4)) print("test AUC", round(roc_auc_score(test[target].values, pred_ans), 4)) + print(pred_ans) + diff --git a/examples/run_mtl_criteo.py b/examples/run_mtl_criteo.py index 1edfc468..f3ba8d68 100644 --- a/examples/run_mtl_criteo.py +++ b/examples/run_mtl_criteo.py @@ -51,8 +51,8 @@ print('cuda ready...') device = 'cuda:0' - model = SharedBottom(dnn_feature_columns, task_types=['binary', 'binary'], - task_names=target) + model = MMOE(dnn_feature_columns, task_types=['binary', 'binary'], + l2_reg_embedding=1e-5, task_names=target, device=device) model.compile("adam", loss=["binary_crossentropy", "binary_crossentropy"], metrics=['binary_crossentropy'], ) From 29f177fe533a096f2e5f15bea13b13ef6683e665 Mon Sep 17 00:00:00 2001 From: zanshuxun <631763140@qq.com> Date: Sun, 26 Jun 2022 22:15:58 +0800 Subject: [PATCH 07/47] 111 --- deepctr_torch/models/multitask/mmoe.py | 13 ++++++------- deepctr_torch/models/multitask/sharedbottom.py | 14 +++++++------- examples/run_mtl_criteo.py | 5 ++--- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/deepctr_torch/models/multitask/mmoe.py b/deepctr_torch/models/multitask/mmoe.py index 1824ce52..afeea2b1 100644 --- a/deepctr_torch/models/multitask/mmoe.py +++ b/deepctr_torch/models/multitask/mmoe.py @@ -37,14 +37,13 @@ class MMOE(BaseModel): """ def __init__(self, dnn_feature_columns, num_experts=3, expert_dnn_hidden_units=(64, 32), - gate_dnn_hidden_units=(), tower_dnn_hidden_units=(64,), l2_reg_embedding=0.00001, l2_reg_dnn=0, + gate_dnn_hidden_units=(), tower_dnn_hidden_units=(64,), l2_reg_linear=0.00001, l2_reg_embedding=0.00001, l2_reg_dnn=0, init_std=0.0001, seed=1024, dnn_dropout=0, dnn_activation='relu', dnn_use_bn=False, - task_types=('binary', 'binary'), task_names=('ctr', 'ctcvr'), device='cpu'): + task_types=('binary', 'binary'), task_names=('ctr', 'ctcvr'), device='cpu', gpus=None): super(MMOE, self).__init__(linear_feature_columns=[], dnn_feature_columns=dnn_feature_columns, - l2_reg_embedding=l2_reg_embedding, seed=seed, device=device) + l2_reg_linear=l2_reg_linear, l2_reg_embedding=l2_reg_embedding, seed=seed, + device=device, gpus=gpus) self.num_tasks = len(task_names) - if self.num_tasks <= 1: - raise ValueError("num_tasks must be greater than 1") if num_experts <= 1: raise ValueError("num_experts must be greater than 1") @@ -78,7 +77,7 @@ def __init__(self, dnn_feature_columns, num_experts=3, expert_dnn_hidden_units=( self.gate_dnn_final_layer = nn.ModuleList( [nn.Linear(self.input_dim, self.num_experts, bias=False) for _ in range(self.num_tasks)]) - # tower dnn (task-specified) + # tower dnn (task-specific) if len(tower_dnn_hidden_units) > 0: self.tower_dnn = nn.ModuleList( [DNN(expert_dnn_hidden_units[-1], tower_dnn_hidden_units, activation=dnn_activation, @@ -116,7 +115,7 @@ def forward(self, X): gate_mul_expert = torch.matmul(gate_dnn_out.softmax(1).unsqueeze(1), expert_outs) mmoe_outs.append(gate_mul_expert.squeeze()) - # tower dnn (task-specified) + # tower dnn (task-specific) task_outs = [] for i in range(self.num_tasks): if len(self.tower_dnn_hidden_units) > 0: diff --git a/deepctr_torch/models/multitask/sharedbottom.py b/deepctr_torch/models/multitask/sharedbottom.py index bc95fefb..9cbb94ae 100644 --- a/deepctr_torch/models/multitask/sharedbottom.py +++ b/deepctr_torch/models/multitask/sharedbottom.py @@ -20,6 +20,7 @@ class SharedBottom(BaseModel): :param dnn_feature_columns: An iterable containing all the features used by deep part of the model. :param bottom_dnn_hidden_units: list,list of positive integer or empty list, the layer number and units in each layer of shared bottom DNN. :param tower_dnn_hidden_units: list,list of positive integer or empty list, the layer number and units in each layer of task-specific DNN. + :param l2_reg_linear: float. L2 regularizer strength applied to linear part :param l2_reg_embedding: float. L2 regularizer strength applied to embedding vector :param l2_reg_dnn: float. L2 regularizer strength applied to DNN :param init_std: float,to use as the initialize std of embedding vector @@ -35,14 +36,13 @@ class SharedBottom(BaseModel): """ def __init__(self, dnn_feature_columns, bottom_dnn_hidden_units=(256, 128), tower_dnn_hidden_units=(64,), - l2_reg_embedding=0.00001, l2_reg_dnn=0, init_std=0.0001, seed=1024, dnn_dropout=0, - dnn_activation='relu', dnn_use_bn=False, task_types=('binary', 'binary'), - task_names=('ctr', 'ctcvr'), device='cpu'): + l2_reg_linear=0.00001, l2_reg_embedding=0.00001, l2_reg_dnn=0, init_std=0.0001, seed=1024, + dnn_dropout=0, dnn_activation='relu', dnn_use_bn=False, task_types=('binary', 'binary'), + task_names=('ctr', 'ctcvr'), device='cpu', gpus=None): super(SharedBottom, self).__init__(linear_feature_columns=[], dnn_feature_columns=dnn_feature_columns, - l2_reg_embedding=l2_reg_embedding, seed=seed, device=device) + l2_reg_linear=l2_reg_linear, l2_reg_embedding=l2_reg_embedding, + seed=seed, device=device, gpus=gpus) self.num_tasks = len(task_names) - if self.num_tasks <= 1: - raise ValueError("num_tasks must be greater than 1") if len(task_types) != self.num_tasks: raise ValueError("num_tasks must be equal to the length of task_types") @@ -78,7 +78,7 @@ def forward(self, X): dnn_input = combined_dnn_input(sparse_embedding_list, dense_value_list) shared_bottom_output = self.bottom_dnn(dnn_input) - # tower dnn (task-specified) + # tower dnn (task-specific) task_outs = [] for i in range(self.num_tasks): if len(self.tower_dnn_hidden_units) > 0: diff --git a/examples/run_mtl_criteo.py b/examples/run_mtl_criteo.py index f3ba8d68..8e68b443 100644 --- a/examples/run_mtl_criteo.py +++ b/examples/run_mtl_criteo.py @@ -27,7 +27,7 @@ # 2.count #unique features for each sparse field,and record dense feature field name - fixlen_feature_columns = [SparseFeat(feat, vocabulary_size=data[feat].max() + 10000, embedding_dim=4) + fixlen_feature_columns = [SparseFeat(feat, vocabulary_size=data[feat].max() + 1, embedding_dim=4) for feat in sparse_features] + [DenseFeat(feat, 1, ) for feat in dense_features] @@ -44,7 +44,6 @@ test_model_input = {name: test[name] for name in feature_names} # 4.Define Model,train,predict and evaluate - torch.autograd.set_detect_anomaly(True) device = 'cpu' use_cuda = True if use_cuda and torch.cuda.is_available(): @@ -53,7 +52,7 @@ model = MMOE(dnn_feature_columns, task_types=['binary', 'binary'], l2_reg_embedding=1e-5, task_names=target, device=device) - model.compile("adam", loss=["binary_crossentropy", "binary_crossentropy"], + model.compile("adagrad", loss="binary_crossentropy", metrics=['binary_crossentropy'], ) history = model.fit(train_model_input, train[target].values, batch_size=32, epochs=10, verbose=2, From cbd9eead14d648b5b9c5f406a8e045e67c7d5bda Mon Sep 17 00:00:00 2001 From: zanshuxun <631763140@qq.com> Date: Sun, 26 Jun 2022 22:25:13 +0800 Subject: [PATCH 08/47] if self.num_tasks <= 1: --- deepctr_torch/models/multitask/mmoe.py | 2 ++ deepctr_torch/models/multitask/sharedbottom.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/deepctr_torch/models/multitask/mmoe.py b/deepctr_torch/models/multitask/mmoe.py index afeea2b1..5e32b872 100644 --- a/deepctr_torch/models/multitask/mmoe.py +++ b/deepctr_torch/models/multitask/mmoe.py @@ -44,6 +44,8 @@ def __init__(self, dnn_feature_columns, num_experts=3, expert_dnn_hidden_units=( l2_reg_linear=l2_reg_linear, l2_reg_embedding=l2_reg_embedding, seed=seed, device=device, gpus=gpus) self.num_tasks = len(task_names) + if self.num_tasks <= 1: + raise ValueError("num_tasks must be greater than 1") if num_experts <= 1: raise ValueError("num_experts must be greater than 1") diff --git a/deepctr_torch/models/multitask/sharedbottom.py b/deepctr_torch/models/multitask/sharedbottom.py index 9cbb94ae..38e59f02 100644 --- a/deepctr_torch/models/multitask/sharedbottom.py +++ b/deepctr_torch/models/multitask/sharedbottom.py @@ -43,6 +43,8 @@ def __init__(self, dnn_feature_columns, bottom_dnn_hidden_units=(256, 128), towe l2_reg_linear=l2_reg_linear, l2_reg_embedding=l2_reg_embedding, seed=seed, device=device, gpus=gpus) self.num_tasks = len(task_names) + if self.num_tasks <= 1: + raise ValueError("num_tasks must be greater than 1") if len(task_types) != self.num_tasks: raise ValueError("num_tasks must be equal to the length of task_types") From c00ff9ff2e505882a9fbf03fcaf2307bdff96a84 Mon Sep 17 00:00:00 2001 From: zanshuxun <631763140@qq.com> Date: Sun, 26 Jun 2022 22:43:27 +0800 Subject: [PATCH 09/47] add_regularization_weight --- deepctr_torch/models/__init__.py | 2 +- deepctr_torch/models/multitask/__init__.py | 2 +- deepctr_torch/models/multitask/esmm.py | 94 +++++++++++++++++++ deepctr_torch/models/multitask/mmoe.py | 10 ++ .../models/multitask/sharedbottom.py | 26 +++-- examples/run_mtl_criteo.py | 2 +- 6 files changed, 125 insertions(+), 11 deletions(-) create mode 100644 deepctr_torch/models/multitask/esmm.py diff --git a/deepctr_torch/models/__init__.py b/deepctr_torch/models/__init__.py index 3d43685d..a03b46d8 100644 --- a/deepctr_torch/models/__init__.py +++ b/deepctr_torch/models/__init__.py @@ -16,5 +16,5 @@ from .dien import DIEN from .din import DIN from .afn import AFN -from .multitask import SharedBottom, MMOE +from .multitask import SharedBottom, ESMM, MMOE # from .multitask import SharedBottom, ESMM, MMOE, PLE \ No newline at end of file diff --git a/deepctr_torch/models/multitask/__init__.py b/deepctr_torch/models/multitask/__init__.py index 1f026448..bbd267e4 100644 --- a/deepctr_torch/models/multitask/__init__.py +++ b/deepctr_torch/models/multitask/__init__.py @@ -1,4 +1,4 @@ from .sharedbottom import SharedBottom -# from .esmm import ESMM +from .esmm import ESMM from .mmoe import MMOE # from .ple import PLE diff --git a/deepctr_torch/models/multitask/esmm.py b/deepctr_torch/models/multitask/esmm.py new file mode 100644 index 00000000..f8d556da --- /dev/null +++ b/deepctr_torch/models/multitask/esmm.py @@ -0,0 +1,94 @@ +# -*- coding:utf-8 -*- +""" +Author: + zanshuxun, zanshuxun@aliyun.com + +Reference: + [1] Ma X, Zhao L, Huang G, et al. Entire space multi-task model: An effective approach for estimating post-click conversion rate[C]//The 41st International ACM SIGIR Conference on Research & Development in Information Retrieval. 2018.(https://arxiv.org/abs/1804.07931) +""" +import torch +import torch.nn as nn + +from ..basemodel import BaseModel +from ...inputs import combined_dnn_input +from ...layers import DNN + + +class ESMM(BaseModel): + """Instantiates the Multi-gate Mixture-of-Experts architecture. + + :param dnn_feature_columns: An iterable containing all the features used by deep part of the model. + :param tower_dnn_hidden_units: list,list of positive integer or empty list, the layer number and units in each layer of task-specific DNN. + :param l2_reg_linear: float. L2 regularizer strength applied to linear part + :param l2_reg_embedding: float. L2 regularizer strength applied to embedding vector + :param l2_reg_dnn: float. L2 regularizer strength applied to DNN + :param init_std: float,to use as the initialize std of embedding vector + :param seed: integer ,to use as random seed. + :param dnn_dropout: float in [0,1), the probability we will drop out a given DNN coordinate. + :param dnn_activation: Activation function to use in DNN + :param dnn_use_bn: bool. Whether use BatchNormalization before activation or not in DNN + :param task_types: list of str, indicating the loss of each tasks, ``"binary"`` for binary logloss or ``"regression"`` for regression loss. e.g. ['binary', 'regression'] + :param task_names: list of str, indicating the predict target of each tasks + :param device: str, ``"cpu"`` or ``"cuda:0"`` + :param gpus: list of int or torch.device for multiple gpus. If None, run on `device`. `gpus[0]` should be the same gpu with `device`. + + :return: A PyTorch model instance. + """ + + def __init__(self, dnn_feature_columns, tower_dnn_hidden_units=(64,), + l2_reg_linear=0.00001, l2_reg_embedding=0.00001, l2_reg_dnn=0, init_std=0.0001, seed=1024, + dnn_dropout=0, dnn_activation='relu', dnn_use_bn=False, task_types=('binary', 'binary'), + task_names=('ctr', 'ctcvr'), device='cpu', gpus=None): + super(ESMM, self).__init__(linear_feature_columns=[], dnn_feature_columns=dnn_feature_columns, + l2_reg_linear=l2_reg_linear, l2_reg_embedding=l2_reg_embedding, + seed=seed, task='binary', device=device, gpus=gpus) + self.num_tasks = len(task_names) + if self.num_tasks != 2: + raise ValueError("the length of task_names must be equal to 2") + if len(task_types) != self.num_tasks: + raise ValueError("num_tasks must be equal to the length of task_types") + + for task_type in task_types: + if task_type != 'binary': + raise ValueError("task must be binary in ESMM, {} is illegal".format(task_type)) + + self.task_names = task_names + self.input_dim = self.compute_input_dim(dnn_feature_columns) + self.tower_dnn_hidden_units = tower_dnn_hidden_units + + self.ctr_dnn = DNN(self.input_dim, tower_dnn_hidden_units, activation=dnn_activation, + dropout_rate=dnn_dropout, use_bn=dnn_use_bn, + init_std=init_std, device=device) + self.cvr_dnn = DNN(self.input_dim, tower_dnn_hidden_units, activation=dnn_activation, + dropout_rate=dnn_dropout, use_bn=dnn_use_bn, + init_std=init_std, device=device) + + self.ctr_dnn_final_layer = nn.Linear(tower_dnn_hidden_units[-1], 1, bias=False) + self.cvr_dnn_final_layer = nn.Linear(tower_dnn_hidden_units[-1], 1, bias=False) + + self.add_regularization_weight( + filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.ctr_dnn.named_parameters()), l2=l2_reg_dnn) + self.add_regularization_weight( + filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.cvr_dnn.named_parameters()), l2=l2_reg_dnn) + self.add_regularization_weight(self.ctr_dnn_final_layer.weight, l2=l2_reg_dnn) + self.add_regularization_weight(self.cvr_dnn_final_layer.weight, l2=l2_reg_dnn) + self.to(device) + + def forward(self, X): + sparse_embedding_list, dense_value_list = self.input_from_feature_columns(X, self.dnn_feature_columns, + self.embedding_dict) + dnn_input = combined_dnn_input(sparse_embedding_list, dense_value_list) + + ctr_output = self.ctr_dnn(dnn_input) + cvr_output = self.cvr_dnn(dnn_input) + + ctr_logit = self.ctr_dnn_final_layer(ctr_output) + cvr_logit = self.cvr_dnn_final_layer(cvr_output) + + ctr_pred = self.out(ctr_logit) + cvr_pred = self.out(cvr_logit) + + ctcvr_pred = ctr_pred * cvr_pred # CTCVR = CTR * CVR + + task_outs = torch.cat([ctr_pred, ctcvr_pred], -1) + return task_outs diff --git a/deepctr_torch/models/multitask/mmoe.py b/deepctr_torch/models/multitask/mmoe.py index 5e32b872..354e75a3 100644 --- a/deepctr_torch/models/multitask/mmoe.py +++ b/deepctr_torch/models/multitask/mmoe.py @@ -32,6 +32,7 @@ class MMOE(BaseModel): :param task_types: list of str, indicating the loss of each tasks, ``"binary"`` for binary logloss, ``"regression"`` for regression loss. e.g. ['binary', 'regression'] :param task_names: list of str, indicating the predict target of each tasks :param device: str, ``"cpu"`` or ``"cuda:0"`` + :param gpus: list of int or torch.device for multiple gpus. If None, run on `device`. `gpus[0]` should be the same gpu with `device`. :return: A PyTorch model instance. """ @@ -75,6 +76,8 @@ def __init__(self, dnn_feature_columns, num_experts=3, expert_dnn_hidden_units=( init_std=init_std, device=device) for _ in range(self.num_experts)]) self.gate_dnn_final_layer = nn.ModuleList( [nn.Linear(gate_dnn_hidden_units[-1], self.num_experts, bias=False) for _ in range(self.num_tasks)]) + self.add_regularization_weight( + filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.gate_dnn.named_parameters()), l2=l2_reg_dnn) else: self.gate_dnn_final_layer = nn.ModuleList( [nn.Linear(self.input_dim, self.num_experts, bias=False) for _ in range(self.num_tasks)]) @@ -87,11 +90,18 @@ def __init__(self, dnn_feature_columns, num_experts=3, expert_dnn_hidden_units=( init_std=init_std, device=device) for _ in range(self.num_tasks)]) self.tower_dnn_final_layer = nn.ModuleList([nn.Linear(tower_dnn_hidden_units[-1], 1, bias=False) for _ in range(self.num_tasks)]) + self.add_regularization_weight( + filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.tower_dnn.named_parameters()), l2=l2_reg_dnn) else: self.tower_dnn_final_layer = nn.ModuleList([nn.Linear(expert_dnn_hidden_units[-1], 1, bias=False) for _ in range(self.num_tasks)]) self.out = nn.ModuleList([PredictionLayer(task) for task in task_types]) + + self.add_regularization_weight( + filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.expert_dnn.named_parameters()), l2=l2_reg_dnn) + self.add_regularization_weight(self.gate_dnn_final_layer.weight, l2=l2_reg_dnn) + self.add_regularization_weight(self.tower_dnn_final_layer.weight, l2=l2_reg_dnn) self.to(device) def forward(self, X): diff --git a/deepctr_torch/models/multitask/sharedbottom.py b/deepctr_torch/models/multitask/sharedbottom.py index 38e59f02..b28a9de9 100644 --- a/deepctr_torch/models/multitask/sharedbottom.py +++ b/deepctr_torch/models/multitask/sharedbottom.py @@ -31,6 +31,7 @@ class SharedBottom(BaseModel): :param task_types: list of str, indicating the loss of each tasks, ``"binary"`` for binary logloss or ``"regression"`` for regression loss. e.g. ['binary', 'regression'] :param task_names: list of str, indicating the predict target of each tasks :param device: str, ``"cpu"`` or ``"cuda:0"`` + :param gpus: list of int or torch.device for multiple gpus. If None, run on `device`. `gpus[0]` should be the same gpu with `device`. :return: A PyTorch model instance. """ @@ -58,20 +59,29 @@ def __init__(self, dnn_feature_columns, bottom_dnn_hidden_units=(256, 128), towe self.tower_dnn_hidden_units = tower_dnn_hidden_units self.bottom_dnn = DNN(self.input_dim, bottom_dnn_hidden_units, activation=dnn_activation, - l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, + dropout_rate=dnn_dropout, use_bn=dnn_use_bn, init_std=init_std, device=device) if len(self.tower_dnn_hidden_units) > 0: self.tower_dnn = nn.ModuleList( [DNN(bottom_dnn_hidden_units[-1], tower_dnn_hidden_units, activation=dnn_activation, - l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, + dropout_rate=dnn_dropout, use_bn=dnn_use_bn, init_std=init_std, device=device) for _ in range(self.num_tasks)]) - self.tower_dnn_linear = nn.ModuleList([nn.Linear(tower_dnn_hidden_units[-1], 1, bias=False) - for _ in range(self.num_tasks)]) + self.tower_dnn_final_layer = nn.ModuleList([nn.Linear(tower_dnn_hidden_units[-1], 1, bias=False) + for _ in range(self.num_tasks)]) + self.add_regularization_weight( + filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.tower_dnn.named_parameters()), + l2=l2_reg_dnn) else: - self.tower_dnn_linear = nn.ModuleList([nn.Linear(bottom_dnn_hidden_units[-1], 1, bias=False) - for _ in range(self.num_tasks)]) + self.tower_dnn_final_layer = nn.ModuleList([nn.Linear(bottom_dnn_hidden_units[-1], 1, bias=False) + for _ in range(self.num_tasks)]) self.out = nn.ModuleList([PredictionLayer(task) for task in task_types]) + + self.add_regularization_weight( + filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.bottom_dnn.named_parameters()), l2=l2_reg_dnn) + self.add_regularization_weight( + filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.cvr_dnn.named_parameters()), l2=l2_reg_dnn) + self.add_regularization_weight(self.tower_dnn_final_layer.weight, l2=l2_reg_dnn) self.to(device) def forward(self, X): @@ -85,9 +95,9 @@ def forward(self, X): for i in range(self.num_tasks): if len(self.tower_dnn_hidden_units) > 0: tower_dnn_out = self.tower_dnn[i](shared_bottom_output) - tower_dnn_logit = self.tower_dnn_linear[i](tower_dnn_out) + tower_dnn_logit = self.tower_dnn_final_layer[i](tower_dnn_out) else: - tower_dnn_logit = self.tower_dnn_linear[i](shared_bottom_output) + tower_dnn_logit = self.tower_dnn_final_layer[i](shared_bottom_output) output = self.out[i](tower_dnn_logit) task_outs.append(output) task_outs = torch.cat(task_outs, -1) diff --git a/examples/run_mtl_criteo.py b/examples/run_mtl_criteo.py index 8e68b443..4de17670 100644 --- a/examples/run_mtl_criteo.py +++ b/examples/run_mtl_criteo.py @@ -50,7 +50,7 @@ print('cuda ready...') device = 'cuda:0' - model = MMOE(dnn_feature_columns, task_types=['binary', 'binary'], + model = ESMM(dnn_feature_columns, task_types=['binary', 'binary'], l2_reg_embedding=1e-5, task_names=target, device=device) model.compile("adagrad", loss="binary_crossentropy", metrics=['binary_crossentropy'], ) From 0c703777028f569614f1f7f26e91d912ee2be0e5 Mon Sep 17 00:00:00 2001 From: zanshuxun <631763140@qq.com> Date: Sun, 26 Jun 2022 22:46:18 +0800 Subject: [PATCH 10/47] 1 --- deepctr_torch/models/multitask/mmoe.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deepctr_torch/models/multitask/mmoe.py b/deepctr_torch/models/multitask/mmoe.py index 354e75a3..2bfb6774 100644 --- a/deepctr_torch/models/multitask/mmoe.py +++ b/deepctr_torch/models/multitask/mmoe.py @@ -4,7 +4,7 @@ zanshuxun, zanshuxun@aliyun.com Reference: - [1] [Jiaqi Ma, Zhe Zhao, Xinyang Yi, et al. Modeling Task Relationships in Multi-task Learning with Multi-gate Mixture-of-Experts[C]](https://dl.acm.org/doi/10.1145/3219819.3220007) + [1] Jiaqi Ma, Zhe Zhao, Xinyang Yi, et al. Modeling Task Relationships in Multi-task Learning with Multi-gate Mixture-of-Experts[C]](https://dl.acm.org/doi/10.1145/3219819.3220007) """ import torch import torch.nn as nn From 23407217db034cde0c5bf03475517066319fa6bd Mon Sep 17 00:00:00 2001 From: zanshuxun <631763140@qq.com> Date: Sun, 26 Jun 2022 22:54:52 +0800 Subject: [PATCH 11/47] add_regularization_weight --- deepctr_torch/models/dcnmix.py | 5 ++--- deepctr_torch/models/multitask/mmoe.py | 17 ++++++++++++----- deepctr_torch/models/multitask/sharedbottom.py | 4 ++-- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/deepctr_torch/models/dcnmix.py b/deepctr_torch/models/dcnmix.py index 9b0e97d4..f216d80a 100644 --- a/deepctr_torch/models/dcnmix.py +++ b/deepctr_torch/models/dcnmix.py @@ -70,10 +70,9 @@ def __init__(self, linear_feature_columns, layer_num=cross_num, device=device) self.add_regularization_weight( filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.dnn.named_parameters()), l2=l2_reg_dnn) + self.add_regularization_weight( + filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.crossnet.named_parameters()), l2=l2_reg_dnn) self.add_regularization_weight(self.dnn_linear.weight, l2=l2_reg_linear) - self.add_regularization_weight(self.crossnet.U_list, l2=l2_reg_cross) - self.add_regularization_weight(self.crossnet.V_list, l2=l2_reg_cross) - self.add_regularization_weight(self.crossnet.C_list, l2=l2_reg_cross) self.to(device) def forward(self, X): diff --git a/deepctr_torch/models/multitask/mmoe.py b/deepctr_torch/models/multitask/mmoe.py index 2bfb6774..3b7c6888 100644 --- a/deepctr_torch/models/multitask/mmoe.py +++ b/deepctr_torch/models/multitask/mmoe.py @@ -38,7 +38,8 @@ class MMOE(BaseModel): """ def __init__(self, dnn_feature_columns, num_experts=3, expert_dnn_hidden_units=(64, 32), - gate_dnn_hidden_units=(), tower_dnn_hidden_units=(64,), l2_reg_linear=0.00001, l2_reg_embedding=0.00001, l2_reg_dnn=0, + gate_dnn_hidden_units=(), tower_dnn_hidden_units=(64,), l2_reg_linear=0.00001, + l2_reg_embedding=0.00001, l2_reg_dnn=0, init_std=0.0001, seed=1024, dnn_dropout=0, dnn_activation='relu', dnn_use_bn=False, task_types=('binary', 'binary'), task_names=('ctr', 'ctcvr'), device='cpu', gpus=None): super(MMOE, self).__init__(linear_feature_columns=[], dnn_feature_columns=dnn_feature_columns, @@ -77,7 +78,8 @@ def __init__(self, dnn_feature_columns, num_experts=3, expert_dnn_hidden_units=( self.gate_dnn_final_layer = nn.ModuleList( [nn.Linear(gate_dnn_hidden_units[-1], self.num_experts, bias=False) for _ in range(self.num_tasks)]) self.add_regularization_weight( - filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.gate_dnn.named_parameters()), l2=l2_reg_dnn) + filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.gate_dnn.named_parameters()), + l2=l2_reg_dnn) else: self.gate_dnn_final_layer = nn.ModuleList( [nn.Linear(self.input_dim, self.num_experts, bias=False) for _ in range(self.num_tasks)]) @@ -91,7 +93,8 @@ def __init__(self, dnn_feature_columns, num_experts=3, expert_dnn_hidden_units=( self.tower_dnn_final_layer = nn.ModuleList([nn.Linear(tower_dnn_hidden_units[-1], 1, bias=False) for _ in range(self.num_tasks)]) self.add_regularization_weight( - filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.tower_dnn.named_parameters()), l2=l2_reg_dnn) + filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.tower_dnn.named_parameters()), + l2=l2_reg_dnn) else: self.tower_dnn_final_layer = nn.ModuleList([nn.Linear(expert_dnn_hidden_units[-1], 1, bias=False) for _ in range(self.num_tasks)]) @@ -100,8 +103,12 @@ def __init__(self, dnn_feature_columns, num_experts=3, expert_dnn_hidden_units=( self.add_regularization_weight( filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.expert_dnn.named_parameters()), l2=l2_reg_dnn) - self.add_regularization_weight(self.gate_dnn_final_layer.weight, l2=l2_reg_dnn) - self.add_regularization_weight(self.tower_dnn_final_layer.weight, l2=l2_reg_dnn) + self.add_regularization_weight( + filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.gate_dnn_final_layer.named_parameters()), + l2=l2_reg_dnn) + self.add_regularization_weight( + filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.tower_dnn_final_layer.named_parameters()), + l2=l2_reg_dnn) self.to(device) def forward(self, X): diff --git a/deepctr_torch/models/multitask/sharedbottom.py b/deepctr_torch/models/multitask/sharedbottom.py index b28a9de9..ab7128b0 100644 --- a/deepctr_torch/models/multitask/sharedbottom.py +++ b/deepctr_torch/models/multitask/sharedbottom.py @@ -80,8 +80,8 @@ def __init__(self, dnn_feature_columns, bottom_dnn_hidden_units=(256, 128), towe self.add_regularization_weight( filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.bottom_dnn.named_parameters()), l2=l2_reg_dnn) self.add_regularization_weight( - filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.cvr_dnn.named_parameters()), l2=l2_reg_dnn) - self.add_regularization_weight(self.tower_dnn_final_layer.weight, l2=l2_reg_dnn) + filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.tower_dnn_final_layer.named_parameters()), + l2=l2_reg_dnn) self.to(device) def forward(self, X): From 1663dbcc3f5b6e7b25e8ed2295b8f0627b742273 Mon Sep 17 00:00:00 2001 From: zanshuxun <631763140@qq.com> Date: Tue, 28 Jun 2022 22:52:34 +0800 Subject: [PATCH 12/47] 1 --- deepctr_torch/models/dcnmix.py | 2 +- deepctr_torch/models/multitask/esmm.py | 8 +++----- deepctr_torch/models/multitask/mmoe.py | 2 +- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/deepctr_torch/models/dcnmix.py b/deepctr_torch/models/dcnmix.py index f216d80a..01ef4f5f 100644 --- a/deepctr_torch/models/dcnmix.py +++ b/deepctr_torch/models/dcnmix.py @@ -71,7 +71,7 @@ def __init__(self, linear_feature_columns, self.add_regularization_weight( filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.dnn.named_parameters()), l2=l2_reg_dnn) self.add_regularization_weight( - filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.crossnet.named_parameters()), l2=l2_reg_dnn) + filter(lambda x: ('weight' in x[0] or '_list' in x[0]) and 'bn' not in x[0], self.crossnet.named_parameters()), l2=l2_reg_dnn) self.add_regularization_weight(self.dnn_linear.weight, l2=l2_reg_linear) self.to(device) diff --git a/deepctr_torch/models/multitask/esmm.py b/deepctr_torch/models/multitask/esmm.py index f8d556da..b700ba96 100644 --- a/deepctr_torch/models/multitask/esmm.py +++ b/deepctr_torch/models/multitask/esmm.py @@ -52,14 +52,12 @@ def __init__(self, dnn_feature_columns, tower_dnn_hidden_units=(64,), if task_type != 'binary': raise ValueError("task must be binary in ESMM, {} is illegal".format(task_type)) - self.task_names = task_names - self.input_dim = self.compute_input_dim(dnn_feature_columns) - self.tower_dnn_hidden_units = tower_dnn_hidden_units + input_dim = self.compute_input_dim(dnn_feature_columns) - self.ctr_dnn = DNN(self.input_dim, tower_dnn_hidden_units, activation=dnn_activation, + self.ctr_dnn = DNN(input_dim, tower_dnn_hidden_units, activation=dnn_activation, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, init_std=init_std, device=device) - self.cvr_dnn = DNN(self.input_dim, tower_dnn_hidden_units, activation=dnn_activation, + self.cvr_dnn = DNN(input_dim, tower_dnn_hidden_units, activation=dnn_activation, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, init_std=init_std, device=device) diff --git a/deepctr_torch/models/multitask/mmoe.py b/deepctr_torch/models/multitask/mmoe.py index 3b7c6888..aab76355 100644 --- a/deepctr_torch/models/multitask/mmoe.py +++ b/deepctr_torch/models/multitask/mmoe.py @@ -131,7 +131,7 @@ def forward(self, X): gate_dnn_out = self.gate_dnn_final_layer[i](gate_dnn_out) else: gate_dnn_out = self.gate_dnn_final_layer[i](dnn_input) - gate_mul_expert = torch.matmul(gate_dnn_out.softmax(1).unsqueeze(1), expert_outs) + gate_mul_expert = torch.matmul(gate_dnn_out.softmax(1).unsqueeze(1), expert_outs) # (bs, 1, dim) mmoe_outs.append(gate_mul_expert.squeeze()) # tower dnn (task-specific) From 64ed8fa8e9469d3ca748d667fc2cdf26418936a8 Mon Sep 17 00:00:00 2001 From: zanshuxun <631763140@qq.com> Date: Sat, 2 Jul 2022 10:31:59 +0800 Subject: [PATCH 13/47] byterec_sample.txt --- deepctr_torch/models/basemodel.py | 4 - deepctr_torch/models/multitask/esmm.py | 2 +- deepctr_torch/models/multitask/mmoe.py | 4 +- examples/byterec_sample.txt | 200 ++++++++++++++++++ ...eo.py => run_classification_criteo_zsx.py} | 14 +- examples/run_mtl.py | 72 +++---- 6 files changed, 240 insertions(+), 56 deletions(-) create mode 100644 examples/byterec_sample.txt rename examples/{run_mtl_criteo.py => run_classification_criteo_zsx.py} (88%) diff --git a/deepctr_torch/models/basemodel.py b/deepctr_torch/models/basemodel.py index 4d2d4b94..6a535c5e 100644 --- a/deepctr_torch/models/basemodel.py +++ b/deepctr_torch/models/basemodel.py @@ -246,13 +246,9 @@ def fit(self, x=None, y=None, batch_size=None, epochs=1, verbose=1, initial_epoc optim.zero_grad() if isinstance(loss_func, list): - time1 = time.time() loss = sum([loss_func[i](y_pred[:, i], y[:, i], reduction='sum') for i in range(self.num_tasks)]) - print('time', time.time()-time1) else: - time1 = time.time() loss = loss_func(y_pred, y.squeeze(), reduction='sum') - print('time', time.time()-time1) reg_loss = self.get_regularization_loss() total_loss = loss + reg_loss + self.aux_loss diff --git a/deepctr_torch/models/multitask/esmm.py b/deepctr_torch/models/multitask/esmm.py index b700ba96..719648b0 100644 --- a/deepctr_torch/models/multitask/esmm.py +++ b/deepctr_torch/models/multitask/esmm.py @@ -35,7 +35,7 @@ class ESMM(BaseModel): :return: A PyTorch model instance. """ - def __init__(self, dnn_feature_columns, tower_dnn_hidden_units=(64,), + def __init__(self, dnn_feature_columns, tower_dnn_hidden_units=(256, 128), l2_reg_linear=0.00001, l2_reg_embedding=0.00001, l2_reg_dnn=0, init_std=0.0001, seed=1024, dnn_dropout=0, dnn_activation='relu', dnn_use_bn=False, task_types=('binary', 'binary'), task_names=('ctr', 'ctcvr'), device='cpu', gpus=None): diff --git a/deepctr_torch/models/multitask/mmoe.py b/deepctr_torch/models/multitask/mmoe.py index aab76355..4d0135c3 100644 --- a/deepctr_torch/models/multitask/mmoe.py +++ b/deepctr_torch/models/multitask/mmoe.py @@ -37,8 +37,8 @@ class MMOE(BaseModel): :return: A PyTorch model instance. """ - def __init__(self, dnn_feature_columns, num_experts=3, expert_dnn_hidden_units=(64, 32), - gate_dnn_hidden_units=(), tower_dnn_hidden_units=(64,), l2_reg_linear=0.00001, + def __init__(self, dnn_feature_columns, num_experts=3, expert_dnn_hidden_units=(256, 128), + gate_dnn_hidden_units=(64,), tower_dnn_hidden_units=(64,), l2_reg_linear=0.00001, l2_reg_embedding=0.00001, l2_reg_dnn=0, init_std=0.0001, seed=1024, dnn_dropout=0, dnn_activation='relu', dnn_use_bn=False, task_types=('binary', 'binary'), task_names=('ctr', 'ctcvr'), device='cpu', gpus=None): diff --git a/examples/byterec_sample.txt b/examples/byterec_sample.txt new file mode 100644 index 00000000..56f2847c --- /dev/null +++ b/examples/byterec_sample.txt @@ -0,0 +1,200 @@ +57384 52 43192 142828 0 0 0 0 4513 34178 53085993699 39 +3230 5 46822 231026 1 0 1 0 5330 24878 53086372896 16 +1249 328 1209078 456220 2 0 0 0 39979 14274 53086458433 4 +11928 8 1209079 456221 3 0 0 0 -1 16649 53086463774 9 +51266 89 1209080 126416 4 0 1 0 -1 27090 53086432937 19 +23006 -1 1209081 122067 5 1 0 0 3639 14908 53086163309 10 +12637 265 269351 6757 6 0 1 0 -1 27794 53086427987 4 +42686 140 1209082 178779 7 0 0 0 7 17817 53085001012 10 +1775 28 1209083 1616 8 0 1 0 14463 30899 53086441559 10 +57385 -1 1209084 20448 9 1 0 0 3735 43941 53085729143 14 +10987 115 65804 43245 10 0 1 0 7 17481 53085562259 21 +17534 123 1209085 456222 11 0 0 0 -1 34312 53086389136 10 +17538 110 554984 3889 12 0 0 0 -1 1083 53086422910 9 +12624 248 183163 1605 3 0 0 0 -1 18695 53086200164 9 +53305 91 471042 47416 13 0 0 0 -1 32001 53085240163 10 +7362 12 92647 49301 14 0 0 0 -1 17934 53086324562 10 +42395 31 1209086 73570 15 0 0 0 6725 43942 53086348708 20 +12676 57 18585 61824 1 0 1 0 59 6733 53085889369 9 +10993 -1 1209087 7706 -1 1 0 0 -1 1855 53081848642 10 +37914 99 463540 25534 17 0 0 0 53 9558 53084303614 8 +57386 -1 1209088 192544 18 1 0 0 -1 30858 53085582397 20 +6703 120 1209089 68745 19 0 1 0 -1 800 53086351637 10 +53651 78 224493 127164 20 0 0 0 2464 39844 53086369016 10 +34052 139 22741 12255 21 0 1 0 -1 43943 53086443915 12 +23289 220 1209090 65069 7 0 0 0 -1 41484 53086464402 10 +17656 134 1209091 125019 22 0 0 0 2961 9287 53086424272 10 +49903 62 1209092 12644 23 0 0 0 1283 23498 53085991885 10 +314 97 1209093 15537 24 0 1 0 -1 2580 53086289816 9 +7377 -1 351162 56018 25 1 0 0 685 24475 53083717645 2 +932 91 556678 23862 26 0 1 0 -1 8686 53085672533 9 +19570 99 87257 119609 27 0 0 0 -1 10614 53086436868 20 +42404 68 1209094 166190 28 0 1 0 -1 43944 53084369705 10 +27297 340 126001 8463 29 0 0 0 12 43945 53085685201 21 +16386 61 1209095 456223 30 0 0 0 -1 27835 53086333119 10 +30459 189 66964 65695 31 0 0 0 86 43946 53085224195 11 +21872 67 169542 9925 32 0 0 0 380 11858 53085053660 20 +6585 -1 1209096 431421 33 1 0 0 930 23036 53086255763 10 +8308 13 100302 48578 34 0 0 0 -1 43947 53086092845 9 +5490 -1 1209097 21585 35 2 0 0 -1 1812 53086457907 19 +31894 -1 1209098 62430 20 1 0 0 25 43948 53085956762 19 +9308 177 910755 45495 32 0 0 0 992 7861 53085650077 9 +18284 31 1209099 37899 36 0 0 0 40022 15893 53086436543 19 +12533 148 1209100 504 37 0 1 0 597 32620 53086424288 30 +43738 99 1209101 228209 4 0 1 0 -1 598 53086083418 10 +20495 28 1209102 37442 6 0 0 0 762 7431 53086356318 19 +32444 -1 1209103 57514 38 1 0 0 -1 32160 53073121156 9 +14887 70 387521 10504 33 0 0 0 -1 14217 53086459719 10 +13907 18 1209104 89836 7 0 0 0 -1 12892 53086465351 9 +1978 21 1209105 56257 7 3 0 0 -1 32762 53085674405 10 +11074 99 87164 62916 23 0 0 0 10666 7998 53084717098 10 +16936 189 1209106 456224 39 0 0 0 2510 42756 53086430941 10 +29595 -1 962888 22423 40 1 0 0 -1 43949 53083871230 9 +31471 -1 1209107 456225 -1 1 0 0 -1 43950 53077777264 20 +31257 2 1209108 81329 41 0 1 0 -1 19186 53085397650 35 +57387 299 28992 23643 42 0 0 0 815 43951 53086266457 3 +48809 120 550538 104855 43 0 0 0 1557 20301 53085916634 9 +51750 154 224 4092 44 0 0 0 530 28234 53085818229 21 +57388 3 6736 17438 31 0 1 0 512 33024 53086359747 26 +8824 -1 1209109 97089 45 1 0 0 -1 1281 53086211445 42 +31664 175 230545 9176 42 0 0 0 -1 7911 53086455569 10 +30886 164 1209110 369482 46 3 0 0 -1 40077 53086438047 19 +24495 6 1209111 107478 47 0 1 0 -1 3387 53086000562 7 +57389 151 4273 14567 48 0 0 0 58 43952 53086425175 9 +48604 91 1209112 215101 14 0 1 0 -1 19621 53086367379 6 +45711 -1 1209113 5699 0 1 0 0 25120 9166 53084022649 19 +45715 -1 1209114 365903 49 1 0 0 -1 9180 53083976724 39 +13111 26 1209115 11460 20 0 1 0 21395 18976 53084174668 10 +50505 195 1209116 289843 9 0 0 0 -1 25149 53085409502 19 +11218 159 860980 1799 11 0 0 0 -1 31264 53086434757 21 +57390 138 1209117 456226 39 0 0 0 -1 43953 53086449042 9 +5885 89 339942 91922 50 0 1 0 -1 4363 53086193136 10 +32309 214 1209118 214956 7 0 0 0 -1 12812 53085854063 8 +538 16 1209119 168144 51 0 1 0 -1 32354 53084130452 21 +3298 -1 1209120 46061 49 1 0 0 986 32479 53085530989 10 +4471 120 1209121 4099 -1 0 1 0 -1 6164 53084232132 20 +12436 109 96639 26058 -1 0 0 0 -1 794 53086048818 10 +786 254 1209122 5634 52 0 0 0 -1 4666 53086213277 10 +3893 115 309730 4026 42 0 1 0 -1 6918 53086266560 4 +57391 252 156807 13257 53 0 0 0 -1 43954 53085683310 9 +38728 104 984880 59977 54 0 0 0 -1 21095 53086341571 9 +47654 -1 42316 1511 33 1 1 0 2376 16484 53086343209 6 +7024 68 1209123 57727 33 0 1 0 1947 43955 53085507605 21 +53006 113 536861 277942 55 0 0 0 25 34626 53086102738 9 +6422 243 1209124 68382 56 0 0 0 -1 30431 53086381058 20 +48034 70 204373 456227 57 0 0 0 -1 17745 53086375221 9 +3902 159 113715 23386 33 0 0 0 -1 465 53084330627 12 +33723 106 1209125 456228 48 0 0 0 -1 20225 53085078980 10 +57392 62 1209126 5279 58 0 1 0 -1 37608 53085157706 21 +7878 167 286406 39543 59 0 0 0 -1 38121 53084349382 3 +41801 99 253393 134396 60 0 0 0 -1 43956 53086199899 10 +14575 102 1209127 157421 61 0 0 0 6977 12306 53086336433 10 +6193 21 380271 159138 62 0 1 0 1085 16235 53086434265 9 +2808 35 1209128 12478 63 0 0 0 1219 365 53086443225 9 +8161 51 225233 8390 64 0 1 0 -1 8286 53086357798 9 +4475 1 876313 9922 65 0 1 0 88 6766 53086350963 7 +46666 24 27202 44427 66 0 0 0 -1 12905 53086437135 10 +57393 -1 1209129 25529 -1 1 0 0 -1 31130 53077964861 10 +19680 18 1209130 157447 10 0 1 0 25 43957 53086039170 11 +13100 -1 1209131 21663 67 1 1 0 11895 15995 53086192701 11 +32254 231 101821 63944 68 0 0 0 -1 30803 53086368443 7 +44822 281 174386 2222 6 0 0 0 5403 5556 53086294114 10 +57394 28 1209132 33040 15 0 1 0 82 43958 53085472784 9 +34670 6 1209133 223047 7 0 0 0 -1 34302 53086195312 9 +32322 89 147859 8171 33 0 1 0 14943 41659 53085735562 9 +3849 165 196109 28485 11 0 0 0 -1 35461 53086209969 7 +10113 144 1209134 166541 0 0 1 0 3173 40369 53086344137 10 +9138 242 93680 11061 69 0 0 0 -1 22171 53086372249 4 +46496 -1 1209135 18453 70 1 0 0 -1 12265 53086326271 21 +18091 6 1209136 23906 41 0 0 0 1954 2031 53086300944 10 +23496 75 13941 77103 39 0 1 0 -1 20715 53086431651 9 +5023 -1 1209137 31400 71 1 0 0 4961 2067 53086423223 9 +20213 167 1209090 65069 7 0 1 0 -1 43959 53086464402 10 +57395 128 223408 81805 72 0 0 0 699 43960 53084449852 41 +2603 3 1209138 87825 8 3 0 0 -1 30971 53086470864 21 +32323 166 1209139 64613 73 0 0 0 -1 43961 53085061913 21 +39344 59 1209140 112211 74 0 0 0 -1 28876 53086444185 9 +35643 122 1209141 54552 75 0 1 0 2165 20406 53083925641 9 +37308 99 1209142 73183 22 0 0 0 8647 803 53085339114 9 +3033 -1 1209143 238932 66 1 0 0 -1 33847 53086025083 10 +1021 180 1209144 70707 76 0 0 0 101 15941 53085841282 10 +33864 39 1209145 10562 52 0 1 0 5215 31257 53086429833 9 +54344 122 374671 75564 17 0 0 0 142 37109 53085937838 4 +6600 318 76321 8680 77 0 1 0 36242 34784 53085996007 21 +2557 16 1209146 7350 78 0 1 0 -1 10680 53086432757 10 +57396 -1 334471 3708 79 1 0 0 -1 43962 53086172428 3 +36299 125 138429 58621 4 0 1 0 -1 12793 53086442416 7 +57397 -1 1209147 365461 80 1 0 0 -1 43963 53083235030 7 +15839 155 34074 16382 69 0 0 0 863 10631 53086265255 10 +16421 -1 396354 9739 81 1 1 0 -1 33837 53086115120 2 +23877 68 1209148 404962 82 0 0 0 -1 7440 53086463914 11 +21868 105 164147 1627 54 0 0 0 -1 9284 53086387208 22 +52996 54 32765 64820 11 0 1 0 1083 39501 53086441636 9 +31751 49 808123 52369 29 0 1 0 222 5216 53086356597 10 +9521 138 22819 36233 49 0 0 0 8593 32251 53086453053 7 +30967 -1 328334 201737 33 1 0 0 -1 43964 53084810403 9 +1502 253 1209149 326190 -1 0 0 0 -1 33215 53086257168 10 +15428 47 431747 213115 9 0 1 0 -1 43965 53085155846 20 +903 -1 70297 1634 83 1 0 0 -1 873 53084474769 11 +36342 -1 1209150 29761 84 1 0 0 -1 751 53076340891 9 +16311 57 7596 2191 41 0 0 0 578 15153 53086354469 9 +43656 13 1209151 16060 33 0 1 0 -1 194 53086342969 10 +34411 102 6177 4508 85 0 0 0 7 10287 53084998532 21 +3283 19 1209152 4810 86 0 0 0 3921 2481 53084351967 9 +34642 -1 1209153 17477 87 1 0 0 -1 3241 53085677458 10 +8901 -1 1209154 190193 88 1 0 0 -1 43966 53082311168 10 +57398 234 72330 55748 42 0 0 0 -1 43967 53085884345 7 +2833 194 1209155 65069 7 0 1 0 -1 1264 53086356450 7 +4319 120 213457 73457 73 0 0 0 -1 17768 53085762400 10 +49967 59 335901 47237 5 0 1 0 -1 23665 53086364997 41 +19065 15 4520 1711 89 0 0 0 726 12938 53086466125 21 +2026 40 210879 41756 64 0 1 0 3945 8758 53086110139 7 +20068 19 1565 6131 90 0 0 0 255 38002 53086385908 9 +6767 -1 342364 3961 91 1 0 0 -1 43968 53086004633 10 +57399 220 1209156 76810 84 0 0 0 -1 43969 53085902651 10 +39803 76 1087322 1294 68 0 0 0 -1 1313 53086015088 5 +7545 70 1209157 226515 92 0 1 0 33 2206 53084129401 10 +33308 16 1209158 155935 -1 0 0 0 -1 3787 53086421547 12 +43611 -1 1209159 456229 3 1 0 0 43 14888 53085225379 10 +37325 260 1209160 86437 60 0 0 0 5394 12723 53086085413 9 +14160 78 1209161 17233 93 0 1 0 -1 4880 53086366351 11 +57400 -1 1209162 57242 5 1 0 0 -1 41107 53085655430 4 +22402 264 1209163 57294 82 0 0 0 33468 28113 53085879492 4 +1287 -1 1209164 214922 4 1 1 0 -1 27262 53085767138 5 +57401 195 101650 9227 94 0 0 0 -1 43970 53084784422 10 +1212 167 786663 427 95 0 0 0 172 7187 53085472651 9 +6055 217 11396 43233 0 0 0 0 413 38530 53085458533 7 +13580 266 17281 5921 4 0 0 0 -1 15642 53086442501 10 +9217 46 131537 21621 7 0 1 0 -1 21716 53086405434 24 +3265 -1 1209165 1153 96 1 0 0 -1 6069 53082210290 5 +15694 14 172342 282 13 0 0 0 -1 24617 53086372927 10 +37855 76 1209166 456230 64 0 0 0 491 17177 53084796207 9 +16082 -1 1209167 8216 -1 1 0 0 -1 43971 53079735844 6 +33780 21 43192 142828 0 0 0 0 4513 5630 53085993699 39 +10917 -1 1209168 143408 28 1 1 0 -1 833 53086198926 10 +11606 106 70962 6833 17 0 1 0 -1 43972 53086342197 9 +6709 -1 1209169 203150 4 1 0 0 -1 4668 53086339448 2 +53727 -1 1209170 456231 97 1 0 0 3377 43973 53083952666 3 +54196 138 1209171 52543 72 0 0 0 -1 32954 53086349076 11 +8974 13 1078552 27880 32 0 0 0 68 9228 53086430192 21 +36480 248 54838 2855 98 0 1 0 2710 43974 53085491038 10 +31877 222 1209172 60408 99 0 0 0 -1 43975 53086281553 4 +46879 134 1209173 456232 22 3 0 0 4075 13656 53084046085 2 +4720 -1 1045116 99385 87 1 0 0 -1 30513 53085299798 21 +13306 150 1209174 456233 100 0 0 0 -1 7020 53085167029 7 +28158 -1 1209175 127217 1 2 1 0 -1 19123 53086466767 2 +57402 220 363910 14103 11 0 1 0 61 32320 53086261958 10 +43866 73 1209176 456234 101 0 0 0 46 1215 53086431103 8 +51796 21 34074 16382 69 0 1 0 863 28348 53086265255 10 +53073 -1 1209177 143444 102 1 0 0 307 43976 53085480856 9 +57403 292 1209178 8145 103 0 1 0 1717 43977 53085671625 10 +6939 123 660357 343569 104 0 1 0 -1 3345 53085594143 40 +6430 73 1209179 456235 78 0 0 0 -1 30700 53086424096 7 +50941 60 163999 39568 31 0 0 0 1899 26232 53086012435 6 +809 171 752253 21663 67 0 0 0 2814 4610 53086431679 10 +13589 31 544024 51861 34 0 1 0 -1 3838 53085543451 19 +32619 20 1209180 139406 105 0 1 0 -1 30866 53086389242 4 +9575 106 1209181 456236 89 0 1 0 -1 34766 53085956868 8 +51720 80 1209182 2453 -1 0 0 0 -1 28174 53084376234 3 +19622 286 1209183 2246 106 0 0 0 16621 43978 53083857346 9 +13205 -1 1209184 233266 107 1 1 0 1261 43979 53086370106 10 diff --git a/examples/run_mtl_criteo.py b/examples/run_classification_criteo_zsx.py similarity index 88% rename from examples/run_mtl_criteo.py rename to examples/run_classification_criteo_zsx.py index 4de17670..89723c49 100644 --- a/examples/run_mtl_criteo.py +++ b/examples/run_classification_criteo_zsx.py @@ -16,7 +16,7 @@ data[sparse_features] = data[sparse_features].fillna('-1', ) data[dense_features] = data[dense_features].fillna(0, ) - target = ['label', 'label'] + target = ['label'] # 1.Label Encoding for sparse features,and do simple Transformation for dense features for feat in sparse_features: @@ -44,16 +44,19 @@ test_model_input = {name: test[name] for name in feature_names} # 4.Define Model,train,predict and evaluate + device = 'cpu' use_cuda = True if use_cuda and torch.cuda.is_available(): print('cuda ready...') device = 'cuda:0' - model = ESMM(dnn_feature_columns, task_types=['binary', 'binary'], - l2_reg_embedding=1e-5, task_names=target, device=device) - model.compile("adagrad", loss="binary_crossentropy", - metrics=['binary_crossentropy'], ) + model = DCNMix(linear_feature_columns=[], dnn_feature_columns=dnn_feature_columns, + task='binary', + l2_reg_embedding=1e-5, device=device) + + model.compile("adagrad", "binary_crossentropy", + metrics=["binary_crossentropy", "auc"], ) history = model.fit(train_model_input, train[target].values, batch_size=32, epochs=10, verbose=2, validation_split=0.2) @@ -62,3 +65,4 @@ print("test LogLoss", round(log_loss(test[target].values, pred_ans), 4)) print("test AUC", round(roc_auc_score(test[target].values, pred_ans), 4)) print(pred_ans) + diff --git a/examples/run_mtl.py b/examples/run_mtl.py index dc3691a7..de23bfbe 100644 --- a/examples/run_mtl.py +++ b/examples/run_mtl.py @@ -1,79 +1,63 @@ # -*- coding: utf-8 -*- import pandas as pd import torch -from sklearn.metrics import roc_auc_score -from sklearn.model_selection import train_test_split +from sklearn.metrics import log_loss, roc_auc_score from sklearn.preprocessing import LabelEncoder, MinMaxScaler from deepctr_torch.inputs import SparseFeat, DenseFeat, get_feature_names -from deepctr_torch.models import MMOE +from deepctr_torch.models import * if __name__ == "__main__": - column_names = ['age', 'class_worker', 'det_ind_code', 'det_occ_code', 'education', 'wage_per_hour', 'hs_college', - 'marital_stat', 'major_ind_code', 'major_occ_code', 'race', 'hisp_origin', 'sex', 'union_member', - 'unemp_reason', 'full_or_part_emp', 'capital_gains', 'capital_losses', 'stock_dividends', - 'tax_filer_stat', 'region_prev_res', 'state_prev_res', 'det_hh_fam_stat', 'det_hh_summ', - 'instance_weight', 'mig_chg_msa', 'mig_chg_reg', 'mig_move_reg', 'mig_same', 'mig_prev_sunbelt', - 'num_emp', 'fam_under_18', 'country_father', 'country_mother', 'country_self', 'citizenship', - 'own_or_self', 'vet_question', 'vet_benefits', 'weeks_worked', 'year', 'income_50k'] - data = pd.read_csv('./census-income.sample', header=None, names=column_names) + # data description can be found in http://ai-lab-challenge.bytedance.com/tce/vc/ + data = pd.read_csv('./byterec_sample.txt', sep='\t', + names=["uid", "user_city", "item_id", "author_id", "item_city", "channel", "finish", "like", + "music_id", "device", "time", "duration_time"]) - data['label_income'] = data['income_50k'].map({' - 50000.': 0, ' 50000+.': 1}) - data['label_marital'] = data['marital_stat'].apply(lambda x: 1 if x == ' Never married' else 0) - data.drop(labels=['income_50k', 'marital_stat'], axis=1, inplace=True) - target = ["label_income", "label_marital"] + sparse_features = ["uid", "user_city", "item_id", "author_id", "item_city", "channel", "music_id", "device"] + dense_features = ["duration_time"] - columns = data.columns.values.tolist() - sparse_features = ['class_worker', 'det_ind_code', 'det_occ_code', 'education', 'hs_college', 'major_ind_code', - 'major_occ_code', 'race', 'hisp_origin', 'sex', 'union_member', 'unemp_reason', - 'full_or_part_emp', 'tax_filer_stat', 'region_prev_res', 'state_prev_res', 'det_hh_fam_stat', - 'det_hh_summ', 'mig_chg_msa', 'mig_chg_reg', 'mig_move_reg', 'mig_same', 'mig_prev_sunbelt', - 'fam_under_18', 'country_father', 'country_mother', 'country_self', 'citizenship', - 'vet_question'] - sparse_features = ['age'] - # dense_features = [col for col in columns if - # col not in sparse_features and col not in target] - # - # data[sparse_features] = data[sparse_features].fillna('-1', ) - # data[dense_features] = data[dense_features].fillna(0, ) - # mms = MinMaxScaler(feature_range=(0, 1)) - # data[dense_features] = mms.fit_transform(data[dense_features]) + target = ['finish', 'like'] + # 1.Label Encoding for sparse features,and do simple Transformation for dense features for feat in sparse_features: lbe = LabelEncoder() data[feat] = lbe.fit_transform(data[feat]) + mms = MinMaxScaler(feature_range=(0, 1)) + data[dense_features] = mms.fit_transform(data[dense_features]) + + # 2.count #unique features for each sparse field,and record dense feature field name fixlen_feature_columns = [SparseFeat(feat, vocabulary_size=data[feat].max() + 1, embedding_dim=4) - for feat in sparse_features] #+ [DenseFeat(feat, 1, ) for feat in dense_features] + for feat in sparse_features] + [DenseFeat(feat, 1, ) + for feat in dense_features] dnn_feature_columns = fixlen_feature_columns linear_feature_columns = fixlen_feature_columns - feature_names = get_feature_names(linear_feature_columns + dnn_feature_columns) + feature_names = get_feature_names( + linear_feature_columns + dnn_feature_columns) # 3.generate input data for model - train, test = train_test_split(data, test_size=0.2, random_state=2020) + split_boundary = int(data.shape[0] * 0.8) + train, test = data[:split_boundary], data[split_boundary:] train_model_input = {name: train[name] for name in feature_names} test_model_input = {name: test[name] for name in feature_names} # 4.Define Model,train,predict and evaluate - torch.autograd.set_detect_anomaly(True) device = 'cpu' use_cuda = True if use_cuda and torch.cuda.is_available(): print('cuda ready...') device = 'cuda:0' - model = MMOE(dnn_feature_columns, tower_dnn_hidden_units=[], task_types=['binary', 'binary'], - task_names=target) - model.compile("adam", loss=["binary_crossentropy", "binary_crossentropy"], + model = MMOE(dnn_feature_columns, task_types=['binary', 'binary'], + l2_reg_embedding=1e-5, task_names=target, device=device) + model.compile("adagrad", loss="binary_crossentropy", metrics=['binary_crossentropy'], ) - history = model.fit(train_model_input, train[target].values, - batch_size=4, epochs=10, verbose=2) - pred_ans = model.predict(test_model_input, batch_size=256) - - print("test income AUC", round(roc_auc_score(test['label_income'], pred_ans[0]), 4)) - print("test marital AUC", round(roc_auc_score(test['label_marital'], pred_ans[1]), 4)) - print(pred_ans) + history = model.fit(train_model_input, train[target].values, batch_size=32, epochs=10, verbose=2) + pred_ans = model.predict(test_model_input, 256) + print("") + print("test LogLoss", round(log_loss(test[target].values, pred_ans), 4)) + print("test AUC", round(roc_auc_score(test[target].values, pred_ans), 4)) \ No newline at end of file From f3707014f3ea511734d97feb2eb83ed2c26a7fa0 Mon Sep 17 00:00:00 2001 From: zanshuxun <631763140@qq.com> Date: Sat, 2 Jul 2022 10:35:49 +0800 Subject: [PATCH 14/47] format --- examples/run_classification_criteo.py | 2 - examples/run_classification_criteo_zsx.py | 68 ----------------------- examples/run_mtl.py | 2 +- 3 files changed, 1 insertion(+), 71 deletions(-) delete mode 100644 examples/run_classification_criteo_zsx.py diff --git a/examples/run_classification_criteo.py b/examples/run_classification_criteo.py index 1a5fd9c3..67fb3d9a 100644 --- a/examples/run_classification_criteo.py +++ b/examples/run_classification_criteo.py @@ -64,5 +64,3 @@ print("") print("test LogLoss", round(log_loss(test[target].values, pred_ans), 4)) print("test AUC", round(roc_auc_score(test[target].values, pred_ans), 4)) - print(pred_ans) - diff --git a/examples/run_classification_criteo_zsx.py b/examples/run_classification_criteo_zsx.py deleted file mode 100644 index 89723c49..00000000 --- a/examples/run_classification_criteo_zsx.py +++ /dev/null @@ -1,68 +0,0 @@ -# -*- coding: utf-8 -*- -import pandas as pd -import torch -from sklearn.metrics import log_loss, roc_auc_score -from sklearn.model_selection import train_test_split -from sklearn.preprocessing import LabelEncoder, MinMaxScaler - -from deepctr_torch.inputs import SparseFeat, DenseFeat, get_feature_names -from deepctr_torch.models import * - -if __name__ == "__main__": - data = pd.read_csv('./criteo_sample.txt') - - sparse_features = ['C' + str(i) for i in range(1, 27)] - dense_features = ['I' + str(i) for i in range(1, 14)] - - data[sparse_features] = data[sparse_features].fillna('-1', ) - data[dense_features] = data[dense_features].fillna(0, ) - target = ['label'] - - # 1.Label Encoding for sparse features,and do simple Transformation for dense features - for feat in sparse_features: - lbe = LabelEncoder() - data[feat] = lbe.fit_transform(data[feat]) - mms = MinMaxScaler(feature_range=(0, 1)) - data[dense_features] = mms.fit_transform(data[dense_features]) - - # 2.count #unique features for each sparse field,and record dense feature field name - - fixlen_feature_columns = [SparseFeat(feat, vocabulary_size=data[feat].max() + 1, embedding_dim=4) - for feat in sparse_features] + [DenseFeat(feat, 1, ) - for feat in dense_features] - - dnn_feature_columns = fixlen_feature_columns - linear_feature_columns = fixlen_feature_columns - - feature_names = get_feature_names( - linear_feature_columns + dnn_feature_columns) - - # 3.generate input data for model - - train, test = train_test_split(data, test_size=0.2, random_state=2020) - train_model_input = {name: train[name] for name in feature_names} - test_model_input = {name: test[name] for name in feature_names} - - # 4.Define Model,train,predict and evaluate - - device = 'cpu' - use_cuda = True - if use_cuda and torch.cuda.is_available(): - print('cuda ready...') - device = 'cuda:0' - - model = DCNMix(linear_feature_columns=[], dnn_feature_columns=dnn_feature_columns, - task='binary', - l2_reg_embedding=1e-5, device=device) - - model.compile("adagrad", "binary_crossentropy", - metrics=["binary_crossentropy", "auc"], ) - - history = model.fit(train_model_input, train[target].values, batch_size=32, epochs=10, verbose=2, - validation_split=0.2) - pred_ans = model.predict(test_model_input, 256) - print("") - print("test LogLoss", round(log_loss(test[target].values, pred_ans), 4)) - print("test AUC", round(roc_auc_score(test[target].values, pred_ans), 4)) - print(pred_ans) - diff --git a/examples/run_mtl.py b/examples/run_mtl.py index de23bfbe..51d7936a 100644 --- a/examples/run_mtl.py +++ b/examples/run_mtl.py @@ -60,4 +60,4 @@ pred_ans = model.predict(test_model_input, 256) print("") print("test LogLoss", round(log_loss(test[target].values, pred_ans), 4)) - print("test AUC", round(roc_auc_score(test[target].values, pred_ans), 4)) \ No newline at end of file + print("test AUC", round(roc_auc_score(test[target].values, pred_ans), 4)) From 9f3a51cd9d79667360b75e40cb3203673728e92f Mon Sep 17 00:00:00 2001 From: zanshuxun <631763140@qq.com> Date: Sat, 2 Jul 2022 10:36:37 +0800 Subject: [PATCH 15/47] format --- deepctr_torch/models/basemodel.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/deepctr_torch/models/basemodel.py b/deepctr_torch/models/basemodel.py index 6a535c5e..557c4a65 100644 --- a/deepctr_torch/models/basemodel.py +++ b/deepctr_torch/models/basemodel.py @@ -246,7 +246,8 @@ def fit(self, x=None, y=None, batch_size=None, epochs=1, verbose=1, initial_epoc optim.zero_grad() if isinstance(loss_func, list): - loss = sum([loss_func[i](y_pred[:, i], y[:, i], reduction='sum') for i in range(self.num_tasks)]) + loss = sum( + [loss_func[i](y_pred[:, i], y[:, i], reduction='sum') for i in range(self.num_tasks)]) else: loss = loss_func(y_pred, y.squeeze(), reduction='sum') reg_loss = self.get_regularization_loss() From a1de4a9ecc9548e725e537350fecc924e7ebb600 Mon Sep 17 00:00:00 2001 From: zanshuxun <631763140@qq.com> Date: Sat, 2 Jul 2022 10:37:09 +0800 Subject: [PATCH 16/47] format --- examples/census-income.sample | 200 ---------------------------------- 1 file changed, 200 deletions(-) delete mode 100644 examples/census-income.sample diff --git a/examples/census-income.sample b/examples/census-income.sample deleted file mode 100644 index 76069905..00000000 --- a/examples/census-income.sample +++ /dev/null @@ -1,200 +0,0 @@ -138481,62, Private,43,23, High school graduate,0, Not in universe, Married-civilian spouse present, Education, Adm support including clerical, White, All other, Female, Not in universe, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Householder, Householder,1819.08, ?, ?, ?, Not in universe under 1 year old, ?,4, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, 50000+. -91960,18, Private,40,19, 11th grade,0, High school, Never married, Entertainment, Sales, Black, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Single, Not in universe, Not in universe, Child 18+ never marr Not in a subfamily, Child 18 or older,645.07, Nonmover, Nonmover, Nonmover, Yes, Not in universe,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. -112171,19, Not in universe,0,0, High school graduate,0, College or university, Never married, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Single, Not in universe, Not in universe, Child 18+ never marr Not in a subfamily, Child 18 or older,396.66, Nonmover, Nonmover, Nonmover, Yes, Not in universe,1, Not in universe, United-States, United-States, United-States, Native- Born in the United States,2, Not in universe,2,16,94, - 50000. -118554,9, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, Mexican-American, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,2052.26, ?, ?, ?, Not in universe under 1 year old, ?,0, Mother only present, Mexico, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. -193623,31, Private,45,3, Bachelors degree(BA AB BS),0, Not in universe, Never married, Other professional services, Executive admin and managerial, Black, All other, Male, Not in universe, Not in universe, Full-time schedules,0,0,0, Single, Not in universe, Not in universe, Nonfamily householder, Householder,614.61, ?, ?, ?, Not in universe under 1 year old, ?,3, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. -198699,29, Private,33,29, Bachelors degree(BA AB BS),0, Not in universe, Married-civilian spouse present, Retail trade, Other service, White, All other, Female, Not in universe, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Householder, Householder,1971.05, ?, ?, ?, Not in universe under 1 year old, ?,2, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. -85495,52, Not in universe,0,0, High school graduate,0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Not in labor force,0,0,0, Nonfiler, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1079.49, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, Peru, Peru, Peru, Foreign born- U S citizen by naturalization,0, Not in universe,2,0,95, - 50000. -196125,0, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, Asian or Pacific Islander, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,1774.28, Not in universe, Not in universe, Not in universe, Not in universe under 1 year old, Not in universe,0, Both parents present, Taiwan, Taiwan, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. -132109,16, Private,33,41, 9th grade,0, High school, Never married, Retail trade, Handlers equip cleaners etc , White, All other, Male, Not in universe, Job loser - on layoff, Children or Armed Forces,0,0,0, Single, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,368.31, Nonmover, Nonmover, Nonmover, Yes, Not in universe,4, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. -31996,6, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,1272.86, ?, ?, ?, Not in universe under 1 year old, ?,0, Both parents present, United-States, Italy, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. -197276,25, Private,8,36, 12th grade no diploma,0, Not in universe, Married-civilian spouse present, Manufacturing-durable goods, Machine operators assmblrs & inspctrs, White, Central or South American, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Joint both under 65, West, California, Householder, Householder,1964.79, MSA to MSA, Same county, Same county, No, Yes,2, Not in universe, El-Salvador, El-Salvador, El-Salvador, Foreign born- Not a citizen of U S ,0, Not in universe,2,20,94, - 50000. -43637,52, Private,37,31, 11th grade,0, Not in universe, Never married, Business and repair services, Other service, Black, All other, Female, Not in universe, Not in universe, Full-time schedules,0,0,0, Single, Not in universe, Not in universe, Nonfamily householder, Householder,4059.47, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,2, Not in universe,2,52,95, - 50000. -160024,3, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, Mexican-American, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,927.49, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. -184841,7, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, NA, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,1516.17, ?, ?, ?, Not in universe under 1 year old, ?,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. -90343,2, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, Asian or Pacific Islander, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,890.26, ?, ?, ?, Not in universe under 1 year old, ?,0, Both parents present, Philippines, Philippines, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. -196773,72, Not in universe,0,0, High school graduate,0, Not in universe, Widowed, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Not in labor force,0,0,0, Nonfiler, Not in universe, Not in universe, Nonfamily householder, Householder,589.54, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, Germany, Germany, Germany, Foreign born- U S citizen by naturalization,0, Not in universe,2,0,95, - 50000. -102326,61, Private,35,26, High school graduate,0, Not in universe, Divorced, Finance insurance and real estate, Adm support including clerical, White, All other, Female, No, Not in universe, Full-time schedules,0,0,0, Single, Not in universe, Not in universe, Nonfamily householder, Householder,1042.72, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. -94179,45, Self-employed-not incorporated,33,19, Associates degree-occup /vocational,0, Not in universe, Divorced, Retail trade, Sales, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,1602,0, Single, Not in universe, Not in universe, Child 18+ ever marr Not in a subfamily, Child 18 or older,4184.67, Nonmover, Nonmover, Nonmover, Yes, Not in universe,1, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. -115094,45, Private,3,39, Some college but no degree,725, Not in universe, Married-civilian spouse present, Mining, Transportation and material moving, White, All other, Male, No, Not in universe, Children or Armed Forces,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1361.67, Nonmover, Nonmover, Nonmover, Yes, Not in universe,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,2, Not in universe,2,48,94, - 50000. -139808,13, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, Other, Mexican-American, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,1749.06, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. -10547,12, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,2473.12, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Mother only present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. -140760,27, Not in universe,0,0, 5th or 6th grade,0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, Mexican (Mexicano), Female, Not in universe, Not in universe, Not in labor force,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,2523.97, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, Mexico, Mexico, Mexico, Foreign born- Not a citizen of U S ,0, Not in universe,2,0,95, - 50000. -143136,11, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,2195.61, ?, ?, ?, Not in universe under 1 year old, ?,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. -198740,25, Private,37,2, Bachelors degree(BA AB BS),0, Not in universe, Never married, Business and repair services, Executive admin and managerial, Asian or Pacific Islander, All other, Female, Not in universe, Not in universe, Full-time schedules,0,0,10, Single, Not in universe, Not in universe, Other Rel 18+ never marr not in subfamily, Other relative of householder,1152.64, ?, ?, ?, Not in universe under 1 year old, ?,3, Not in universe, Philippines, Philippines, Philippines, Foreign born- Not a citizen of U S ,0, Not in universe,2,50,95, - 50000. -171302,5, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, Black, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,467.65, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. -51270,45, Private,38,31, High school graduate,0, Not in universe, Married-civilian spouse present, Business and repair services, Other service, White, All other, Female, Not in universe, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1155.2, ?, ?, ?, Not in universe under 1 year old, ?,4, Not in universe, Poland, Poland, Poland, Foreign born- Not a citizen of U S ,0, Not in universe,2,16,95, - 50000. -102571,16, Private,33,19, 10th grade,0, High school, Never married, Retail trade, Sales, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Single, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,2072.15, Nonmover, Nonmover, Nonmover, Yes, Not in universe,6, Mother only present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,20,94, - 50000. -87901,46, Private,45,4, Bachelors degree(BA AB BS),0, Not in universe, Never married, Other professional services, Professional specialty, White, All other, Male, No, Not in universe, Full-time schedules,0,0,0, Single, Not in universe, Not in universe, Nonfamily householder, Householder,2405.49, ?, ?, ?, Not in universe under 1 year old, ?,2, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,45,95, 50000+. -40034,37, Private,39,2, High school graduate,0, Not in universe, Divorced, Personal services except private HH, Executive admin and managerial, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Head of household, Not in universe, Not in universe, Householder, Householder,1456.55, Nonmover, Nonmover, Nonmover, Yes, Not in universe,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. -91671,42, Self-employed-not incorporated,44,32, High school graduate,0, Not in universe, Married-civilian spouse present, Social services, Other service, White, All other, Female, Not in universe, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1141.93, ?, ?, ?, Not in universe under 1 year old, ?,1, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,50,95, - 50000. -97009,14, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,900.5, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Mother only present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. -178794,76, Not in universe,0,0, 10th grade,0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Not in labor force,0,0,0, Nonfiler, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1131.39, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,95, - 50000. -84772,30, Not in universe,0,0, Bachelors degree(BA AB BS),0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, Mexican (Mexicano), Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Joint both under 65, West, California, Spouse of householder, Spouse of householder,1707.88, MSA to MSA, Same county, Same county, No, Yes,0, Not in universe, Mexico, Mexico, Mexico, Foreign born- Not a citizen of U S ,0, Not in universe,2,0,94, - 50000. -7953,79, Not in universe,0,0, 11th grade,0, Not in universe, Widowed, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,119, Head of household, Not in universe, Not in universe, Householder, Householder,1644.11, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,94, - 50000. -56916,27, Private,39,32, High school graduate,0, Not in universe, Never married, Personal services except private HH, Other service, Black, All other, Female, Not in universe, Not in universe, Full-time schedules,0,0,0, Head of household, Not in universe, Not in universe, RP of unrelated subfamily, Nonrelative of householder,1717.06, ?, ?, ?, Not in universe under 1 year old, ?,2, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. -150887,5, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, Black, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child under 18 of RP of unrel subfamily, Nonrelative of householder,4578.98, ?, ?, ?, Not in universe under 1 year old, ?,0, Mother only present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. -182649,5, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, Amer Indian Aleut or Eskimo, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,1020.52, ?, ?, ?, Not in universe under 1 year old, ?,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. -177755,69, State government,50,28, High school graduate,0, Not in universe, Married-civilian spouse present, Public administration, Protective services, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,5, Joint one under 65 & one 65+, Not in universe, Not in universe, Householder, Householder,404.72, Nonmover, Nonmover, Nonmover, Yes, Not in universe,1, Not in universe, ?, ?, United-States, Native- Born in the United States,0, Not in universe,2,6,94, - 50000. -143031,69, Not in universe,0,0, 7th and 8th grade,0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,400, Nonfiler, Not in universe, Not in universe, Householder, Householder,1723.61, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Not in universe, Poland, Poland, Poland, Foreign born- U S citizen by naturalization,0, Not in universe,2,0,94, - 50000. -17047,46, Local government,43,10, Masters degree(MA MS MEng MEd MSW MBA),0, Not in universe, Divorced, Education, Professional specialty, White, All other, Female, Yes, Not in universe, Children or Armed Forces,0,1876,139, Single, Not in universe, Not in universe, Nonfamily householder, Householder,1722.26, Nonmover, Nonmover, Nonmover, Yes, Not in universe,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,36,94, - 50000. -5446,57, Private,42,13, Associates degree-occup /vocational,1329, Not in universe, Divorced, Medical except hospital, Technicians and related support, White, All other, Female, No, Not in universe, Children or Armed Forces,2202,0,0, Single, Not in universe, Not in universe, Nonfamily householder, Householder,1168.63, Nonmover, Nonmover, Nonmover, Yes, Not in universe,2, Not in universe, United-States, United-States, United-States, Native- Born in the United States,2, Not in universe,2,52,94, - 50000. -171213,14, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,1793.11, ?, ?, ?, Not in universe under 1 year old, ?,0, Mother only present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. -173292,43, Private,21,26, High school graduate,0, Not in universe, Married-civilian spouse present, Manufacturing-nondurable goods, Adm support including clerical, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,3762.14, Nonmover, Nonmover, Nonmover, Yes, Not in universe,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. -79813,5, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,3050.97, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Both parents present, ?, ?, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. -181506,57, Private,27,35, High school graduate,0, Not in universe, Married-civilian spouse present, Manufacturing-nondurable goods, Precision production craft & repair, White, Puerto Rican, Male, Not in universe, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1101.85, ?, ?, ?, Not in universe under 1 year old, ?,3, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. -67884,0, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,970.2, Not in universe, Not in universe, Not in universe, Not in universe under 1 year old, Not in universe,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. -1095,0, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, Asian or Pacific Islander, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,1952.21, ?, ?, ?, Not in universe under 1 year old, ?,0, Both parents present, Poland, ?, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. -47621,47, Private,39,31, 11th grade,0, Not in universe, Married-civilian spouse present, Personal services except private HH, Other service, White, Central or South American, Male, Not in universe, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Householder, Householder,791.11, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, Columbia, Native- Born abroad of American Parent(s),0, Not in universe,2,52,95, - 50000. -65460,49, State government,43,3, Bachelors degree(BA AB BS),0, Not in universe, Divorced, Education, Executive admin and managerial, White, All other, Male, Not in universe, Not in universe, Full-time schedules,0,0,0, Single, Not in universe, Not in universe, Householder, Householder,251.25, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, Canada, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. -140996,47, Private,33,26, 5th or 6th grade,0, Not in universe, Married-civilian spouse present, Retail trade, Adm support including clerical, White, Mexican-American, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1283.79, Nonmover, Nonmover, Nonmover, Yes, Not in universe,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,1,94, - 50000. -23431,31, Self-employed-not incorporated,2,43, High school graduate,0, Not in universe, Married-civilian spouse present, Agriculture, Farming forestry and fishing, White, All other, Female, Not in universe, Not in universe, PT for non-econ reasons usually FT,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,823.78, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,95, - 50000. -18488,57, Not in universe,0,0, High school graduate,0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, Black, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Joint both under 65, Not in universe, Not in universe, Householder, Householder,548.37, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,94, - 50000. -63908,19, Private,33,29, Some college but no degree,0, College or university, Never married, Retail trade, Other service, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Single, Not in universe, Not in universe, Grandchild 18+ never marr not in subfamily, Other relative of householder,942.2, Nonmover, Nonmover, Nonmover, Yes, Not in universe,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,2, Not in universe,2,52,94, - 50000. -147955,25, Not in universe,0,0, Bachelors degree(BA AB BS),0, Not in universe, Never married, Not in universe or children, Not in universe, White, Other Spanish, Male, Not in universe, Not in universe, Not in labor force,0,0,0, Nonfiler, Not in universe, Not in universe, Nonfamily householder, Householder,1087.39, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, Mexico, Puerto-Rico, Mexico, Native- Born abroad of American Parent(s),0, Not in universe,2,0,95, - 50000. -1219,43, Private,33,26, High school graduate,0, Not in universe, Married-civilian spouse present, Retail trade, Adm support including clerical, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,50, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,3440.67, Nonmover, Nonmover, Nonmover, Yes, Not in universe,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. -98929,44, Private,30,26, Bachelors degree(BA AB BS),0, Not in universe, Never married, Communications, Adm support including clerical, Black, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Head of household, Not in universe, Not in universe, Householder, Householder,1040.96, Nonmover, Nonmover, Nonmover, Yes, Not in universe,5, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. -64415,34, Local government,47,28, Some college but no degree,0, Not in universe, Never married, Public administration, Protective services, White, All other, Male, Not in universe, Not in universe, Full-time schedules,0,0,0, Single, Not in universe, Not in universe, Nonfamily householder, Householder,1161.47, ?, ?, ?, Not in universe under 1 year old, ?,3, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, No,1,52,95, - 50000. -197617,14, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,2177.31, ?, ?, ?, Not in universe under 1 year old, ?,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. -178368,35, Not in universe,0,0, 9th grade,0, Not in universe, Never married, Not in universe or children, Not in universe, Black, All other, Male, Not in universe, Not in universe, Not in labor force,0,0,0, Nonfiler, Not in universe, Not in universe, Nonfamily householder, Householder,1864.42, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,95, - 50000. -40399,19, Not in universe,0,0, Some college but no degree,0, College or university, Never married, Not in universe or children, Not in universe, Asian or Pacific Islander, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child 18+ never marr Not in a subfamily, Child 18 or older,598.21, Nonmover, Nonmover, Nonmover, Yes, Not in universe,2, Not in universe, United-States, ?, United-States, Native- Born in the United States,0, Not in universe,2,13,94, - 50000. -157159,22, Self-employed-not incorporated,37,15, Associates degree-occup /vocational,0, Not in universe, Never married, Business and repair services, Technicians and related support, White, All other, Male, Not in universe, Not in universe, Full-time schedules,0,0,0, Single, Not in universe, Not in universe, Secondary individual, Nonrelative of householder,4074.15, ?, ?, ?, Not in universe under 1 year old, ?,1, Not in universe, United-States, United-States, Holand-Netherlands, Native- Born abroad of American Parent(s),0, Not in universe,2,36,95, - 50000. -39951,45, Federal government,49,1, Masters degree(MA MS MEng MEd MSW MBA),0, Not in universe, Divorced, Public administration, Executive admin and managerial, White, All other, Female, Not in universe, Not in universe, Full-time schedules,0,1980,0, Single, Not in universe, Not in universe, Householder, Householder,1632.8, ?, ?, ?, Not in universe under 1 year old, ?,3, Not in universe, United-States, United-States, United-States, Native- Born in the United States,2, Not in universe,2,52,95, - 50000. -80149,28, Private,39,31, 5th or 6th grade,0, Not in universe, Never married, Personal services except private HH, Other service, White, Mexican (Mexicano), Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Single, Not in universe, Not in universe, Other Rel 18+ never marr not in subfamily, Other relative of householder,2028.73, Nonmover, Nonmover, Nonmover, Yes, Not in universe,6, Not in universe, Mexico, Mexico, Mexico, Foreign born- U S citizen by naturalization,2, Not in universe,2,52,94, - 50000. -33078,70, Not in universe,0,0, High school graduate,0, Not in universe, Widowed, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Not in labor force,401,0,0, Single, Not in universe, Not in universe, Nonfamily householder, Householder,983.2, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, Canada, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,95, - 50000. -118945,6, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,1702.46, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. -173073,17, Not in universe,0,0, 11th grade,0, High school, Never married, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Not in labor force,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,1522.83, ?, ?, ?, Not in universe under 1 year old, ?,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,95, - 50000. -154955,33, Private,42,13, Some college but no degree,0, Not in universe, Divorced, Medical except hospital, Technicians and related support, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,177, Single, Not in universe, Not in universe, Nonfamily householder, Householder,2359.01, Nonmover, Nonmover, Nonmover, Yes, Not in universe,4, Not in universe, United-States, Germany, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. -22221,63, Not in universe,0,0, 10th grade,0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,7959.51, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,94, - 50000. -38335,33, Not in universe,0,0, 5th or 6th grade,0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, Mexican-American, Female, Not in universe, Not in universe, Not in labor force,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1363.13, ?, ?, ?, Not in universe under 1 year old, ?,4, Not in universe, Mexico, Mexico, Mexico, Foreign born- Not a citizen of U S ,0, Not in universe,2,52,95, - 50000. -123934,10, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,1778.48, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. -185904,64, Not in universe,0,0, High school graduate,0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Not in labor force,0,0,24, Joint one under 65 & one 65+, Not in universe, Not in universe, Spouse of householder, Spouse of householder,2461.72, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,95, - 50000. -71771,39, Private,29,38, Some college but no degree,0, Not in universe, Never married, Transportation, Transportation and material moving, White, Mexican-American, Male, Not in universe, Not in universe, Full-time schedules,0,0,0, Single, Not in universe, Not in universe, Nonfamily householder, Householder,702.43, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. -69160,2, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,926.58, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. -147725,77, Not in universe,0,0, Prof school degree (MD DDS DVM LLB JD),0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,1455,0,0, Joint both 65+, Not in universe, Not in universe, Householder, Householder,1623.8, Nonmover, Nonmover, Nonmover, Yes, Not in universe,1, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,1,94, - 50000. -84225,6, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,2589.81, ?, ?, ?, Not in universe under 1 year old, ?,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. -58184,42, Private,5,36, High school graduate,0, Not in universe, Married-civilian spouse present, Manufacturing-durable goods, Machine operators assmblrs & inspctrs, White, All other, Male, Not in universe, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Householder, Householder,2553.09, ?, ?, ?, Not in universe under 1 year old, ?,4, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. -191708,30, Private,33,19, High school graduate,0, Not in universe, Never married, Retail trade, Sales, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Single, Midwest, Tennessee, Child 18+ never marr Not in a subfamily, Child 18 or older,433.4, NonMSA to nonMSA, Same county, Same county, No, No,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. -73103,48, Private,33,12, Some college but no degree,0, Not in universe, Married-civilian spouse present, Retail trade, Professional specialty, White, All other, Female, Not in universe, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Householder, Householder,281.59, ?, ?, ?, Not in universe under 1 year old, ?,2, Not in universe, United-States, United-States, United-States, Native- Born in the United States,1, Not in universe,2,25,95, - 50000. -25855,20, Never worked,0,0, Some college but no degree,0, College or university, Never married, Not in universe or children, Not in universe, Asian or Pacific Islander, All other, Female, Not in universe, New entrant, Unemployed part- time,0,0,0, Nonfiler, Not in universe, Not in universe, In group quarters, Group Quarters- Secondary individual,1394.7, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, South Korea, South Korea, South Korea, Foreign born- Not a citizen of U S ,0, Not in universe,2,0,95, - 50000. -20809,65, State government,43,9, Doctorate degree(PhD EdD),0, Not in universe, Married-civilian spouse present, Education, Professional specialty, White, All other, Male, Not in universe, Not in universe, Full-time schedules,0,2174,250, Joint both 65+, Not in universe, Not in universe, Householder, Householder,1580.56, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, 50000+. -121724,31, Local government,43,10, Bachelors degree(BA AB BS),0, Not in universe, Never married, Education, Professional specialty, White, All other, Male, Yes, Not in universe, Children or Armed Forces,0,0,0, Single, Not in universe, Not in universe, Nonfamily householder, Householder,2220.04, Nonmover, Nonmover, Nonmover, Yes, Not in universe,4, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,43,94, - 50000. -87147,51, Not in universe,0,0, 9th grade,0, Not in universe, Widowed, Not in universe or children, Not in universe, Black, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, South, Texas, Nonfamily householder, Householder,2542.38, MSA to MSA, Same county, Same county, No, Yes,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,94, - 50000. -45361,6, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, Black, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,1423.77, ?, ?, ?, Not in universe under 1 year old, ?,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. -10963,42, Private,38,42, Some college but no degree,0, Not in universe, Married-civilian spouse present, Business and repair services, Handlers equip cleaners etc , White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Joint both under 65, Midwest, Montana, Spouse of householder, Spouse of householder,6282.42, MSA to MSA, Different county same state, Different county same state, No, No,6, Not in universe, El-Salvador, United-States, United-States, Native- Born in the United States,2, Not in universe,2,52,94, - 50000. -43878,20, Private,2,44, High school graduate,0, Not in universe, Never married, Agriculture, Farming forestry and fishing, White, All other, Male, Not in universe, Re-entrant, Unemployed full-time,0,0,0, Single, Not in universe, Not in universe, Child 18+ never marr Not in a subfamily, Child 18 or older,258.24, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,2, Not in universe,2,4,95, - 50000. -19256,9, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,1509.08, ?, ?, ?, Not in universe under 1 year old, ?,0, Mother only present, United-States, United-States, Germany, Native- Born abroad of American Parent(s),0, Not in universe,0,0,95, - 50000. -71391,48, Private,38,42, 1st 2nd 3rd or 4th grade,0, Not in universe, Married-civilian spouse present, Business and repair services, Handlers equip cleaners etc , Asian or Pacific Islander, All other, Male, Not in universe, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Householder, Householder,2395.72, ?, ?, ?, Not in universe under 1 year old, ?,1, Not in universe, ?, ?, ?, Foreign born- Not a citizen of U S ,0, Not in universe,2,52,95, - 50000. -138769,17, Not in universe,0,0, 10th grade,0, High school, Never married, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Not in labor force,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,588.0, ?, ?, ?, Not in universe under 1 year old, ?,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,95, - 50000. -98200,33, Private,42,30, High school graduate,0, Not in universe, Married-civilian spouse present, Medical except hospital, Other service, White, Chicano, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Joint both under 65, West, New York, Householder, Householder,438.7, MSA to MSA, Same county, Same county, No, Yes,3, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,15,94, - 50000. -7213,2, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,1043.07, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Mother only present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. -891,15, Not in universe,0,0, 9th grade,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,1206.13, Nonmover, Nonmover, Nonmover, Yes, Not in universe,1, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,2,94, - 50000. -45910,68, Not in universe,0,0, High school graduate,0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Joint one under 65 & one 65+, Not in universe, Not in universe, Householder, Householder,1634.16, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,94, - 50000. -68156,16, Not in universe,0,0, 9th grade,0, High school, Never married, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Not in labor force,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,662.39, ?, ?, ?, Not in universe under 1 year old, ?,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,95, - 50000. -111042,52, Not in universe,0,0, Masters degree(MA MS MEng MEd MSW MBA),0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Not in labor force,0,0,10000, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1024.89, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,95, 50000+. -197422,67, Private,34,2, High school graduate,0, Not in universe, Widowed, Finance insurance and real estate, Executive admin and managerial, White, All other, Male, No, Not in universe, Children or Armed Forces,0,0,0, Single, Not in universe, Not in universe, Householder, Householder,1539.89, Nonmover, Nonmover, Nonmover, Yes, Not in universe,4, Not in universe, Ireland, Ireland, United-States, Native- Born in the United States,0, Not in universe,2,52,94, 50000+. -10440,8, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Grandchild <18 never marr not in subfamily, Other relative of householder,938.92, ?, ?, ?, Not in universe under 1 year old, ?,0, Neither parent present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. -9427,42, Not in universe,0,0, 10th grade,0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,2701.7, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,94, - 50000. -7449,48, Private,12,2, High school graduate,0, Not in universe, Married-civilian spouse present, Manufacturing-durable goods, Executive admin and managerial, Asian or Pacific Islander, All other, Female, Not in universe, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1965.34, ?, ?, ?, Not in universe under 1 year old, ?,1, Not in universe, China, Vietnam, Vietnam, Foreign born- U S citizen by naturalization,0, Not in universe,2,52,95, - 50000. -128836,8, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,2298.82, ?, ?, ?, Not in universe under 1 year old, ?,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. -48918,72, Not in universe,0,0, 7th and 8th grade,0, Not in universe, Never married, Not in universe or children, Not in universe, Black, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Nonfamily householder, Householder,419.51, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,94, - 50000. -93667,23, Private,33,19, Associates degree-academic program,825, Not in universe, Married-civilian spouse present, Retail trade, Sales, White, All other, Female, No, Not in universe, Full-time schedules,0,0,75, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,2615.23, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. -29020,42, Private,45,15, Associates degree-academic program,0, Not in universe, Widowed, Other professional services, Technicians and related support, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,290, Head of household, Not in universe, Not in universe, Householder, Householder,1552.03, Nonmover, Nonmover, Nonmover, Yes, Not in universe,1, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. -109337,10, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,1640.4, ?, ?, ?, Not in universe under 1 year old, ?,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. -40199,4, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,2397.57, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. -39475,37, Private,41,8, Associates degree-occup /vocational,2355, Not in universe, Never married, Hospital services, Professional specialty, White, All other, Female, No, Not in universe, Children or Armed Forces,0,0,0, Single, Not in universe, Not in universe, Nonfamily householder, Householder,1196.52, Nonmover, Nonmover, Nonmover, Yes, Not in universe,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Yes,1,52,94, 50000+. -159112,63, Without pay,6,35, High school graduate,0, Not in universe, Married-civilian spouse present, Manufacturing-durable goods, Precision production craft & repair, White, All other, Male, Not in universe, Not in universe, PT for non-econ reasons usually FT,0,0,0, Joint both under 65, Not in universe, Not in universe, Householder, Householder,4441.94, ?, ?, ?, Not in universe under 1 year old, ?,1, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. -152918,41, Not in universe,0,0, 1st 2nd 3rd or 4th grade,0, Not in universe, Separated, Not in universe or children, Not in universe, Black, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, South, ?, Secondary individual, Nonrelative of householder,2745.08, NonMSA to nonMSA, Different county same state, Different county same state, No, No,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,94, - 50000. -88096,4, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, Asian or Pacific Islander, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,777.43, ?, ?, ?, Not in universe under 1 year old, ?,0, Both parents present, Philippines, Philippines, Philippines, Foreign born- Not a citizen of U S ,0, Not in universe,0,0,95, - 50000. -175317,43, Private,44,12, Masters degree(MA MS MEng MEd MSW MBA),0, Not in universe, Divorced, Social services, Professional specialty, White, All other, Female, Not in universe, Not in universe, Full-time schedules,0,0,0, Head of household, Not in universe, Not in universe, Householder, Householder,2639.54, ?, ?, ?, Not in universe under 1 year old, ?,5, Not in universe, United-States, United-States, United-States, Native- Born in the United States,2, Not in universe,2,52,95, - 50000. -80470,49, Private,34,17, Bachelors degree(BA AB BS),0, Not in universe, Divorced, Finance insurance and real estate, Sales, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,500, Single, Not in universe, Not in universe, Nonfamily householder, Householder,1811.45, Nonmover, Nonmover, Nonmover, Yes, Not in universe,5, Not in universe, United-States, ?, United-States, Native- Born in the United States,0, Not in universe,2,52,94, 50000+. -161690,6, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,281.98, ?, ?, ?, Not in universe under 1 year old, ?,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. -3630,41, Not in universe,0,0, High school graduate,0, Not in universe, Divorced, Not in universe or children, Not in universe, Black, All other, Female, Not in universe, Not in universe, Not in labor force,0,0,0, Nonfiler, Not in universe, Not in universe, Householder, Householder,1689.66, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,95, - 50000. -12305,46, State government,43,29, High school graduate,840, Not in universe, Married-civilian spouse present, Education, Other service, White, All other, Female, No, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1227.32, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,36,95, - 50000. -100405,33, Not in universe,0,0, Some college but no degree,0, Not in universe, Divorced, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child 18+ ever marr Not in a subfamily, Child 18 or older,2798.03, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,94, - 50000. -181953,35, Private,11,37, 11th grade,0, Not in universe, Married-civilian spouse present, Manufacturing-durable goods, Machine operators assmblrs & inspctrs, White, All other, Female, Not in universe, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,3603.1, ?, ?, ?, Not in universe under 1 year old, ?,4, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. -165427,43, Private,35,23, Some college but no degree,0, Not in universe, Divorced, Finance insurance and real estate, Adm support including clerical, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Single, South, Utah, Secondary individual, Nonrelative of householder,450.49, MSA to MSA, Different region, Different state in South, No, Yes,1, Not in universe, United-States, United-States, United-States, Native- Born in the United States,2, Not in universe,2,48,94, - 50000. -48964,25, Private,34,3, Bachelors degree(BA AB BS),0, Not in universe, Never married, Finance insurance and real estate, Executive admin and managerial, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,10, Single, South, Utah, Nonfamily householder, Householder,2776.11, MSA to MSA, Same county, Same county, No, Yes,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,2, Not in universe,2,52,94, - 50000. -111549,80, Not in universe,0,0, 11th grade,0, Not in universe, Widowed, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Not in labor force,0,0,0, Single, Not in universe, Not in universe, Nonfamily householder, Householder,2674.96, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,95, - 50000. -12284,37, Local government,40,23, High school graduate,0, Not in universe, Married-civilian spouse present, Entertainment, Adm support including clerical, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,2434.3, Nonmover, Nonmover, Nonmover, Yes, Not in universe,3, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. -111003,24, Private,1,44, 11th grade,0, Not in universe, Never married, Agriculture, Farming forestry and fishing, White, Puerto Rican, Male, Not in universe, Job loser - on layoff, Children or Armed Forces,2463,0,0, Single, Not in universe, Not in universe, Householder, Householder,895.49, Nonmover, Nonmover, Nonmover, Yes, Not in universe,4, Not in universe, Puerto-Rico, Puerto-Rico, United-States, Native- Born in the United States,0, Not in universe,2,40,94, - 50000. -4035,52, State government,43,10, Masters degree(MA MS MEng MEd MSW MBA),0, Not in universe, Married-civilian spouse present, Education, Professional specialty, White, All other, Female, Not in universe, Not in universe, Full-time schedules,0,0,3000, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1559.39, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,2, Not in universe,2,15,95, 50000+. -57559,34, Private,24,26, High school graduate,0, Not in universe, Divorced, Manufacturing-nondurable goods, Adm support including clerical, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Single, Not in universe, Not in universe, Child 18+ ever marr Not in a subfamily, Child 18 or older,2878.31, Nonmover, Nonmover, Nonmover, Yes, Not in universe,4, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. -197612,6, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, Black, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,1985.13, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Mother only present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. -186539,35, Not in universe,0,0, 1st 2nd 3rd or 4th grade,0, Not in universe, Separated, Not in universe or children, Not in universe, White, Mexican (Mexicano), Female, Not in universe, Not in universe, Not in labor force,0,0,0, Nonfiler, Not in universe, Not in universe, Householder, Householder,1346.86, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, Mexico, Mexico, Mexico, Foreign born- Not a citizen of U S ,0, Not in universe,2,0,95, - 50000. -80242,45, Private,22,36, 5th or 6th grade,0, Not in universe, Married-civilian spouse present, Manufacturing-nondurable goods, Machine operators assmblrs & inspctrs, White, Mexican (Mexicano), Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1108.95, Nonmover, Nonmover, Nonmover, Yes, Not in universe,2, Not in universe, Mexico, Mexico, Mexico, Foreign born- Not a citizen of U S ,0, Not in universe,2,52,94, - 50000. -180617,14, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,1932.0, ?, ?, ?, Not in universe under 1 year old, ?,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. -88587,3, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child under 18 of RP of unrel subfamily, Nonrelative of householder,4108.89, ?, ?, ?, Not in universe under 1 year old, ?,0, Mother only present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. -7041,45, Not in universe,0,0, Some college but no degree,0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, Black, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Joint both under 65, Midwest, Oklahoma, Spouse of householder, Spouse of householder,1443.81, MSA to MSA, Same county, Same county, No, No,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,94, - 50000. -139291,44, Private,44,41, 5th or 6th grade,0, Not in universe, Never married, Social services, Handlers equip cleaners etc , White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, South, Delaware, Secondary individual, Nonrelative of householder,982.19, NonMSA to nonMSA, Different county same state, Different county same state, No, No,5, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. -184023,49, Local government,42,30, High school graduate,0, Not in universe, Widowed, Medical except hospital, Other service, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Single, Not in universe, Not in universe, Nonfamily householder, Householder,993.85, Nonmover, Nonmover, Nonmover, Yes, Not in universe,4, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. -9438,69, Not in universe,0,0, High school graduate,0, Not in universe, Widowed, Not in universe or children, Not in universe, Black, All other, Female, Not in universe, Not in universe, Not in labor force,0,0,0, Single, Not in universe, Not in universe, Householder, Householder,2296.9, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,95, - 50000. -33628,65, Not in universe,0,0, High school graduate,0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Joint one under 65 & one 65+, Not in universe, Not in universe, Householder, Householder,2588.07, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,94, - 50000. -129715,43, Private,31,42, High school graduate,0, Not in universe, Married-civilian spouse present, Utilities and sanitary services, Handlers equip cleaners etc , White, All other, Male, Not in universe, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1036.94, ?, ?, ?, Not in universe under 1 year old, ?,3, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. -13495,19, Private,33,19, Some college but no degree,0, College or university, Never married, Retail trade, Sales, White, Puerto Rican, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Single, Not in universe, Not in universe, Child 18+ never marr Not in a subfamily, Child 18 or older,1243.04, Nonmover, Nonmover, Nonmover, Yes, Not in universe,2, Not in universe, United-States, ?, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. -50850,10, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, Asian or Pacific Islander, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,2245.99, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Both parents present, Philippines, Philippines, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. -138847,46, Private,34,25, Some college but no degree,0, Not in universe, Married-civilian spouse present, Finance insurance and real estate, Adm support including clerical, Black, All other, Male, Not in universe, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Householder, Householder,688.01, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. -150171,34, Private,33,19, Associates degree-academic program,0, Not in universe, Divorced, Retail trade, Sales, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Single, Not in universe, Not in universe, Nonfamily householder, Householder,2227.01, Nonmover, Nonmover, Nonmover, Yes, Not in universe,4, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. -156089,48, State government,40,23, High school graduate,0, Not in universe, Married-civilian spouse present, Entertainment, Adm support including clerical, White, All other, Female, Not in universe, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,607.6, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. -197936,19, Private,33,19, High school graduate,0, College or university, Never married, Retail trade, Sales, White, All other, Female, Not in universe, Not in universe, Full-time schedules,0,0,0, Single, Not in universe, Not in universe, Child 18+ never marr Not in a subfamily, Child 18 or older,2578.61, ?, ?, ?, Not in universe under 1 year old, ?,4, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. -78488,45, Local government,48,21, Bachelors degree(BA AB BS),0, Not in universe, Separated, Public administration, Adm support including clerical, Black, All other, Female, Yes, Not in universe, Full-time schedules,0,0,0, Single, Not in universe, Not in universe, Householder, Householder,1569.36, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. -44829,38, Private,33,16, High school graduate,0, Not in universe, Never married, Retail trade, Sales, White, All other, Female, Not in universe, Not in universe, Full-time schedules,0,0,268, Single, Not in universe, Not in universe, Child 18+ never marr Not in a subfamily, Child 18 or older,3254.97, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. -132454,41, Private,36,27, High school graduate,0, Not in universe, Married-civilian spouse present, Private household services, Private household services, White, Central or South American, Female, No, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,812.57, ?, ?, ?, Not in universe under 1 year old, ?,1, Not in universe, ?, ?, ?, Foreign born- Not a citizen of U S ,0, Not in universe,2,52,95, - 50000. -52840,71, Not in universe,0,0, 5th or 6th grade,0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, Black, All other, Male, Not in universe, Not in universe, Not in labor force,0,0,0, Joint both 65+, Not in universe, Not in universe, Householder, Householder,1823.75, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,95, - 50000. -121217,27, Federal government,29,25, Associates degree-occup /vocational,1575, Not in universe, Married-civilian spouse present, Transportation, Adm support including clerical, White, All other, Male, Yes, Not in universe, Children or Armed Forces,7298,0,0, Joint both under 65, Northeast, Michigan, Householder, Householder,1031.69, MSA to MSA, Same county, Same county, No, No,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. -198823,29, Not in universe,0,0, Bachelors degree(BA AB BS),0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, Asian or Pacific Islander, All other, Female, Not in universe, Not in universe, Not in labor force,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1205.55, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, India, India, India, Foreign born- Not a citizen of U S ,0, Not in universe,2,0,95, - 50000. -148775,36, Not in universe,0,0, High school graduate,0, Not in universe, Separated, Not in universe or children, Not in universe, White, Mexican (Mexicano), Female, Not in universe, Not in universe, Not in labor force,0,0,0, Single, Not in universe, Not in universe, Child 18+ ever marr Not in a subfamily, Child 18 or older,1307.46, ?, ?, ?, Not in universe under 1 year old, ?,3, Not in universe, Mexico, Mexico, United-States, Native- Born in the United States,0, Not in universe,2,45,95, - 50000. -1702,52, Self-employed-not incorporated,39,32, Bachelors degree(BA AB BS),0, Not in universe, Divorced, Personal services except private HH, Other service, White, All other, Female, Not in universe, Not in universe, Full-time schedules,0,0,2000, Single, Not in universe, Not in universe, Nonfamily householder, Householder,984.25, ?, ?, ?, Not in universe under 1 year old, ?,1, Not in universe, United-States, United-States, United-States, Native- Born in the United States,2, Not in universe,2,46,95, - 50000. -120926,2, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,2596.51, ?, ?, ?, Not in universe under 1 year old, ?,0, Mother only present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. -125722,40, Self-employed-not incorporated,33,2, Associates degree-occup /vocational,0, Not in universe, Married-civilian spouse present, Retail trade, Executive admin and managerial, White, All other, Male, Not in universe, Not in universe, Full-time schedules,0,0,0, Nonfiler, Not in universe, Not in universe, Spouse of householder, Spouse of householder,198.29, ?, ?, ?, Not in universe under 1 year old, ?,1, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. -110416,31, Private,45,12, Bachelors degree(BA AB BS),0, Not in universe, Married-civilian spouse present, Other professional services, Professional specialty, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,300, Joint both under 65, Not in universe, Not in universe, Householder, Householder,1920.41, Nonmover, Nonmover, Nonmover, Yes, Not in universe,4, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. -47866,5, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,2154.9, ?, ?, ?, Not in universe under 1 year old, ?,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. -35144,31, Not in universe,0,0, Associates degree-occup /vocational,0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Joint both under 65, Northeast, Connecticut, Householder, Householder,2491.83, MSA to MSA, Different county same state, Different county same state, No, No,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,94, - 50000. -167869,1, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, Asian or Pacific Islander, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,2046.83, ?, ?, ?, Not in universe under 1 year old, ?,0, Mother only present, Philippines, Philippines, United-States, Native- Born in the United States,0, Not in universe,0,0,95, - 50000. -12432,32, Federal government,49,26, High school graduate,0, Not in universe, Married-civilian spouse present, Public administration, Adm support including clerical, White, Puerto Rican, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1020.27, Nonmover, Nonmover, Nonmover, Yes, Not in universe,3, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. -71994,35, Self-employed-not incorporated,37,10, Bachelors degree(BA AB BS),0, Not in universe, Married-civilian spouse present, Business and repair services, Professional specialty, White, All other, Male, Not in universe, Other job loser, Children or Armed Forces,0,0,0, Joint both under 65, Not in universe, Not in universe, Householder, Householder,1132.61, Nonmover, Nonmover, Nonmover, Yes, Not in universe,1, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,27,94, - 50000. -190244,34, Not in universe,0,0, Masters degree(MA MS MEng MEd MSW MBA),0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Joint both under 65, South, District of Columbia, Householder, Householder,2031.36, MSA to MSA, Different state same division, Different state in South, No, No,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. -1881,45, Private,33,16, Some college but no degree,0, Not in universe, Never married, Retail trade, Sales, White, Mexican-American, Female, Not in universe, Not in universe, Full-time schedules,0,0,0, Head of household, Not in universe, Not in universe, Householder, Householder,1537.21, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. -48449,40, Private,4,34, Some college but no degree,0, Not in universe, Married-civilian spouse present, Construction, Precision production craft & repair, White, All other, Male, Not in universe, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Householder, Householder,1631.75, ?, ?, ?, Not in universe under 1 year old, ?,4, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. -99405,59, Private,4,2, Some college but no degree,2100, Not in universe, Married-civilian spouse present, Construction, Executive admin and managerial, White, All other, Male, Yes, Not in universe, Full-time schedules,0,0,200, Joint both under 65, Not in universe, Not in universe, Householder, Householder,2477.26, ?, ?, ?, Not in universe under 1 year old, ?,1, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, 50000+. -71526,26, State government,43,12, Masters degree(MA MS MEng MEd MSW MBA),0, Not in universe, Married-civilian spouse present, Education, Professional specialty, White, All other, Female, Not in universe, Not in universe, PT for econ reasons usually PT,0,0,0, Joint both under 65, Not in universe, Not in universe, In group quarters, Householder,1108.83, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. -107493,14, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,1651.17, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Both parents present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. -142743,54, Federal government,45,4, Masters degree(MA MS MEng MEd MSW MBA),0, Not in universe, Married-civilian spouse present, Other professional services, Professional specialty, White, All other, Male, Not in universe, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Householder, Householder,1081.54, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, 50000+. -2258,30, Private,35,2, High school graduate,0, Not in universe, Divorced, Finance insurance and real estate, Executive admin and managerial, White, All other, Female, No, Not in universe, Children or Armed Forces,2354,0,0, Single, Not in universe, Not in universe, Nonfamily householder, Householder,2924.14, Nonmover, Nonmover, Nonmover, Yes, Not in universe,2, Not in universe, United-States, United-States, United-States, Native- Born in the United States,1, Not in universe,2,52,94, - 50000. -66048,68, Not in universe,0,0, Some college but no degree,0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Not in labor force,0,0,0, Joint both 65+, Not in universe, Not in universe, Spouse of householder, Spouse of householder,2467.44, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,95, - 50000. -174145,57, Local government,50,5, Bachelors degree(BA AB BS),0, Not in universe, Married-civilian spouse present, Public administration, Professional specialty, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,1902,0, Joint both under 65, Not in universe, Not in universe, Householder, Householder,1455.29, Nonmover, Nonmover, Nonmover, Yes, Not in universe,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. -7609,28, Private,43,44, Associates degree-occup /vocational,0, Not in universe, Separated, Education, Farming forestry and fishing, White, All other, Male, Not in universe, Not in universe, Full-time schedules,0,0,0, Single, Not in universe, Not in universe, Nonfamily householder, Householder,4173.77, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. -1906,33, Private,41,7, Prof school degree (MD DDS DVM LLB JD),0, Not in universe, Married-civilian spouse present, Hospital services, Professional specialty, White, Central or South American, Male, Not in universe, Not in universe, Children or Armed Forces,3103,0,0, Joint both under 65, Not in universe, Not in universe, Householder, Householder,2406.32, Nonmover, Nonmover, Nonmover, Yes, Not in universe,6, Not in universe, ?, ?, ?, Foreign born- Not a citizen of U S ,0, Not in universe,2,52,94, - 50000. -8197,51, Private,14,37, High school graduate,0, Not in universe, Married-civilian spouse present, Manufacturing-durable goods, Machine operators assmblrs & inspctrs, Black, All other, Male, Not in universe, Not in universe, Children or Armed Forces,3137,0,0, Joint both under 65, Not in universe, Not in universe, Householder, Householder,2659.34, Nonmover, Nonmover, Nonmover, Yes, Not in universe,2, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,42,94, - 50000. -7752,59, Private,9,36, High school graduate,0, Not in universe, Married-civilian spouse present, Manufacturing-durable goods, Machine operators assmblrs & inspctrs, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Joint both under 65, Not in universe, Not in universe, Householder, Householder,761.06, Nonmover, Nonmover, Nonmover, Yes, Not in universe,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. -74808,19, Private,40,28, Some college but no degree,0, College or university, Never married, Entertainment, Protective services, Asian or Pacific Islander, All other, Male, Not in universe, Not in universe, Full-time schedules,0,0,0, Single, Not in universe, Not in universe, Child 18+ never marr Not in a subfamily, Child 18 or older,1264.75, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,2, Not in universe,2,52,95, - 50000. -194746,64, Not in universe,0,0, High school graduate,0, Not in universe, Divorced, Not in universe or children, Not in universe, White, Other Spanish, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Single, Not in universe, Not in universe, Nonfamily householder, Householder,915.28, Nonmover, Nonmover, Nonmover, Yes, Not in universe,4, Not in universe, ?, United-States, United-States, Native- Born in the United States,0, Not in universe,2,4,94, - 50000. -156141,38, Private,41,8, Bachelors degree(BA AB BS),0, Not in universe, Married-civilian spouse present, Hospital services, Professional specialty, White, All other, Female, Not in universe, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,991.45, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,2, Not in universe,2,52,95, - 50000. -132259,41, Not in universe,0,0, High school graduate,0, Not in universe, Never married, Not in universe or children, Not in universe, Black, All other, Male, Not in universe, Not in universe, Not in labor force,0,0,0, Nonfiler, Not in universe, Not in universe, Child 18+ never marr Not in a subfamily, Child 18 or older,3270.26, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,95, - 50000. -90484,0, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, Black, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,2294.02, Not in universe, Not in universe, Not in universe, Not in universe under 1 year old, Not in universe,0, Both parents present, United-States, ?, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. -78109,9, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, Black, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,4408.46, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Mother only present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. -145093,60, Private,13,37, Some college but no degree,0, Not in universe, Married-spouse absent, Manufacturing-durable goods, Machine operators assmblrs & inspctrs, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,500, Single, Not in universe, Not in universe, Nonfamily householder, Householder,1392.3, Nonmover, Nonmover, Nonmover, Yes, Not in universe,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, 50000+. -108692,52, Not in universe,0,0, 11th grade,0, Not in universe, Divorced, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Not in labor force,0,0,0, Nonfiler, Not in universe, Not in universe, Householder, Householder,1476.96, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,95, - 50000. -155779,70, Not in universe,0,0, High school graduate,0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,67, Joint both 65+, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1385.67, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,94, - 50000. -38262,14, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, Puerto Rican, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Northeast, North Carolina, Child <18 never marr not in subfamily, Child under 18 never married,1153.13, MSA to MSA, Same county, Same county, No, No,0, Mother only present, Puerto-Rico, Puerto-Rico, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. -89021,30, Not in universe,0,0, High school graduate,0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Joint both under 65, West, California, Spouse of householder, Spouse of householder,463.68, MSA to nonMSA, Different division same region, Different state in West, No, No,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,94, - 50000. -177664,74, Not in universe,0,0, Bachelors degree(BA AB BS),0, Not in universe, Widowed, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,4882, Single, Northeast, ?, Nonfamily householder, Householder,1591.41, MSA to MSA, Different county same state, Different county same state, No, No,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,94, - 50000. -188163,10, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,776.08, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Both parents present, ?, ?, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. -125830,46, Local government,43,10, Bachelors degree(BA AB BS),0, Not in universe, Married-civilian spouse present, Education, Professional specialty, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,3103,0,100, Joint both under 65, Not in universe, Not in universe, Householder, Householder,1006.86, Nonmover, Nonmover, Nonmover, Yes, Not in universe,3, Not in universe, United-States, United-States, United-States, Native- Born in the United States,1, Not in universe,2,52,94, - 50000. -78253,26, Federal government,29,25, High school graduate,0, Not in universe, Never married, Transportation, Adm support including clerical, Asian or Pacific Islander, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,1000, Single, Not in universe, Not in universe, Nonfamily householder, Householder,915.75, Nonmover, Nonmover, Nonmover, Yes, Not in universe,6, Not in universe, ?, ?, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. -171521,25, Private,31,37, Some college but no degree,0, Not in universe, Never married, Utilities and sanitary services, Machine operators assmblrs & inspctrs, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Single, Midwest, Kentucky, Nonfamily householder, Householder,1417.25, MSA to MSA, Same county, Same county, No, No,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. -122703,30, Private,45,31, 5th or 6th grade,0, Not in universe, Married-civilian spouse present, Other professional services, Other service, White, Mexican (Mexicano), Male, Not in universe, Not in universe, Full-time schedules,2885,0,0, Joint both under 65, Not in universe, Not in universe, Householder, Householder,1207.48, ?, ?, ?, Not in universe under 1 year old, ?,2, Not in universe, Mexico, Mexico, Mexico, Foreign born- Not a citizen of U S ,0, Not in universe,2,52,95, - 50000. -57986,62, State government,41,36, High school graduate,0, Not in universe, Married-civilian spouse present, Hospital services, Machine operators assmblrs & inspctrs, White, All other, Female, No, Not in universe, Full-time schedules,0,0,0, Joint one under 65 & one 65+, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1252.17, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, - 50000. -100807,58, Not in universe,0,0, Some college but no degree,0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Not in labor force,0,0,330, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1550.66, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,95, - 50000. -199197,39, Not in universe,0,0, Bachelors degree(BA AB BS),0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Not in labor force,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,3802.81, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, ?, ?, ?, Foreign born- Not a citizen of U S ,0, Not in universe,2,0,95, - 50000. -44919,55, Private,33,16, High school graduate,1400, Not in universe, Married-civilian spouse present, Retail trade, Sales, White, All other, Female, No, Not in universe, Children or Armed Forces,0,0,100, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,2392.55, Nonmover, Nonmover, Nonmover, Yes, Not in universe,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,94, - 50000. -48655,74, Not in universe,0,0, Some college but no degree,0, Not in universe, Married-civilian spouse present, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Spouse of householder, Spouse of householder,2367.66, Nonmover, Nonmover, Nonmover, Yes, Not in universe,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,94, - 50000. -37451,76, Not in universe,0,0, High school graduate,0, Not in universe, Widowed, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Not in labor force,0,0,0, Nonfiler, Not in universe, Not in universe, Householder, Householder,1551.72, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,0,95, - 50000. -9376,39, Private,37,3, Some college but no degree,0, Not in universe, Never married, Business and repair services, Executive admin and managerial, White, Puerto Rican, Female, Not in universe, Not in universe, Full-time schedules,0,0,0, Head of household, Not in universe, Not in universe, Householder, Householder,774.83, ?, ?, ?, Not in universe under 1 year old, ?,2, Not in universe, Puerto-Rico, Puerto-Rico, Puerto-Rico, Native- Born in Puerto Rico or U S Outlying,0, Not in universe,2,52,95, - 50000. -176075,71, Not in universe,0,0, 9th grade,0, Not in universe, Divorced, Not in universe or children, Not in universe, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Nonfamily householder, Householder,609.05, Nonmover, Nonmover, Nonmover, Yes, Not in universe,1, Not in universe, United-States, United-States, United-States, Native- Born in the United States,2, Not in universe,2,20,94, - 50000. -40950,37, Private,42,2, Associates degree-academic program,0, Not in universe, Married-civilian spouse present, Medical except hospital, Executive admin and managerial, White, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,4000, Joint both under 65, Midwest, Mississippi, Spouse of householder, Spouse of householder,1532.26, MSA to nonMSA, Different region, Different state in Midwest, No, No,4, Not in universe, United-States, United-States, United-States, Native- Born in the United States,1, Not in universe,2,52,94, - 50000. -187455,31, Private,33,19, 11th grade,0, Not in universe, Married-spouse absent, Retail trade, Sales, Asian or Pacific Islander, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Single, Not in universe, Not in universe, Child 18+ ever marr Not in a subfamily, Child 18 or older,1366.06, Nonmover, Nonmover, Nonmover, Yes, Not in universe,4, Not in universe, India, India, India, Foreign born- Not a citizen of U S ,0, Not in universe,2,52,94, - 50000. -94473,0, Not in universe,0,0, Children,0, Not in universe, Never married, Not in universe or children, Not in universe, Black, All other, Female, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Nonfiler, Not in universe, Not in universe, Child <18 never marr not in subfamily, Child under 18 never married,558.42, Not in universe, Not in universe, Not in universe, Not in universe under 1 year old, Not in universe,0, Mother only present, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,0,0,94, - 50000. -177027,77, Not in universe,0,0, High school graduate,0, Not in universe, Divorced, Not in universe or children, Not in universe, White, All other, Female, Not in universe, Not in universe, Not in labor force,0,0,0, Nonfiler, Not in universe, Not in universe, Nonfamily householder, Householder,3316.65, ?, ?, ?, Not in universe under 1 year old, ?,0, Not in universe, ?, ?, United-States, Native- Born in the United States,0, Not in universe,2,0,95, - 50000. -98120,76, Private,21,31, 7th and 8th grade,0, Not in universe, Married-civilian spouse present, Manufacturing-nondurable goods, Other service, White, All other, Male, Not in universe, Not in universe, Children or Armed Forces,0,0,0, Joint both 65+, Not in universe, Not in universe, Householder, Householder,785.0, Nonmover, Nonmover, Nonmover, Yes, Not in universe,6, Not in universe, Canada, Canada, United-States, Native- Born in the United States,0, No,1,52,94, - 50000. -179503,34, Private,25,37, High school graduate,0, Not in universe, Married-civilian spouse present, Manufacturing-nondurable goods, Machine operators assmblrs & inspctrs, White, All other, Female, Not in universe, Not in universe, Full-time schedules,0,0,0, Joint both under 65, Not in universe, Not in universe, Spouse of householder, Spouse of householder,1515.34, ?, ?, ?, Not in universe under 1 year old, ?,6, Not in universe, United-States, United-States, United-States, Native- Born in the United States,0, Not in universe,2,52,95, 50000+. From 9eee512112ddf01e09247fb8374d88ad43be5e50 Mon Sep 17 00:00:00 2001 From: zanshuxun <631763140@qq.com> Date: Sat, 2 Jul 2022 10:52:47 +0800 Subject: [PATCH 17/47] =?UTF-8?q?=E5=AE=8C=E5=96=84=E8=B6=85=E5=8F=82?= =?UTF-8?q?=E5=8F=8A=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deepctr_torch/models/multitask/esmm.py | 24 +-- deepctr_torch/models/multitask/mmoe.py | 21 +-- deepctr_torch/models/multitask/ple.py | 151 ++++++++++++++++++ .../models/multitask/sharedbottom.py | 18 +-- 4 files changed, 183 insertions(+), 31 deletions(-) create mode 100644 deepctr_torch/models/multitask/ple.py diff --git a/deepctr_torch/models/multitask/esmm.py b/deepctr_torch/models/multitask/esmm.py index 719648b0..a9a1cf15 100644 --- a/deepctr_torch/models/multitask/esmm.py +++ b/deepctr_torch/models/multitask/esmm.py @@ -18,18 +18,18 @@ class ESMM(BaseModel): """Instantiates the Multi-gate Mixture-of-Experts architecture. :param dnn_feature_columns: An iterable containing all the features used by deep part of the model. - :param tower_dnn_hidden_units: list,list of positive integer or empty list, the layer number and units in each layer of task-specific DNN. - :param l2_reg_linear: float. L2 regularizer strength applied to linear part - :param l2_reg_embedding: float. L2 regularizer strength applied to embedding vector - :param l2_reg_dnn: float. L2 regularizer strength applied to DNN - :param init_std: float,to use as the initialize std of embedding vector - :param seed: integer ,to use as random seed. + :param tower_dnn_hidden_units: list, list of positive integer or empty list, the layer number and units in each layer of task-specific DNN. + :param l2_reg_linear: float, L2 regularizer strength applied to linear part. + :param l2_reg_embedding: float, L2 regularizer strength applied to embedding vector. + :param l2_reg_dnn: float, L2 regularizer strength applied to DNN. + :param init_std: float, to use as the initialize std of embedding vector. + :param seed: integer, to use as random seed. :param dnn_dropout: float in [0,1), the probability we will drop out a given DNN coordinate. - :param dnn_activation: Activation function to use in DNN - :param dnn_use_bn: bool. Whether use BatchNormalization before activation or not in DNN - :param task_types: list of str, indicating the loss of each tasks, ``"binary"`` for binary logloss or ``"regression"`` for regression loss. e.g. ['binary', 'regression'] - :param task_names: list of str, indicating the predict target of each tasks - :param device: str, ``"cpu"`` or ``"cuda:0"`` + :param dnn_activation: Activation function to use in DNN. + :param dnn_use_bn: bool, Whether use BatchNormalization before activation or not in DNN. + :param task_types: list of str, indicating the loss of each tasks, ``"binary"`` for binary logloss or ``"regression"`` for regression loss. e.g. ['binary', 'regression']. + :param task_names: list of str, indicating the predict target of each tasks. + :param device: str, ``"cpu"`` or ``"cuda:0"``. :param gpus: list of int or torch.device for multiple gpus. If None, run on `device`. `gpus[0]` should be the same gpu with `device`. :return: A PyTorch model instance. @@ -40,7 +40,7 @@ def __init__(self, dnn_feature_columns, tower_dnn_hidden_units=(256, 128), dnn_dropout=0, dnn_activation='relu', dnn_use_bn=False, task_types=('binary', 'binary'), task_names=('ctr', 'ctcvr'), device='cpu', gpus=None): super(ESMM, self).__init__(linear_feature_columns=[], dnn_feature_columns=dnn_feature_columns, - l2_reg_linear=l2_reg_linear, l2_reg_embedding=l2_reg_embedding, + l2_reg_linear=l2_reg_linear, l2_reg_embedding=l2_reg_embedding, init_std=init_std, seed=seed, task='binary', device=device, gpus=gpus) self.num_tasks = len(task_names) if self.num_tasks != 2: diff --git a/deepctr_torch/models/multitask/mmoe.py b/deepctr_torch/models/multitask/mmoe.py index 4d0135c3..c9eb37fc 100644 --- a/deepctr_torch/models/multitask/mmoe.py +++ b/deepctr_torch/models/multitask/mmoe.py @@ -22,16 +22,17 @@ class MMOE(BaseModel): :param expert_dnn_hidden_units: list, list of positive integer or empty list, the layer number and units in each layer of expert DNN. :param gate_dnn_hidden_units: list, list of positive integer or empty list, the layer number and units in each layer of gate DNN. :param tower_dnn_hidden_units: list, list of positive integer or empty list, the layer number and units in each layer of task-specific DNN. - :param l2_reg_embedding: float. L2 regularizer strength applied to embedding vector - :param l2_reg_dnn: float. L2 regularizer strength applied to DNN - :param init_std: float,to use as the initialize std of embedding vector + :param l2_reg_linear: float, L2 regularizer strength applied to linear part. + :param l2_reg_embedding: float, L2 regularizer strength applied to embedding vector. + :param l2_reg_dnn: float, L2 regularizer strength applied to DNN. + :param init_std: float, to use as the initialize std of embedding vector. :param seed: integer, to use as random seed. :param dnn_dropout: float in [0,1), the probability we will drop out a given DNN coordinate. - :param dnn_activation: Activation function to use in DNN - :param dnn_use_bn: bool. Whether use BatchNormalization before activation or not in DNN - :param task_types: list of str, indicating the loss of each tasks, ``"binary"`` for binary logloss, ``"regression"`` for regression loss. e.g. ['binary', 'regression'] - :param task_names: list of str, indicating the predict target of each tasks - :param device: str, ``"cpu"`` or ``"cuda:0"`` + :param dnn_activation: Activation function to use in DNN. + :param dnn_use_bn: bool, Whether use BatchNormalization before activation or not in DNN. + :param task_types: list of str, indicating the loss of each tasks, ``"binary"`` for binary logloss, ``"regression"`` for regression loss. e.g. ['binary', 'regression']. + :param task_names: list of str, indicating the predict target of each tasks. + :param device: str, ``"cpu"`` or ``"cuda:0"``. :param gpus: list of int or torch.device for multiple gpus. If None, run on `device`. `gpus[0]` should be the same gpu with `device`. :return: A PyTorch model instance. @@ -43,8 +44,8 @@ def __init__(self, dnn_feature_columns, num_experts=3, expert_dnn_hidden_units=( init_std=0.0001, seed=1024, dnn_dropout=0, dnn_activation='relu', dnn_use_bn=False, task_types=('binary', 'binary'), task_names=('ctr', 'ctcvr'), device='cpu', gpus=None): super(MMOE, self).__init__(linear_feature_columns=[], dnn_feature_columns=dnn_feature_columns, - l2_reg_linear=l2_reg_linear, l2_reg_embedding=l2_reg_embedding, seed=seed, - device=device, gpus=gpus) + l2_reg_linear=l2_reg_linear, l2_reg_embedding=l2_reg_embedding, init_std=init_std, + seed=seed, device=device, gpus=gpus) self.num_tasks = len(task_names) if self.num_tasks <= 1: raise ValueError("num_tasks must be greater than 1") diff --git a/deepctr_torch/models/multitask/ple.py b/deepctr_torch/models/multitask/ple.py new file mode 100644 index 00000000..12d6e6d1 --- /dev/null +++ b/deepctr_torch/models/multitask/ple.py @@ -0,0 +1,151 @@ +# -*- coding:utf-8 -*- +""" +Author: + zanshuxun, zanshuxun@aliyun.com + +Reference: + [1] Tang H, Liu J, Zhao M, et al. Progressive layered extraction (ple): A novel multi-task learning (mtl) model for personalized recommendations[C]//Fourteenth ACM Conference on Recommender Systems. 2020.(https://dl.acm.org/doi/10.1145/3383313.3412236) +""" +import torch +import torch.nn as nn + +from ..basemodel import BaseModel +from ...inputs import combined_dnn_input +from ...layers import DNN, PredictionLayer + + +class PLE(BaseModel): + """Instantiates the multi level of Customized Gate Control of Progressive Layered Extraction architecture. + + :param dnn_feature_columns: An iterable containing all the features used by deep part of the model. + :param shared_expert_num: integer, number of task-shared experts. + :param specific_expert_num: integer, number of task-specific experts. + :param num_levels: integer, number of CGC levels. + :param expert_dnn_hidden_units: list, list of positive integer or empty list, the layer number and units in each layer of expert DNN. + :param gate_dnn_hidden_units: list, list of positive integer or empty list, the layer number and units in each layer of gate DNN. + :param tower_dnn_hidden_units: list, list of positive integer or empty list, the layer number and units in each layer of task-specific DNN. + :param l2_reg_linear: float, L2 regularizer strength applied to linear part. + :param l2_reg_embedding: float, L2 regularizer strength applied to embedding vector. + :param l2_reg_dnn: float, L2 regularizer strength applied to DNN. + :param init_std: float, to use as the initialize std of embedding vector. + :param seed: integer, to use as random seed. + :param dnn_dropout: float in [0,1), the probability we will drop out a given DNN coordinate. + :param dnn_activation: Activation function to use in DNN. + :param dnn_use_bn: bool, Whether use BatchNormalization before activation or not in DNN. + :param task_types: list of str, indicating the loss of each tasks, ``"binary"`` for binary logloss, ``"regression"`` for regression loss. e.g. ['binary', 'regression'] + :param task_names: list of str, indicating the predict target of each tasks. + :param device: str, ``"cpu"`` or ``"cuda:0"``. + :param gpus: list of int or torch.device for multiple gpus. If None, run on `device`. `gpus[0]` should be the same gpu with `device`. + + :return: A PyTorch model instance. + """ + + def __init__(self, dnn_feature_columns, shared_expert_num=1, specific_expert_num=1, num_levels=2, + expert_dnn_hidden_units=(256, 128), gate_dnn_hidden_units=(64,), tower_dnn_hidden_units=(64,), + l2_reg_linear=0.00001, l2_reg_embedding=0.00001, l2_reg_dnn=0, init_std=0.0001, seed=1024, + dnn_dropout=0, dnn_activation='relu', dnn_use_bn=False, task_types=('binary', 'binary'), + task_names=('ctr', 'ctcvr'), device='cpu', gpus=None): + super(PLE, self).__init__(linear_feature_columns=[], dnn_feature_columns=dnn_feature_columns, + l2_reg_linear=l2_reg_linear, l2_reg_embedding=l2_reg_embedding, init_std=init_std, + seed=seed, device=device, gpus=gpus) + self.num_tasks = len(task_names) + if self.num_tasks <= 1: + raise ValueError("num_tasks must be greater than 1") + if num_experts <= 1: + raise ValueError("num_experts must be greater than 1") + + if len(task_types) != self.num_tasks: + raise ValueError("num_tasks must be equal to the length of task_types") + + for task_type in task_types: + if task_type not in ['binary', 'regression']: + raise ValueError("task must be binary or regression, {} is illegal".format(task_type)) + + self.num_experts = num_experts + self.task_names = task_names + self.input_dim = self.compute_input_dim(dnn_feature_columns) + self.expert_dnn_hidden_units = expert_dnn_hidden_units + self.gate_dnn_hidden_units = gate_dnn_hidden_units + self.tower_dnn_hidden_units = tower_dnn_hidden_units + + # expert dnn + self.expert_dnn = nn.ModuleList([DNN(self.input_dim, expert_dnn_hidden_units, activation=dnn_activation, + l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, + init_std=init_std, device=device) for _ in range(self.num_experts)]) + + # gate dnn + if len(gate_dnn_hidden_units) > 0: + self.gate_dnn = nn.ModuleList([DNN(self.input_dim, gate_dnn_hidden_units, activation=dnn_activation, + l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, + init_std=init_std, device=device) for _ in range(self.num_experts)]) + self.gate_dnn_final_layer = nn.ModuleList( + [nn.Linear(gate_dnn_hidden_units[-1], self.num_experts, bias=False) for _ in range(self.num_tasks)]) + self.add_regularization_weight( + filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.gate_dnn.named_parameters()), + l2=l2_reg_dnn) + else: + self.gate_dnn_final_layer = nn.ModuleList( + [nn.Linear(self.input_dim, self.num_experts, bias=False) for _ in range(self.num_tasks)]) + + # tower dnn (task-specific) + if len(tower_dnn_hidden_units) > 0: + self.tower_dnn = nn.ModuleList( + [DNN(expert_dnn_hidden_units[-1], tower_dnn_hidden_units, activation=dnn_activation, + l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, + init_std=init_std, device=device) for _ in range(self.num_tasks)]) + self.tower_dnn_final_layer = nn.ModuleList([nn.Linear(tower_dnn_hidden_units[-1], 1, bias=False) + for _ in range(self.num_tasks)]) + self.add_regularization_weight( + filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.tower_dnn.named_parameters()), + l2=l2_reg_dnn) + else: + self.tower_dnn_final_layer = nn.ModuleList([nn.Linear(expert_dnn_hidden_units[-1], 1, bias=False) + for _ in range(self.num_tasks)]) + + self.out = nn.ModuleList([PredictionLayer(task) for task in task_types]) + + self.add_regularization_weight( + filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.expert_dnn.named_parameters()), l2=l2_reg_dnn) + self.add_regularization_weight( + filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.gate_dnn_final_layer.named_parameters()), + l2=l2_reg_dnn) + self.add_regularization_weight( + filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.tower_dnn_final_layer.named_parameters()), + l2=l2_reg_dnn) + self.to(device) + + def forward(self, X): + sparse_embedding_list, dense_value_list = self.input_from_feature_columns(X, self.dnn_feature_columns, + self.embedding_dict) + dnn_input = combined_dnn_input(sparse_embedding_list, dense_value_list) + + # expert dnn + expert_outs = [] + for i in range(self.num_experts): + expert_out = self.expert_dnn[i](dnn_input) + expert_outs.append(expert_out) + expert_outs = torch.stack(expert_outs, 1) # (bs, num_experts, dim) + + # gate dnn + mmoe_outs = [] + for i in range(self.num_tasks): + if len(self.gate_dnn_hidden_units) > 0: + gate_dnn_out = self.gate_dnn[i](dnn_input) + gate_dnn_out = self.gate_dnn_final_layer[i](gate_dnn_out) + else: + gate_dnn_out = self.gate_dnn_final_layer[i](dnn_input) + gate_mul_expert = torch.matmul(gate_dnn_out.softmax(1).unsqueeze(1), expert_outs) # (bs, 1, dim) + mmoe_outs.append(gate_mul_expert.squeeze()) + + # tower dnn (task-specific) + task_outs = [] + for i in range(self.num_tasks): + if len(self.tower_dnn_hidden_units) > 0: + tower_dnn_out = self.tower_dnn[i](mmoe_outs[i]) + tower_dnn_logit = self.tower_dnn_final_layer[i](tower_dnn_out) + else: + tower_dnn_logit = self.tower_dnn_final_layer[i](mmoe_outs[i]) + output = self.out[i](tower_dnn_logit) + task_outs.append(output) + task_outs = torch.cat(task_outs, -1) + return task_outs diff --git a/deepctr_torch/models/multitask/sharedbottom.py b/deepctr_torch/models/multitask/sharedbottom.py index ab7128b0..4f460e57 100644 --- a/deepctr_torch/models/multitask/sharedbottom.py +++ b/deepctr_torch/models/multitask/sharedbottom.py @@ -18,16 +18,16 @@ class SharedBottom(BaseModel): """Instantiates the Multi-gate Mixture-of-Experts architecture. :param dnn_feature_columns: An iterable containing all the features used by deep part of the model. - :param bottom_dnn_hidden_units: list,list of positive integer or empty list, the layer number and units in each layer of shared bottom DNN. - :param tower_dnn_hidden_units: list,list of positive integer or empty list, the layer number and units in each layer of task-specific DNN. - :param l2_reg_linear: float. L2 regularizer strength applied to linear part - :param l2_reg_embedding: float. L2 regularizer strength applied to embedding vector - :param l2_reg_dnn: float. L2 regularizer strength applied to DNN - :param init_std: float,to use as the initialize std of embedding vector - :param seed: integer ,to use as random seed. + :param bottom_dnn_hidden_units: list, list of positive integer or empty list, the layer number and units in each layer of shared bottom DNN. + :param tower_dnn_hidden_units: list, list of positive integer or empty list, the layer number and units in each layer of task-specific DNN. + :param l2_reg_linear: float, L2 regularizer strength applied to linear part + :param l2_reg_embedding: float, L2 regularizer strength applied to embedding vector + :param l2_reg_dnn: float, L2 regularizer strength applied to DNN + :param init_std: float, to use as the initialize std of embedding vector + :param seed: integer, to use as random seed. :param dnn_dropout: float in [0,1), the probability we will drop out a given DNN coordinate. :param dnn_activation: Activation function to use in DNN - :param dnn_use_bn: bool. Whether use BatchNormalization before activation or not in DNN + :param dnn_use_bn: bool, Whether use BatchNormalization before activation or not in DNN :param task_types: list of str, indicating the loss of each tasks, ``"binary"`` for binary logloss or ``"regression"`` for regression loss. e.g. ['binary', 'regression'] :param task_names: list of str, indicating the predict target of each tasks :param device: str, ``"cpu"`` or ``"cuda:0"`` @@ -42,7 +42,7 @@ def __init__(self, dnn_feature_columns, bottom_dnn_hidden_units=(256, 128), towe task_names=('ctr', 'ctcvr'), device='cpu', gpus=None): super(SharedBottom, self).__init__(linear_feature_columns=[], dnn_feature_columns=dnn_feature_columns, l2_reg_linear=l2_reg_linear, l2_reg_embedding=l2_reg_embedding, - seed=seed, device=device, gpus=gpus) + init_std=init_std, seed=seed, device=device, gpus=gpus) self.num_tasks = len(task_names) if self.num_tasks <= 1: raise ValueError("num_tasks must be greater than 1") From 4d38bebea0e452e9a3c76e6592364dbf00b6a31b Mon Sep 17 00:00:00 2001 From: zanshuxun <631763140@qq.com> Date: Sat, 2 Jul 2022 11:55:08 +0800 Subject: [PATCH 18/47] cgc pole --- deepctr_torch/models/multitask/esmm.py | 2 +- deepctr_torch/models/multitask/mmoe.py | 2 +- deepctr_torch/models/multitask/ple.py | 144 +++++++++++++----- .../models/multitask/sharedbottom.py | 2 +- 4 files changed, 113 insertions(+), 37 deletions(-) diff --git a/deepctr_torch/models/multitask/esmm.py b/deepctr_torch/models/multitask/esmm.py index a9a1cf15..1628c3fd 100644 --- a/deepctr_torch/models/multitask/esmm.py +++ b/deepctr_torch/models/multitask/esmm.py @@ -15,7 +15,7 @@ class ESMM(BaseModel): - """Instantiates the Multi-gate Mixture-of-Experts architecture. + """Instantiates the Entire Space Multi-Task Model architecture. :param dnn_feature_columns: An iterable containing all the features used by deep part of the model. :param tower_dnn_hidden_units: list, list of positive integer or empty list, the layer number and units in each layer of task-specific DNN. diff --git a/deepctr_torch/models/multitask/mmoe.py b/deepctr_torch/models/multitask/mmoe.py index c9eb37fc..18113482 100644 --- a/deepctr_torch/models/multitask/mmoe.py +++ b/deepctr_torch/models/multitask/mmoe.py @@ -75,7 +75,7 @@ def __init__(self, dnn_feature_columns, num_experts=3, expert_dnn_hidden_units=( if len(gate_dnn_hidden_units) > 0: self.gate_dnn = nn.ModuleList([DNN(self.input_dim, gate_dnn_hidden_units, activation=dnn_activation, l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, - init_std=init_std, device=device) for _ in range(self.num_experts)]) + init_std=init_std, device=device) for _ in range(self.num_tasks)]) self.gate_dnn_final_layer = nn.ModuleList( [nn.Linear(gate_dnn_hidden_units[-1], self.num_experts, bias=False) for _ in range(self.num_tasks)]) self.add_regularization_weight( diff --git a/deepctr_torch/models/multitask/ple.py b/deepctr_torch/models/multitask/ple.py index 12d6e6d1..6f1db724 100644 --- a/deepctr_torch/models/multitask/ple.py +++ b/deepctr_torch/models/multitask/ple.py @@ -41,7 +41,7 @@ class PLE(BaseModel): """ def __init__(self, dnn_feature_columns, shared_expert_num=1, specific_expert_num=1, num_levels=2, - expert_dnn_hidden_units=(256, 128), gate_dnn_hidden_units=(64,), tower_dnn_hidden_units=(64,), + expert_dnn_hidden_units=(256,), gate_dnn_hidden_units=(64,), tower_dnn_hidden_units=(64,), l2_reg_linear=0.00001, l2_reg_embedding=0.00001, l2_reg_dnn=0, init_std=0.0001, seed=1024, dnn_dropout=0, dnn_activation='relu', dnn_use_bn=False, task_types=('binary', 'binary'), task_names=('ctr', 'ctcvr'), device='cpu', gpus=None): @@ -51,8 +51,6 @@ def __init__(self, dnn_feature_columns, shared_expert_num=1, specific_expert_num self.num_tasks = len(task_names) if self.num_tasks <= 1: raise ValueError("num_tasks must be greater than 1") - if num_experts <= 1: - raise ValueError("num_experts must be greater than 1") if len(task_types) != self.num_tasks: raise ValueError("num_tasks must be equal to the length of task_types") @@ -61,7 +59,9 @@ def __init__(self, dnn_feature_columns, shared_expert_num=1, specific_expert_num if task_type not in ['binary', 'regression']: raise ValueError("task must be binary or regression, {} is illegal".format(task_type)) - self.num_experts = num_experts + self.specific_expert_num = specific_expert_num + self.shared_expert_num = shared_expert_num + self.num_levels = num_levels self.task_names = task_names self.input_dim = self.compute_input_dim(dnn_feature_columns) self.expert_dnn_hidden_units = expert_dnn_hidden_units @@ -69,23 +69,55 @@ def __init__(self, dnn_feature_columns, shared_expert_num=1, specific_expert_num self.tower_dnn_hidden_units = tower_dnn_hidden_units # expert dnn - self.expert_dnn = nn.ModuleList([DNN(self.input_dim, expert_dnn_hidden_units, activation=dnn_activation, - l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, - init_std=init_std, device=device) for _ in range(self.num_experts)]) + self.specific_experts = nn.ModuleList( + [nn.ModuleList([nn.ModuleList([DNN(self.input_dim, expert_dnn_hidden_units, activation=dnn_activation, + l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, + init_std=init_std, device=device) for _ in + range(self.specific_expert_num)]) + for _ in range(self.task_names)]) for _ in range(self.num_levels)]) + self.shared_experts = nn.ModuleList( + [nn.ModuleList([DNN(self.input_dim, expert_dnn_hidden_units, activation=dnn_activation, + l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, + init_std=init_std, device=device) for _ in range(self.shared_expert_num)]) + for _ in range(self.num_levels)]) + + # specific gate dnn + specific_gate_output_dim = self.specific_expert_num + self.shared_expert_num + if len(gate_dnn_hidden_units) > 0: + self.specific_gate_dnn = nn.ModuleList( + [nn.ModuleList([DNN(self.input_dim, gate_dnn_hidden_units, activation=dnn_activation, + l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, + init_std=init_std, device=device) for _ in range(self.num_tasks)]) + for _ in range(self.num_levels)]) + self.specific_gate_dnn_final_layer = nn.ModuleList( + [nn.ModuleList([nn.Linear(gate_dnn_hidden_units[-1], specific_gate_output_dim, bias=False) + for _ in range(self.num_tasks)]) for _ in range(self.num_levels)]) + self.add_regularization_weight( + filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.gate_dnn.named_parameters()), + l2=l2_reg_dnn) + else: + self.specific_gate_dnn_final_layer = nn.ModuleList( + [nn.ModuleList([nn.Linear(gate_dnn_hidden_units[-1], specific_gate_output_dim, bias=False) + for _ in range(self.num_tasks)]) for _ in range(self.num_levels)]) - # gate dnn + # shared gate dnn + shared_gate_output_dim = self.num_tasks * self.specific_expert_num + self.shared_expert_num if len(gate_dnn_hidden_units) > 0: - self.gate_dnn = nn.ModuleList([DNN(self.input_dim, gate_dnn_hidden_units, activation=dnn_activation, - l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, - init_std=init_std, device=device) for _ in range(self.num_experts)]) - self.gate_dnn_final_layer = nn.ModuleList( - [nn.Linear(gate_dnn_hidden_units[-1], self.num_experts, bias=False) for _ in range(self.num_tasks)]) + self.shared_gate_dnn = nn.ModuleList( + [nn.ModuleList([DNN(self.input_dim, gate_dnn_hidden_units, activation=dnn_activation, + l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, + init_std=init_std, device=device) for _ in range(self.num_tasks)]) + for _ in range(self.num_levels)]) + self.shared_gate_dnn_final_layer = nn.ModuleList( + [nn.ModuleList([nn.Linear(gate_dnn_hidden_units[-1], shared_gate_output_dim, bias=False) + for _ in range(self.num_tasks)]) for _ in range(self.num_levels)]) self.add_regularization_weight( filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.gate_dnn.named_parameters()), l2=l2_reg_dnn) else: - self.gate_dnn_final_layer = nn.ModuleList( - [nn.Linear(self.input_dim, self.num_experts, bias=False) for _ in range(self.num_tasks)]) + self.shared_gate_dnn_final_layer = nn.ModuleList( + [nn.ModuleList([nn.Linear(gate_dnn_hidden_units[-1], shared_gate_output_dim, bias=False) + for _ in range(self.num_tasks)]) for _ in range(self.num_levels)]) # tower dnn (task-specific) if len(tower_dnn_hidden_units) > 0: @@ -107,44 +139,88 @@ def __init__(self, dnn_feature_columns, shared_expert_num=1, specific_expert_num self.add_regularization_weight( filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.expert_dnn.named_parameters()), l2=l2_reg_dnn) self.add_regularization_weight( - filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.gate_dnn_final_layer.named_parameters()), + filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.specific_gate_dnn_final_layer.named_parameters()), l2=l2_reg_dnn) self.add_regularization_weight( filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.tower_dnn_final_layer.named_parameters()), l2=l2_reg_dnn) self.to(device) + # single Extraction Layer + def cgc_net(self, inputs, level_num, is_last=False): + # inputs: [task1, task2, ... taskn, shared task] + + # task-specific expert layer + specific_expert_outputs = [] + for i in range(self.num_tasks): + for j in range(self.specific_expert_num): + specific_expert_output = self.specific_experts[level_num][i][j](inputs[i]) + specific_expert_outputs.append(specific_expert_output) + + # build task-shared expert layer + shared_expert_outputs = [] + for k in range(self.shared_expert_num): + shared_expert_output = self.shared_experts[level_num][k](inputs[-1]) + shared_expert_outputs.append(shared_expert_output) + + # task_specific gate (count = num_tasks) + cgc_outs = [] + for i in range(self.num_tasks): + # concat task-specific expert and task-shared expert + cur_experts_outputs = specific_expert_outputs[ + i * self.specific_expert_num:( + i + 1) * self.specific_expert_num] + shared_expert_outputs + cur_experts_outputs = torch.cat(cur_experts_outputs, -1) + + # gate dnn + if len(self.gate_dnn_hidden_units) > 0: + gate_dnn_out = self.specific_gate_dnn[level_num][i](inputs[i]) + gate_dnn_out = self.specific_gate_dnn_final_layer[level_num][i](gate_dnn_out) + else: + gate_dnn_out = self.specific_gate_dnn_final_layer[level_num][i](inputs[i]) + gate_mul_expert = torch.matmul(gate_dnn_out.softmax(1).unsqueeze(1), cur_experts_outputs) # (bs, 1, dim) + cgc_outs.append(gate_mul_expert.squeeze()) + + # task_shared gate, if the level is not the last, add one shared gate + if not is_last: + # all the expert include task-specific expert and task-shared expert + cur_experts_outputs = specific_expert_outputs + shared_expert_outputs + cur_experts_outputs = torch.cat(cur_experts_outputs, -1) + + # build gate layers + if len(self.gate_dnn_hidden_units) > 0: + gate_dnn_out = self.shared_gate_dnn[level_num](inputs[-1]) + gate_dnn_out = self.shared_gate_dnn_final_layer[level_num](gate_dnn_out) + else: + gate_dnn_out = self.shared_gate_dnn_final_layer[level_num](inputs[-1]) + gate_mul_expert = torch.matmul(gate_dnn_out.softmax(1).unsqueeze(1), cur_experts_outputs) # (bs, 1, dim) + cgc_outs.append(gate_mul_expert.squeeze()) + + return cgc_outs + def forward(self, X): sparse_embedding_list, dense_value_list = self.input_from_feature_columns(X, self.dnn_feature_columns, self.embedding_dict) dnn_input = combined_dnn_input(sparse_embedding_list, dense_value_list) - # expert dnn - expert_outs = [] - for i in range(self.num_experts): - expert_out = self.expert_dnn[i](dnn_input) - expert_outs.append(expert_out) - expert_outs = torch.stack(expert_outs, 1) # (bs, num_experts, dim) - - # gate dnn - mmoe_outs = [] - for i in range(self.num_tasks): - if len(self.gate_dnn_hidden_units) > 0: - gate_dnn_out = self.gate_dnn[i](dnn_input) - gate_dnn_out = self.gate_dnn_final_layer[i](gate_dnn_out) + # build Progressive Layered Extraction + ple_inputs = [dnn_input] * (self.num_tasks + 1) # [task1, task2, ... taskn, shared task] + ple_outputs = [] + for i in range(self.num_levels): + if i == self.num_levels - 1: # the last level + ple_outputs = self.cgc_net(inputs=ple_inputs, level_num=i, is_last=True) else: - gate_dnn_out = self.gate_dnn_final_layer[i](dnn_input) - gate_mul_expert = torch.matmul(gate_dnn_out.softmax(1).unsqueeze(1), expert_outs) # (bs, 1, dim) - mmoe_outs.append(gate_mul_expert.squeeze()) + ple_outputs = self.cgc_net(inputs=ple_inputs, level_num=i, is_last=False) + ple_inputs = ple_outputs # tower dnn (task-specific) task_outs = [] for i in range(self.num_tasks): if len(self.tower_dnn_hidden_units) > 0: - tower_dnn_out = self.tower_dnn[i](mmoe_outs[i]) + tower_dnn_out = self.tower_dnn[i](ple_outputs[i]) tower_dnn_logit = self.tower_dnn_final_layer[i](tower_dnn_out) else: - tower_dnn_logit = self.tower_dnn_final_layer[i](mmoe_outs[i]) + tower_dnn_logit = self.tower_dnn_final_layer[i](ple_outputs[i]) output = self.out[i](tower_dnn_logit) task_outs.append(output) task_outs = torch.cat(task_outs, -1) diff --git a/deepctr_torch/models/multitask/sharedbottom.py b/deepctr_torch/models/multitask/sharedbottom.py index 4f460e57..85dfd474 100644 --- a/deepctr_torch/models/multitask/sharedbottom.py +++ b/deepctr_torch/models/multitask/sharedbottom.py @@ -15,7 +15,7 @@ class SharedBottom(BaseModel): - """Instantiates the Multi-gate Mixture-of-Experts architecture. + """Instantiates the SharedBottom multi-task learning Network architecture. :param dnn_feature_columns: An iterable containing all the features used by deep part of the model. :param bottom_dnn_hidden_units: list, list of positive integer or empty list, the layer number and units in each layer of shared bottom DNN. From 113d90b65af6beeedbfe9c45042a56e59ef8022f Mon Sep 17 00:00:00 2001 From: zanshuxun <631763140@qq.com> Date: Sat, 2 Jul 2022 12:14:29 +0800 Subject: [PATCH 19/47] ple --- deepctr_torch/models/__init__.py | 3 +- deepctr_torch/models/multitask/__init__.py | 2 +- deepctr_torch/models/multitask/ple.py | 43 +- examples/byterec_sample.txt | 800 +++++++++++++++++++++ examples/run_mtl.py | 2 +- 5 files changed, 826 insertions(+), 24 deletions(-) diff --git a/deepctr_torch/models/__init__.py b/deepctr_torch/models/__init__.py index a03b46d8..93e4fdb6 100644 --- a/deepctr_torch/models/__init__.py +++ b/deepctr_torch/models/__init__.py @@ -16,5 +16,4 @@ from .dien import DIEN from .din import DIN from .afn import AFN -from .multitask import SharedBottom, ESMM, MMOE -# from .multitask import SharedBottom, ESMM, MMOE, PLE \ No newline at end of file +from .multitask import SharedBottom, ESMM, MMOE, PLE \ No newline at end of file diff --git a/deepctr_torch/models/multitask/__init__.py b/deepctr_torch/models/multitask/__init__.py index bbd267e4..55d7eb00 100644 --- a/deepctr_torch/models/multitask/__init__.py +++ b/deepctr_torch/models/multitask/__init__.py @@ -1,4 +1,4 @@ from .sharedbottom import SharedBottom from .esmm import ESMM from .mmoe import MMOE -# from .ple import PLE +from .ple import PLE diff --git a/deepctr_torch/models/multitask/ple.py b/deepctr_torch/models/multitask/ple.py index 6f1db724..f9c7fef3 100644 --- a/deepctr_torch/models/multitask/ple.py +++ b/deepctr_torch/models/multitask/ple.py @@ -74,7 +74,7 @@ def __init__(self, dnn_feature_columns, shared_expert_num=1, specific_expert_num l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, init_std=init_std, device=device) for _ in range(self.specific_expert_num)]) - for _ in range(self.task_names)]) for _ in range(self.num_levels)]) + for _ in range(self.num_tasks)]) for _ in range(self.num_levels)]) self.shared_experts = nn.ModuleList( [nn.ModuleList([DNN(self.input_dim, expert_dnn_hidden_units, activation=dnn_activation, l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, @@ -86,14 +86,14 @@ def __init__(self, dnn_feature_columns, shared_expert_num=1, specific_expert_num if len(gate_dnn_hidden_units) > 0: self.specific_gate_dnn = nn.ModuleList( [nn.ModuleList([DNN(self.input_dim, gate_dnn_hidden_units, activation=dnn_activation, - l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, - init_std=init_std, device=device) for _ in range(self.num_tasks)]) + l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, + init_std=init_std, device=device) for _ in range(self.num_tasks)]) for _ in range(self.num_levels)]) self.specific_gate_dnn_final_layer = nn.ModuleList( [nn.ModuleList([nn.Linear(gate_dnn_hidden_units[-1], specific_gate_output_dim, bias=False) for _ in range(self.num_tasks)]) for _ in range(self.num_levels)]) self.add_regularization_weight( - filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.gate_dnn.named_parameters()), + filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.specific_gate_dnn.named_parameters()), l2=l2_reg_dnn) else: self.specific_gate_dnn_final_layer = nn.ModuleList( @@ -103,21 +103,20 @@ def __init__(self, dnn_feature_columns, shared_expert_num=1, specific_expert_num # shared gate dnn shared_gate_output_dim = self.num_tasks * self.specific_expert_num + self.shared_expert_num if len(gate_dnn_hidden_units) > 0: - self.shared_gate_dnn = nn.ModuleList( - [nn.ModuleList([DNN(self.input_dim, gate_dnn_hidden_units, activation=dnn_activation, - l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, - init_std=init_std, device=device) for _ in range(self.num_tasks)]) - for _ in range(self.num_levels)]) + self.shared_gate_dnn = nn.ModuleList([DNN(self.input_dim, gate_dnn_hidden_units, activation=dnn_activation, + l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, + init_std=init_std, device=device) for _ in + range(self.num_levels)]) self.shared_gate_dnn_final_layer = nn.ModuleList( - [nn.ModuleList([nn.Linear(gate_dnn_hidden_units[-1], shared_gate_output_dim, bias=False) - for _ in range(self.num_tasks)]) for _ in range(self.num_levels)]) + [nn.Linear(gate_dnn_hidden_units[-1], shared_gate_output_dim, bias=False) + for _ in range(self.num_levels)]) self.add_regularization_weight( - filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.gate_dnn.named_parameters()), + filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.shared_gate_dnn.named_parameters()), l2=l2_reg_dnn) else: self.shared_gate_dnn_final_layer = nn.ModuleList( - [nn.ModuleList([nn.Linear(gate_dnn_hidden_units[-1], shared_gate_output_dim, bias=False) - for _ in range(self.num_tasks)]) for _ in range(self.num_levels)]) + [nn.Linear(gate_dnn_hidden_units[-1], shared_gate_output_dim, bias=False) + for _ in range(self.num_levels)]) # tower dnn (task-specific) if len(tower_dnn_hidden_units) > 0: @@ -137,10 +136,15 @@ def __init__(self, dnn_feature_columns, shared_expert_num=1, specific_expert_num self.out = nn.ModuleList([PredictionLayer(task) for task in task_types]) self.add_regularization_weight( - filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.expert_dnn.named_parameters()), l2=l2_reg_dnn) + filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.specific_experts.named_parameters()), + l2=l2_reg_dnn) self.add_regularization_weight( - filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.specific_gate_dnn_final_layer.named_parameters()), + filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.shared_experts.named_parameters()), l2=l2_reg_dnn) + self.add_regularization_weight(filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], + self.specific_gate_dnn_final_layer.named_parameters()), l2=l2_reg_dnn) + self.add_regularization_weight(filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], + self.shared_gate_dnn_final_layer.named_parameters()), l2=l2_reg_dnn) self.add_regularization_weight( filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.tower_dnn_final_layer.named_parameters()), l2=l2_reg_dnn) @@ -168,9 +172,8 @@ def cgc_net(self, inputs, level_num, is_last=False): for i in range(self.num_tasks): # concat task-specific expert and task-shared expert cur_experts_outputs = specific_expert_outputs[ - i * self.specific_expert_num:( - i + 1) * self.specific_expert_num] + shared_expert_outputs - cur_experts_outputs = torch.cat(cur_experts_outputs, -1) + i * self.specific_expert_num:(i + 1) * self.specific_expert_num] + shared_expert_outputs + cur_experts_outputs = torch.stack(cur_experts_outputs, 1) # gate dnn if len(self.gate_dnn_hidden_units) > 0: @@ -185,7 +188,7 @@ def cgc_net(self, inputs, level_num, is_last=False): if not is_last: # all the expert include task-specific expert and task-shared expert cur_experts_outputs = specific_expert_outputs + shared_expert_outputs - cur_experts_outputs = torch.cat(cur_experts_outputs, -1) + cur_experts_outputs = torch.stack(cur_experts_outputs, 1) # build gate layers if len(self.gate_dnn_hidden_units) > 0: diff --git a/examples/byterec_sample.txt b/examples/byterec_sample.txt index 56f2847c..975bfa7c 100644 --- a/examples/byterec_sample.txt +++ b/examples/byterec_sample.txt @@ -198,3 +198,803 @@ 51720 80 1209182 2453 -1 0 0 0 -1 28174 53084376234 3 19622 286 1209183 2246 106 0 0 0 16621 43978 53083857346 9 13205 -1 1209184 233266 107 1 1 0 1261 43979 53086370106 10 +2552 76 1209185 146367 49 0 0 0 -1 14347 53086425451 9 +31979 -1 939695 28160 96 1 0 0 3287 7758 53085492212 10 +57404 -1 648668 19687 85 1 0 0 -1 31784 53085992236 10 +57405 16 1209186 276671 107 0 1 0 -1 43980 53085674875 9 +1117 316 1209187 228270 7 0 0 0 -1 4525 53084895228 9 +37448 115 567569 44888 42 0 0 0 1699 43981 53085738314 9 +9669 146 1209188 167894 82 0 1 0 4019 19132 53085875614 11 +19435 40 377366 25924 85 0 0 0 -1 33801 53085422342 10 +53299 6 4297 45326 74 0 0 0 -1 43982 53086417671 10 +11043 -1 1209189 214651 108 1 0 0 -1 36611 53083396103 9 +8144 12 1209190 71308 33 0 0 0 28240 12439 53086443979 9 +6812 16 1209191 67265 32 0 0 0 8320 30364 53086451803 7 +8623 82 1209192 10098 106 0 1 0 -1 11996 53086444998 8 +9629 31 1209193 184752 109 0 1 0 -1 32093 53085591140 5 +52799 175 1209194 109629 101 0 1 0 -1 33106 53085915481 6 +38008 -1 1209195 456237 11 1 0 1 56 18558 53085805030 9 +51750 154 234989 33229 9 0 1 0 -1 28234 53085437678 8 +57406 226 71963 34917 110 0 1 0 30276 36314 53086303187 28 +20955 243 265934 6467 33 0 1 0 13350 33575 53086329076 42 +46869 203 1209196 75848 108 0 1 0 5865 13628 53086256219 4 +37906 182 1209197 456238 111 0 0 0 63 6455 53086423321 11 +53073 -1 1209198 215218 24 1 0 0 -1 43976 53085826604 10 +44362 47 426 380 24 0 1 0 -1 3543 53086393938 9 +31772 12 1209199 401070 4 0 0 0 -1 15842 53084279659 10 +15416 156 1209200 214084 112 0 0 0 -1 18637 53086351076 10 +13403 18 1209201 220117 113 0 0 0 -1 9568 53086422898 10 +19455 302 1209202 60666 76 0 1 0 813 27541 53086330213 10 +10923 45 852899 613 74 0 0 0 14069 14577 53085721201 10 +33333 173 1209203 40932 114 0 1 0 -1 20625 53084384166 10 +49183 150 970335 114198 -1 0 0 0 -1 21457 53085484281 9 +6452 99 750749 20526 67 0 1 0 -1 18924 53085605049 10 +57407 -1 978611 4895 -1 1 1 0 -1 43983 53080857372 10 +36546 181 141432 2989 103 0 0 0 2228 33780 53085397913 30 +4956 193 26094 1344 79 0 1 0 410 38669 53085314548 18 +57408 -1 1209204 321149 71 1 0 0 -1 43984 53085917661 10 +22580 -1 343880 9514 101 1 1 0 -1 37448 53085680731 2 +41840 -1 1209205 1886 68 1 0 0 -1 15253 53085842482 10 +2085 29 1209206 456239 37 0 1 0 -1 4983 53086440092 10 +39056 59 1209207 456240 18 0 0 0 43 7471 53086422631 9 +37584 68 75987 1028 14 0 0 0 -1 19348 53086345061 18 +47304 41 16118 573 7 0 0 0 -1 15230 53085412854 11 +43834 100 353335 122030 115 0 0 0 315 1098 53086461802 8 +26244 -1 1209208 327068 86 1 0 0 -1 1623 53069870239 10 +57409 -1 1209209 98276 73 1 0 0 -1 43985 53085400449 10 +6703 120 1209210 33843 116 0 0 0 -1 800 53086380082 14 +7084 40 1209211 264412 117 0 0 0 8363 43986 53084012578 7 +43815 138 414536 20319 85 0 0 0 -1 1004 53085942353 7 +5204 150 1209212 456241 118 0 0 0 -1 43987 53085573010 10 +33070 18 1209213 133810 39 0 0 0 31146 4561 53086426278 12 +27813 -1 1209214 140031 1 1 0 0 -1 19331 53082223235 17 +45451 178 1209215 29424 49 0 0 0 -1 8183 53086455649 13 +38422 35 208986 49131 119 0 0 0 -1 35482 53085755875 10 +4515 -1 1209216 11746 -1 1 0 0 -1 43988 53081893166 13 +43779 18 1209217 338395 120 0 0 0 11462 778 53086438978 17 +6964 68 251234 5424 6 0 1 0 -1 4328 53086350493 11 +21836 8 609386 57719 4 0 0 0 -1 43989 53084544507 2 +4354 286 1209218 8360 121 0 1 0 -1 17527 53085330935 17 +21515 226 1209219 14179 2 0 1 0 284 43990 53085490359 12 +57410 -1 43146 50765 78 1 1 0 -1 43991 53085943836 10 +44483 91 18505 2933 113 0 0 0 -1 4072 53085678558 12 +538 16 1209220 424029 34 0 0 0 -1 32354 53086025633 16 +6939 123 1209221 189735 122 0 0 0 238 3345 53086354044 16 +34817 100 153074 470 123 0 1 0 -1 32606 53086379471 2 +27589 357 1209222 295007 39 0 0 0 -1 28070 53086377620 21 +4657 -1 1209223 174907 7 1 1 0 -1 30865 53086012840 14 +57411 60 1209224 33647 124 0 0 0 337 36349 53084258240 14 +50151 292 1209225 49212 125 0 0 0 -1 24206 53086372366 14 +35758 273 346136 20957 78 0 1 0 -1 8819 53086438829 10 +32247 134 106480 42478 126 0 0 0 199 39560 53085826567 10 +57412 28 300062 63041 127 0 1 0 3463 43992 53085835603 9 +52885 150 1209226 46123 128 0 0 0 20518 32978 53084108828 9 +41321 8 1209227 258821 55 0 1 0 -1 19815 53085224206 20 +48978 -1 1209228 456242 33 1 1 0 -1 20835 53084226691 18 +30198 -1 1209229 4889 96 1 0 0 6065 13199 53085979582 7 +27394 235 7813 58469 129 0 0 0 -1 6267 53086378999 10 +55222 316 1209230 3328 7 0 0 0 3153 43993 53086325877 14 +206 -1 1209231 1243 130 1 0 0 -1 13511 53086259925 14 +14484 -1 136238 23715 96 1 0 0 -1 37906 53086383583 7 +9616 91 1209232 228275 101 0 0 0 -1 10282 53086395967 14 +2998 77 315336 81814 86 0 0 0 -1 43994 53086445157 2 +12601 46 62767 10083 131 0 1 0 3758 18224 53086362326 9 +57413 228 558375 24277 39 0 0 0 757 31127 53085659471 5 +37996 53 206837 19950 69 0 0 0 6123 43995 53086349753 10 +15627 35 1209233 456243 42 0 0 0 57 43996 53086385814 13 +3244 81 1209234 128982 132 0 1 0 110 3976 53086446342 15 +10388 118 72266 51077 0 0 0 0 -1 12174 53086453978 9 +39845 155 84627 202 133 0 0 0 -1 24881 53086461911 11 +37126 76 659576 13254 73 0 1 0 -1 35827 53085870653 7 +36078 140 1209235 213746 101 0 1 0 -1 41855 53086362375 10 +30928 30 1209236 15497 134 0 1 0 2219 34737 53084398120 21 +4112 -1 1209237 41018 125 1 0 0 -1 500 53086200656 9 +3407 99 1209238 38830 14 0 0 0 -1 22465 53083946541 17 +52039 292 86024 2793 60 0 1 0 -1 28869 53086431733 10 +48061 24 36211 54195 135 0 1 0 1059 17845 53085060377 9 +47620 216 137096 4362 97 0 0 0 639 16348 53086260234 10 +17690 29 1209239 12519 20 0 0 0 11024 36558 53086417339 10 +57414 19 1209240 194880 26 0 1 0 275 31509 53085935784 9 +41458 239 1209241 72160 136 0 0 0 863 40102 53086373381 16 +32275 45 386589 16739 28 0 1 0 -1 1549 53086434679 21 +6767 -1 1209242 94486 137 1 1 0 -1 43968 53083267801 10 +3269 114 891464 251567 33 0 0 0 10602 35716 53086278091 10 +6645 -1 1209243 1477 -1 1 0 0 -1 2801 53080570389 9 +2876 -1 1209244 6927 33 1 0 0 -1 31860 53086359689 17 +57415 110 1209245 1237 10 0 1 0 -1 30723 53086425618 15 +9382 144 897593 5682 138 0 0 0 3380 33153 53086393825 10 +57416 35 1209246 44820 139 0 0 0 930 43997 53086419568 20 +9332 150 1209247 177283 9 0 1 0 -1 536 53086002634 10 +57417 99 113616 37554 140 0 1 0 -1 43998 53084983779 6 +1022 31 38600 33717 29 0 0 0 -1 394 53085400590 10 +1205 57 52290 203268 65 0 0 0 -1 35917 53085737401 41 +32830 93 211440 3938 45 0 0 0 7 9479 53086428185 20 +18333 18 318002 59803 48 0 0 0 33 10277 53086101222 7 +45657 38 1209248 456244 103 0 0 0 2247 8942 53086409762 24 +36342 217 1209249 100029 13 0 0 0 -1 751 53086442996 22 +6988 91 913490 16759 38 0 0 0 -1 43999 53085181080 10 +19389 159 844135 149385 35 0 1 0 -1 10029 53086370262 10 +12874 -1 1209250 34289 42 1 1 0 -1 44000 53085985407 10 +987 97 135416 2961 17 0 0 0 3342 15467 53086445911 9 +15808 243 779177 56502 85 0 1 0 -1 34366 53086452747 7 +19635 10 779177 56502 104 0 1 0 -1 13950 53086452747 7 +24015 -1 1209251 35286 42 1 1 0 -1 3816 53084018605 9 +887 -1 1209252 120830 13 2 0 1 4406 8677 53086456029 18 +9385 57 1161002 881 133 0 1 0 -1 12505 53086275822 10 +47573 240 1209253 456245 136 0 0 0 -1 16176 53086454534 7 +1408 13 1209254 6282 4 0 0 0 -1 2768 53086457491 10 +8512 91 1209255 34787 35 0 0 0 -1 34630 53086417505 10 +863 106 275307 17656 90 0 1 0 176 31625 53085265695 9 +23749 81 41081 3376 141 0 1 0 2732 44001 53086431357 9 +19041 -1 1209256 19479 107 1 0 0 562 44002 53085417929 7 +2538 -1 1209257 2020 35 1 0 0 -1 44003 53086217075 16 +32851 107 1209258 456246 17 0 1 0 110 9542 53086381912 16 +57418 6 1209259 242319 142 0 0 0 -1 44004 53083850779 16 +14245 205 646683 215742 75 0 0 0 -1 5765 53086332292 21 +22520 251 1209260 98473 15 0 0 0 68 3091 53086455237 25 +7807 -1 1209261 9922 65 1 0 0 -1 44005 53085382733 16 +57419 0 1297 4895 143 0 1 0 -1 44006 53086385592 9 +2114 -1 1209262 17443 67 1 0 0 -1 38563 53085667385 24 +30212 -1 1209263 9488 29 1 0 0 -1 27908 53086455897 25 +37496 242 84149 14216 52 0 0 0 -1 19717 53086386442 4 +29096 16 157739 8121 123 0 1 0 -1 31064 53085857182 10 +45016 183 168022 30411 144 0 1 0 -1 6317 53084254394 10 +35698 35 1209264 29219 33 0 0 0 -1 44007 53086455632 21 +36342 -1 1209265 22826 9 1 0 0 4820 751 53068781633 9 +33580 349 1209266 196786 4 0 1 0 -1 12181 53085678882 42 +57420 194 1209267 456247 145 3 1 0 835 44008 53086381438 24 +4618 11 1209268 93954 111 0 0 0 10827 7820 53086346486 12 +11012 56 1209269 456248 146 0 1 0 -1 12902 53086442751 10 +1237 94 259356 2715 147 0 1 0 -1 12991 53085917520 7 +57421 31 1209270 37222 148 0 0 0 16142 44009 53083877358 30 +20271 91 618587 27846 35 0 1 0 8284 12963 53085936678 21 +11114 169 172316 51004 132 0 1 0 7835 30428 53084786773 20 +11408 261 18019 10874 69 0 1 0 -1 1201 53085256360 9 +57422 -1 82101 236 4 1 1 0 -1 36896 53086366768 15 +31765 143 127213 65254 86 0 0 0 10601 33761 53085260647 9 +31255 364 96335 9393 6 0 0 0 -1 13558 53084474466 7 +38125 57 1209271 288116 35 0 1 0 1031 11151 53086460766 21 +35253 42 431003 100989 64 0 1 0 1058 10461 53086361090 10 +3236 -1 339571 57481 149 1 0 0 -1 12476 53085759810 9 +6295 21 29577 3938 45 0 0 0 2346 44010 53086428999 42 +57423 171 1209272 456249 150 0 1 0 7288 44011 53084363226 18 +13879 157 1209273 196400 45 0 0 0 1102 22599 53085552004 25 +30561 6 1209274 280921 7 0 1 0 -1 12604 53086431566 28 +6315 91 1209275 456250 113 0 1 0 -1 1514 53086419751 10 +18779 167 129880 203275 103 0 0 0 1210 32629 53086395661 15 +3627 -1 4360 546 135 1 1 0 -1 33559 53086116899 10 +16798 29 124248 9100 56 0 0 0 3227 4108 53084279613 19 +43393 73 528923 339 108 0 0 0 33 44012 53085998044 10 +29981 41 29060 32642 4 0 1 0 1856 10734 53084775626 12 +866 92 177162 19146 42 0 0 0 -1 157 53086421013 9 +14210 66 426 380 24 0 1 0 -1 42558 53086393938 9 +5816 -1 100721 1022 151 2 0 0 -1 6204 53086458811 21 +24446 271 426 380 24 0 1 0 -1 11231 53086393938 9 +20583 76 1209276 101410 85 0 1 0 -1 13847 53084172588 23 +39463 180 1209277 239739 75 0 0 0 -1 24355 53086423405 26 +582 189 53474 19183 4 0 1 0 -1 14369 53086420315 10 +6281 -1 286879 77242 44 1 0 0 19217 32962 53085993024 8 +57424 -1 453779 13263 118 1 0 0 -1 44013 53086368646 10 +6348 -1 1209278 98771 -1 1 0 0 -1 9021 53078141801 42 +43925 -1 1209279 267164 34 1 0 0 -1 1490 53086272483 22 +5555 291 1044186 90166 152 0 0 0 11228 5806 53086459792 6 +31743 -1 1209280 16667 46 1 0 0 12 44014 53084949103 26 +20569 129 8637 8679 15 0 0 0 2121 34649 53086436720 10 +44015 -1 1209281 25019 153 1 0 0 1770 1921 53086018645 6 +11367 29 32779 1015 35 0 0 0 724 15067 53086415134 5 +44015 177 1072822 103373 64 0 0 0 -1 1921 53085516281 21 +57425 166 1209282 127296 4 0 1 0 -1 44015 53086084217 10 +2644 -1 1209283 456251 154 1 0 0 -1 24297 53084004110 10 +30931 129 1209284 70116 35 0 1 0 1719 725 53086035775 9 +4878 242 1025856 1849 85 0 0 0 1035 3038 53085488449 20 +9598 -1 1209285 176223 23 1 0 0 312 3987 53081125856 10 +43762 -1 1209286 5652 32 1 0 0 834 683 53086085405 10 +7678 -1 1209287 189135 7 2 0 0 110 306 53086110331 10 +57426 25 966400 32876 -1 0 0 0 -1 44016 53086091231 9 +2092 45 1209288 101979 4 0 0 0 -1 5922 53086457464 10 +6699 -1 1209289 94305 137 1 0 0 298 5717 53082791262 9 +3743 159 800130 20196 42 0 0 0 -1 14584 53085499923 9 +2019 106 1209290 900 0 0 0 0 -1 37121 53084802862 11 +17976 -1 660537 13961 24 1 0 0 -1 5767 53085601749 8 +2250 -1 1209291 267336 38 1 0 0 -1 6156 53058291105 7 +9047 52 26148 1430 29 0 1 0 1525 44017 53086171911 18 +33318 91 718666 140810 27 0 1 0 46 841 53085774929 42 +33729 7 573750 167549 85 0 1 0 -1 6638 53085155259 9 +4842 -1 653496 7245 4 1 1 0 -1 43158 53086104079 4 +20787 189 194134 9933 155 0 1 0 -1 42285 53086415753 7 +48784 83 1209292 51784 134 0 0 0 -1 20231 53085848555 9 +5517 20 72514 3549 52 0 1 0 -1 828 53086414858 10 +13171 118 302290 15626 156 0 0 0 -1 35824 53086038424 20 +49502 154 366642 98813 39 0 0 0 -1 22414 53085264824 12 +49203 170 57596 128171 42 0 0 0 -1 21510 53086011500 9 +11022 144 1209293 120824 68 0 1 0 10503 7891 53086424065 9 +47662 150 1209294 266206 74 3 0 0 -1 16501 53085199281 10 +13446 -1 632780 34340 0 2 0 0 -1 31183 53086343196 20 +10153 89 1209295 92764 85 0 0 0 -1 31140 53085432810 8 +21890 26 38815 2097 44 0 1 0 -1 9591 53086418088 9 +23615 166 1209296 202802 17 0 0 0 39138 42245 53084558517 20 +34398 116 277319 123194 1 0 0 0 3605 4950 53086083610 14 +39727 -1 533992 28924 113 1 1 0 8506 7506 53085835593 6 +35164 150 284645 34379 52 0 0 0 5866 24579 53086330078 9 +53164 185 1209297 22618 68 0 0 0 -1 35159 53086017683 20 +53211 -1 1209298 6210 4 1 0 0 13655 31974 53086329526 20 +18179 304 118269 2589 7 0 1 0 -1 10068 53086247022 2 +8439 98 9635 297 157 0 0 0 -1 12773 53086336481 18 +3218 133 3985 47023 158 0 1 1 -1 24017 53086416149 7 +57427 123 1209299 456252 159 0 0 0 -1 44018 53086468209 21 +985 10 1209300 92339 6 0 0 0 82 147 53085562522 21 +16888 45 1209301 456253 160 0 0 0 312 17884 53086425402 21 +11410 185 1209302 456254 161 3 0 0 -1 6100 53084215934 10 +17404 6 1209303 4562 9 0 1 0 -1 19947 53086205945 10 +15144 125 629875 15298 -1 0 1 0 -1 11832 53085909148 9 +31195 77 461724 39401 120 0 0 0 272 1693 53085652257 6 +17801 -1 119140 7665 44 1 0 0 -1 7692 53085908018 7 +36342 217 1209304 219153 80 0 0 0 43 751 53084031977 9 +57428 71 1209305 454555 33 0 1 0 -1 44019 53084036966 4 +33790 -1 1209306 51601 -1 1 0 0 -1 44020 53076834356 10 +32640 -1 1209307 14617 159 1 0 0 -1 19226 53086269390 10 +16313 31 102127 36013 162 0 1 0 1588 44021 53086332975 10 +57429 217 176324 19289 63 0 1 0 -1 44022 53086373501 4 +3609 34 4437 12848 119 0 1 0 -1 3730 53086360896 10 +6219 45 53218 9595 29 0 0 0 2234 28948 53084824784 9 +15626 175 1209308 124904 32 0 1 0 -1 6483 53086436540 10 +22493 -1 1209309 256140 55 1 0 0 -1 26677 53083308576 9 +30995 -1 1209310 25350 133 1 0 0 -1 1293 53085672905 10 +35173 21 1209311 456255 163 0 0 0 -1 21299 53086392342 9 +17694 261 52417 7721 35 0 1 0 7 44023 53085837365 10 +34846 68 30361 266 151 0 1 0 -1 6430 53085746566 7 +20098 31 93301 2581 88 0 1 0 -1 23599 53085499299 10 +34317 97 547 14869 106 0 0 0 -1 44024 53084784807 24 +2045 175 1209312 126650 28 0 0 0 -1 1869 53086348275 10 +1528 136 1209313 39925 23 0 1 0 -1 44025 53086421433 10 +11080 109 1030427 105941 80 0 0 0 3887 5208 53084791499 6 +1775 28 1209314 13470 135 0 0 0 7915 30899 53086462152 7 +22324 337 273047 36168 164 0 0 0 -1 18353 53086379543 18 +27400 142 850731 108958 89 0 1 0 -1 27711 53084831045 9 +45596 63 228395 224852 84 0 1 0 -1 8740 53086293445 9 +6014 -1 1209315 204921 -1 1 0 0 -1 14505 53060981968 10 +7530 73 1209316 35817 113 0 0 0 237 2014 53086340022 6 +29509 -1 1209317 99427 146 1 1 1 -1 27227 53086376546 11 +3044 -1 1209318 291389 9 1 0 0 -1 6450 53077721936 11 +46016 138 861315 57985 44 0 0 0 -1 10431 53086377898 9 +12368 114 11961 27071 63 0 1 0 -1 3118 53086382698 8 +1754 153 62718 2474 7 0 1 0 -1 7177 53084610071 10 +11356 71 34074 16382 69 0 0 0 863 2088 53086265255 10 +28543 25 1209319 136378 44 0 1 0 -1 6304 53086436917 10 +12862 138 1209320 133071 80 0 1 0 -1 3194 53086101577 9 +44160 224 1209321 456256 34 0 1 0 -1 2593 53084479155 10 +36131 258 10820 61705 147 0 0 0 9563 20010 53086303152 18 +36957 106 648393 159854 82 0 1 0 -1 44026 53084795011 9 +44020 -1 531578 5531 4 1 1 0 4556 1937 53086463430 10 +14020 -1 1209322 118795 42 1 1 0 -1 8947 53086250268 10 +30934 -1 1209323 85686 95 1 0 0 -1 12465 53086358390 10 +44946 -1 1209324 5968 66 1 0 0 1089 6050 53085905987 10 +22218 19 86098 10542 85 0 0 0 -1 7354 53085752011 21 +34392 155 1209325 320270 165 0 0 0 -1 37493 53085853387 10 +6195 167 1209326 9641 85 0 1 0 16396 44027 53086420980 10 +8992 -1 1209327 102617 166 1 0 0 15137 36546 53084811735 7 +36165 55 704966 18494 87 0 0 0 3240 17351 53086100376 20 +44922 -1 124183 87707 33 1 0 0 -1 5952 53084958032 10 +5758 91 1209328 61871 24 0 0 0 7049 30460 53086425997 10 +12028 -1 1209329 47049 33 2 0 0 327 8118 53086377785 10 +5151 -1 1209330 456257 17 1 0 0 -1 35110 53086384107 8 +57430 114 30869 8772 70 0 0 0 -1 44028 53086371364 9 +47611 182 34877 180671 52 0 0 0 -1 16319 53086355829 10 +9610 56 89833 35730 149 0 1 0 1455 5430 53086263549 10 +57431 134 1209331 247928 1 0 0 0 35 44029 53086369591 10 +38028 99 1209332 633 44 0 1 0 -1 9738 53085740319 10 +15151 18 1209333 133863 20 0 0 0 5613 44030 53086444143 14 +14917 335 1209334 93563 50 0 1 0 13814 33939 53086450293 10 +47053 271 1209335 456258 34 0 0 0 35 14361 53086444708 10 +3543 103 1876 10198 151 0 0 0 -1 29695 53086381604 18 +33664 21 1209336 64383 6 0 0 0 -1 37606 53084373165 16 +19471 -1 1209337 36857 -1 1 0 0 -1 42073 53060360961 18 +44372 15 1209338 456259 35 0 0 0 280 3568 53086446517 9 +11053 31 1209339 209247 34 0 0 0 33 41078 53084440099 18 +7946 77 1209340 13632 72 0 0 0 1532 38365 53084058969 10 +52817 -1 1209341 30554 52 1 0 0 -1 44031 53086126702 26 +57432 -1 1194338 38268 89 1 0 0 -1 44032 53085678659 10 +38448 171 60256 2465 135 0 0 0 208 20893 53086449493 9 +34722 57 24426 31126 20 0 1 0 -1 25975 53085125318 10 +16141 29 524494 348968 13 0 0 0 2578 1593 53086429721 7 +52870 129 37311 18166 7 0 0 0 -1 44033 53085324168 33 +35319 72 12290 130255 74 0 1 0 -1 1516 53086377971 10 +7414 26 1209342 121019 23 0 1 0 57 44034 53084049005 9 +12637 265 1123678 140911 167 0 0 0 -1 27794 53085428965 10 +4533 -1 386575 9927 84 1 0 0 3338 17066 53084708546 9 +32738 -1 1209343 449557 0 2 0 0 4102 32343 53086423930 16 +43887 21 570895 1481 44 0 1 0 -1 1315 53085895075 10 +52930 -1 1209344 8898 -1 1 0 0 -1 30583 53070013158 9 +57433 218 1209345 154921 44 0 1 0 -1 41405 53085396178 8 +3229 60 847161 187849 104 0 1 0 -1 12418 53086378649 16 +2414 68 15059 1979 156 0 0 0 -1 35496 53085551127 27 +8101 -1 1209346 7177 23 1 0 0 1568 15856 53086013476 10 +31923 27 751941 19627 168 0 0 0 1283 16340 53086336124 10 +40200 1 50443 19811 89 0 0 0 -1 44035 53085308569 10 +26272 15 1209271 288116 35 0 0 0 1031 37106 53086460766 21 +7655 31 600275 28402 44 0 0 0 3176 5381 53086423642 10 +5975 123 410712 3185 13 0 1 0 172 30760 53086332960 21 +11401 29 374907 4353 13 3 1 0 -1 245 53086422657 7 +8863 -1 1209347 21242 23 1 0 0 -1 6143 53083506787 10 +34651 -1 1209348 35160 33 1 0 0 909 702 53083781795 8 +47953 100 502585 27495 89 0 1 0 237 17513 53085907318 10 +57434 76 3762 6263 169 0 0 0 -1 39716 53086372238 7 +57435 225 785901 204893 85 0 1 0 -1 44036 53084606840 9 +34770 6 4474 29502 4 0 1 0 -1 27553 53085654373 39 +8220 319 582813 186881 30 0 1 0 284 6553 53085918233 14 +2123 65 117920 18942 5 0 1 0 -1 7249 53085241804 7 +1391 157 1209349 177705 42 0 0 0 4238 30592 53085660740 7 +46155 315 1209350 456260 85 0 1 0 -1 10954 53086344104 7 +13056 236 6768 71154 148 0 1 1 -1 44037 53086271031 10 +17556 140 1209351 45571 22 0 0 0 -1 2976 53084099083 10 +46654 73 1209352 215313 73 0 0 0 2642 12870 53085739792 9 +23709 6 8364 19043 170 0 1 0 -1 21388 53085383838 38 +27911 172 951317 64806 171 0 1 0 -1 16402 53085837888 10 +34182 235 1209353 2174 7 0 0 0 -1 1273 53083933126 9 +777 99 70275 57073 151 0 1 0 -1 11162 53085835198 9 +48034 70 13383 7857 78 0 0 0 -1 17745 53086107958 10 +37739 -1 65235 11490 134 1 0 0 -1 4332 53086276235 10 +22031 343 607250 85558 122 0 0 0 -1 24292 53085665030 6 +19275 56 427959 42832 159 0 1 0 468 27531 53086276432 9 +425 151 89642 25000 127 0 0 0 -1 39520 53086120689 20 +35830 109 223961 66792 36 0 1 0 -1 44038 53085586892 3 +43996 -1 1209354 456261 54 1 0 0 -1 1818 53082241016 10 +1249 328 4129 19908 82 0 1 0 4200 14274 53086201539 10 +53167 40 24426 31126 20 0 0 0 -1 44039 53085125318 10 +27297 340 1209355 244 29 0 1 0 -1 43945 53085080311 10 +2031 -1 57915 1518 103 1 0 0 1522 1894 53085852063 22 +57436 -1 1209356 407979 114 1 0 0 -1 31306 53086438187 9 +9512 -1 1209357 456262 59 1 0 0 22 30797 53085896052 8 +54847 91 1209358 324064 64 0 0 0 199 35597 53086459510 7 +9113 7 1209359 107478 47 0 0 0 -1 12588 53085836708 9 +46873 179 623689 47351 35 0 0 0 811 13637 53086443261 42 +13864 -1 1209360 196143 96 1 0 0 -1 31897 53084546317 9 +47752 57 62966 4998 85 0 1 0 -1 16792 53085506408 10 +34357 210 416756 208778 7 0 0 0 595 677 53086073700 11 +6794 -1 1209361 119867 152 1 0 0 6859 24565 53086041040 7 +25729 187 1209362 456263 92 0 0 0 -1 37317 53085694881 9 +4321 12 643843 132498 74 0 0 0 -1 6620 53086445901 9 +8979 150 1209363 269740 93 0 1 0 296 11131 53085163549 10 +42826 233 1209364 456264 68 0 0 0 2711 22240 53086470810 10 +2258 134 563499 14401 78 0 1 0 -1 6251 53086346212 16 +14016 71 505407 26178 15 0 1 0 1528 2933 53086370952 7 +43924 70 1046617 43201 140 0 0 0 3887 1487 53085818522 21 +35198 69 923305 20426 3 0 0 0 1098 44040 53086425653 10 +5798 129 71064 21744 27 0 0 0 -1 33618 53085233067 2 +12484 169 1209365 94932 172 0 0 0 4998 7477 53086265639 7 +57437 59 776936 165620 133 0 0 0 -1 44041 53086453741 10 +2085 29 412302 136293 170 0 0 0 280 4983 53085747688 9 +50729 180 162156 11980 27 0 0 0 12270 25718 53085152640 9 +54922 139 71475 59442 35 0 1 0 3349 44042 53086447471 10 +3318 47 27110 2635 6 0 0 0 -1 6716 53086415115 18 +4966 190 1209366 25005 10 0 1 0 1548 34803 53086256253 10 +41018 274 1209367 248046 118 0 0 0 586 3018 53086154827 10 +19848 55 309178 106983 143 0 1 0 -1 44043 53085772953 9 +33070 18 116750 5102 70 0 1 0 -1 4561 53085986193 10 +12747 196 125790 48628 127 0 0 0 1705 571 53085859203 6 +26694 -1 1209368 106602 173 1 1 0 -1 44044 53084663898 10 +14917 335 1209369 456265 174 0 0 0 4016 33939 53086343363 10 +31936 133 1209102 37442 6 0 1 0 762 4093 53086356318 19 +626 175 206422 100857 32 0 0 0 944 578 53086374885 9 +1775 28 184617 3386 101 0 1 0 3296 30899 53085400320 10 +51106 155 3679 40854 64 0 0 0 -1 26688 53086114331 9 +18218 106 1209370 109520 47 0 1 0 -1 4271 53086361478 10 +1789 134 1209371 70238 31 0 0 0 39138 21516 53086100342 10 +34793 21 1209372 89255 14 0 0 0 -1 6672 53084792280 9 +57438 -1 1209373 45072 70 1 0 0 -1 37618 53085741119 7 +44736 148 578591 2218 6 0 1 0 -1 5204 53086326558 9 +48213 14 18483 57891 31 0 0 0 -1 18310 53086307935 38 +52622 -1 1209374 78028 135 1 0 0 -1 30084 53085490153 10 +7838 -1 1209375 62468 10 1 0 0 1917 7483 53083790953 10 +57439 92 1209376 456266 7 0 0 0 -1 44045 53086449335 24 +30928 30 635107 32806 71 0 1 0 649 34737 53085422653 10 +12871 210 1058207 52058 35 0 0 0 -1 14134 53086198009 10 +29445 83 1209377 14537 172 0 1 0 -1 44046 53086272167 10 +19287 274 1209378 84914 23 0 1 0 -1 35997 53086437639 10 +11262 105 1209379 88368 88 0 1 0 272 44047 53084643988 6 +32398 116 1209380 456267 25 0 0 0 342 231 53085257783 9 +55836 91 9392 14327 39 0 1 0 -1 33478 53086353626 10 +23647 -1 1209381 76231 4 1 0 0 -1 923 53085252027 9 +2102 25 472014 6344 175 0 0 0 -1 5462 53086419257 10 +9208 -1 1209382 12718 -1 1 0 0 -1 19610 53071237795 10 +31364 335 1209383 6099 46 0 1 0 -1 44048 53086179673 9 +31037 317 7585 43365 35 0 0 0 -1 12371 53086439000 20 +9994 16 307411 290635 35 0 0 0 550 11794 53086424944 10 +17365 99 28335 32396 23 0 1 0 -1 44049 53086266890 10 +15067 225 1209384 16575 162 0 0 0 307 9127 53086468766 9 +20723 272 1209385 79008 31 0 1 0 -1 8266 53086015674 7 +32775 115 1209386 143408 28 0 0 0 -1 44050 53085300815 21 +42384 -1 1209387 5668 -1 1 1 0 -1 44051 53055849125 3 +4533 138 60281 2542 136 0 0 0 -1 17066 53086090800 24 +19065 15 31236 1956 68 0 0 0 -1 12938 53085858393 10 +19499 101 199901 73569 133 0 0 0 -1 23877 53084771534 9 +30729 137 1209388 3889 12 0 0 1 -1 14808 53085471904 9 +31837 108 750117 8782 17 0 0 0 12802 15492 53085208553 10 +12125 84 23090 60697 31 0 1 0 1270 2612 53085415597 11 +54922 83 968506 28232 73 0 0 0 -1 44042 53086368206 11 +6635 96 215812 49835 137 0 0 0 1033 567 53085778100 7 +49255 143 1209389 8130 159 0 0 0 -1 21682 53086298887 9 +1218 83 1209390 40809 39 0 1 0 -1 44052 53086303117 9 +1775 28 301403 44233 176 0 1 0 -1 30899 53086010336 10 +36105 315 1209391 456268 2 0 1 0 298 38662 53085493004 9 +647 -1 212199 286 32 2 0 0 -1 5444 53086350863 10 +19106 -1 1209392 75256 64 1 0 0 -1 6116 53086205060 9 +1978 21 287768 50266 8 0 0 0 -1 32762 53086446588 11 +13574 -1 1209393 167773 33 2 1 1 -1 11752 53086427692 9 +57391 252 776590 63565 35 0 1 0 -1 43954 53086261284 10 +38830 41 922462 138593 34 0 0 0 1273 7141 53086335332 9 +30928 30 1209394 456269 9 0 0 0 -1 34737 53086362499 9 +12753 167 1209395 91389 61 0 1 0 -1 11354 53086384603 9 +42526 49 3108 1395 79 0 0 0 -1 44053 53086113483 7 +7661 57 428746 254584 27 0 0 0 1731 44054 53085248033 10 +21624 52 1209396 39066 166 0 1 0 -1 36739 53084342763 9 +57440 14 337334 88583 177 0 0 0 100 44055 53084815045 8 +1365 24 1209397 3381 113 0 0 0 -1 18304 53086356080 20 +80 77 1209398 456270 58 3 0 0 110 911 53086446912 21 +18841 97 1209399 456271 20 0 0 0 43 44056 53086439064 9 +32036 26 1209400 456272 63 3 0 0 -1 9514 53086469429 9 +32568 -1 1209401 32294 6 1 1 0 -1 21635 53084290196 10 +22844 -1 1209402 12802 19 1 1 0 -1 27448 53086452714 10 +38500 160 1209403 208618 75 3 0 0 3618 29488 53085128111 21 +31273 -1 1209404 63604 29 1 0 0 307 9157 53083482331 10 +2019 106 247632 2892 123 0 1 0 -1 37121 53086367808 7 +10864 299 291769 80265 36 0 1 0 -1 6388 53085389657 10 +42720 256 1096011 7390 22 0 0 0 -1 1449 53084879625 5 +21369 13 652088 122701 140 0 1 0 -1 19027 53086365579 14 +24798 5 1209405 409220 178 0 1 0 -1 25775 53086334056 11 +49011 8 1209406 33843 116 0 1 0 -1 20926 53086369811 11 +20705 45 47309 4986 41 0 0 0 -1 17161 53086282125 4 +1312 6 629875 15298 42 0 0 0 -1 3962 53085909148 9 +31592 89 1209407 23327 6 0 0 0 -1 152 53086431091 9 +53006 113 196989 456273 42 0 0 0 25 34626 53086263205 6 +45282 199 1040419 201862 70 0 0 0 -1 7409 53086088571 9 +44935 138 456399 62422 41 0 1 0 -1 5988 53086343663 2 +31634 140 1209408 42712 9 0 1 0 5735 36610 53086116637 9 +5485 83 74911 14829 15 0 0 0 -1 7969 53085559541 9 +2517 -1 1209409 28180 0 1 0 0 -1 17998 53086006038 10 +45018 -1 237328 5756 179 1 0 0 -1 6337 53085468650 3 +39485 134 1209410 456274 44 0 1 0 46817 7480 53084601824 41 +3697 30 294287 1487 -1 0 0 0 -1 8636 53086432193 9 +2011 17 1209411 28763 167 0 0 0 43 34361 53084297498 7 +14785 239 452650 44581 180 0 0 0 -1 13549 53086330662 8 +38548 47 1209412 447440 118 0 0 0 -1 528 53086452581 10 +5593 73 1209413 19724 27 0 1 0 571 20240 53086416840 9 +13446 -1 1209414 58415 80 1 1 0 -1 31183 53085342556 10 +56696 57 1209415 10627 69 4 0 0 -1 34746 53085664327 9 +19390 61 188773 218620 47 0 0 0 62 8903 53086459299 10 +1434 -1 1062588 3181 27 1 0 0 -1 6174 53080722213 9 +594 -1 1209416 8512 181 1 0 0 -1 30577 53083667505 10 +16603 35 337256 5200 182 0 0 0 -1 7967 53086382006 21 +1010 -1 1209417 123893 183 1 0 0 -1 31262 53086076148 10 +2438 29 77902 10156 33 0 1 0 3077 6838 53086440674 4 +18577 47 1209418 193190 80 0 0 0 -1 44057 53086139279 10 +50128 340 108412 9803 31 0 0 0 10290 24158 53084339396 10 +7742 -1 1209419 10770 64 1 1 0 -1 3405 53086106871 9 +5687 -1 1209420 1298 184 1 0 0 97 2614 53085058700 10 +1789 134 1209421 22364 85 0 1 0 -1 21516 53086461216 10 +2897 35 687693 123242 44 0 0 0 -1 17504 53084558951 10 +47670 -1 1209422 423756 66 2 0 0 16712 16522 53086436532 9 +51384 78 1209423 315742 52 0 1 0 -1 27371 53085527503 10 +31549 258 1209424 62106 137 0 0 0 -1 9790 53086460133 9 +31419 -1 1209425 633 44 1 0 0 422 20312 53085475408 13 +8492 -1 525550 247228 39 1 0 0 -1 498 53085506870 9 +57441 -1 1209426 9443 1 1 0 0 -1 44058 53083399810 10 +20852 -1 1209427 36389 125 1 0 0 -1 1097 53085425555 10 +3207 19 1209428 11987 137 0 0 0 59 30580 53086439316 10 +14829 253 188983 56353 33 0 1 0 -1 9791 53086345485 4 +31097 144 16615 11947 133 0 0 0 -1 34702 53086291770 10 +1514 -1 1209429 27816 -1 1 0 0 -1 12960 53081783582 10 +6756 16 182372 146825 54 0 0 0 3146 41922 53086263069 10 +34245 114 8637 8679 15 0 0 0 2121 5325 53086436720 10 +57442 129 840935 133609 85 0 1 0 9680 44059 53085682272 5 +20781 271 626395 16190 144 0 1 0 1348 7821 53085210580 10 +57443 -1 1209430 10433 185 1 1 0 216 44060 53082870030 10 +16703 167 71277 6969 3 0 1 0 2438 5518 53085304024 8 +22709 24 1209431 155935 85 0 0 0 -1 2237 53086425906 10 +32562 156 1209432 23293 186 0 0 0 1866 25093 53086423410 42 +35065 115 1209433 377867 187 0 1 0 -1 31413 53085859250 10 +30691 221 1209434 88230 -1 0 0 0 -1 228 53084110855 10 +34689 100 649949 273510 86 0 0 0 202 41375 53085843068 10 +30906 100 773087 3242 52 0 0 0 36 31605 53086437860 7 +24714 28 1209435 402771 188 0 1 0 930 44061 53085636881 10 +14763 -1 1209436 38473 85 1 0 0 280 7445 53085228070 9 +28664 19 187548 7514 32 0 1 0 20 41854 53086416011 19 +36484 99 309958 55783 189 0 0 0 -1 43600 53085921061 20 +47871 134 866390 339673 38 0 0 0 -1 17199 53085872715 9 +11154 30 1209437 214626 160 0 1 0 -1 9994 53086434859 10 +10943 -1 1209438 332820 74 1 0 0 1144 38783 53085594880 10 +10087 -1 1209439 75256 64 1 1 0 -1 38827 53086461012 10 +18177 14 401881 13098 41 0 0 0 -1 18097 53085926453 10 +18252 66 439357 90951 34 0 0 0 -1 6325 53085946084 2 +27297 340 1209440 15169 52 0 1 0 20485 43945 53086027949 9 +902 6 424370 130673 4 0 0 0 -1 4625 53085503854 9 +21138 -1 235217 1480 96 1 0 0 -1 15720 53082814398 10 +31852 33 44819 13176 168 0 0 0 2561 29629 53086351530 10 +48446 72 1619 8904 64 0 0 0 -1 19089 53086270835 41 +47243 292 243388 28109 43 0 0 0 -1 15024 53086084799 5 +3511 25 1103526 33440 25 0 0 0 -1 8703 53085343041 7 +6315 91 954795 3393 10 0 1 0 -1 1514 53084876399 10 +39763 293 1209441 24580 78 0 1 0 -1 26367 53085308249 9 +9927 -1 1209442 48742 140 1 0 0 -1 668 53086036765 9 +5023 180 1209443 232757 12 0 0 0 78 2067 53085777135 9 +33724 32 1209444 6619 102 0 0 0 522 30840 53086412661 9 +31859 109 485176 225954 44 0 0 0 1635 38443 53085432204 4 +37521 81 39191 26108 85 0 1 0 -1 254 53086390926 37 +3443 249 1209445 56970 61 0 0 0 -1 9803 53085992324 8 +57444 82 1042496 93588 190 0 1 0 989 30412 53086352968 21 +25389 174 11892 20841 9 0 1 0 -1 12738 53086391363 5 +38816 18 503663 14377 39 0 1 0 -1 44062 53086181800 9 +45662 -1 1209446 118701 4 1 0 0 -1 8970 53086236937 9 +40328 240 1209447 55477 191 0 0 0 708 44063 53084902849 9 +32141 180 1209448 217537 29 0 0 0 -1 7493 53085578570 8 +32293 224 1209449 330513 168 0 0 0 36 16345 53085147928 7 +26690 252 663615 23861 91 0 0 0 -1 7886 53086453209 9 +35705 224 121306 270 28 0 1 0 613 35289 53085818693 9 +25402 91 1297 4895 143 0 1 0 -1 41791 53086385592 9 +8366 273 1209428 11987 137 0 0 0 59 2116 53086439316 10 +848 293 1209450 29792 0 0 1 0 -1 19074 53085510705 3 +31901 -1 1209451 189420 170 2 0 0 3560 694 53086424349 9 +57445 186 86854 9031 192 0 1 0 -1 44064 53085404711 9 +17246 195 209849 8208 20 0 1 0 7593 8547 53086428489 9 +31329 54 1209245 1237 10 0 0 0 -1 2383 53086425618 15 +21061 -1 1209452 13059 64 1 0 0 -1 44065 53086346530 9 +28823 287 1170812 630 73 0 0 0 75 41134 53086433672 10 +57446 129 1209453 162736 3 0 1 0 -1 44066 53083935326 10 +53998 -1 1209454 80306 8 1 0 0 67920 33893 53083136790 20 +3293 44 384005 990 11 0 0 0 -1 44067 53086449280 10 +19804 5 376823 6185 89 0 0 0 13790 6658 53086461597 5 +3049 147 197124 16588 146 0 0 0 3991 15610 53086353913 10 +1330 123 1209455 114341 27 0 1 1 36077 1564 53085582947 21 +12440 94 1209456 102761 111 0 1 0 6156 3191 53086417924 10 +31812 117 777418 53925 193 0 0 0 3890 12831 53086433620 10 +12017 -1 1209457 21364 194 1 0 0 -1 44068 53086364961 20 +13068 151 155888 155421 23 0 1 0 43 3325 53085765249 7 +19734 -1 1209458 19691 -1 1 1 0 -1 13188 53074671152 20 +47740 31 1136191 190289 34 0 0 0 -1 16757 53085478636 10 +7036 -1 1209459 217936 -1 1 0 0 -1 10474 53080052286 21 +53786 8 1209460 124495 23 0 0 0 -1 44069 53085095927 10 +20326 81 65747 6627 195 0 0 0 -1 44070 53085970478 21 +17311 102 1110195 52656 64 0 1 0 -1 17020 53086456128 10 +2623 -1 1209461 134931 196 1 0 0 -1 620 53085381994 9 +31733 151 1209462 224995 -1 0 0 0 -1 2366 53086356595 10 +34040 33 7294 9260 35 0 1 0 -1 38168 53085060103 10 +4814 95 1209463 143822 9 0 1 0 4325 1303 53086203312 21 +825 -1 1209464 67677 87 1 0 0 7097 30416 53086272102 21 +24173 119 1209465 91555 80 0 0 0 -1 44071 53086454386 21 +54463 67 22348 63412 88 0 0 0 -1 44072 53086173646 7 +37944 90 1209466 37070 24 0 1 0 1318 15692 53086424568 20 +3893 115 1209467 14748 44 0 1 0 -1 6918 53086370458 10 +39165 156 1209468 6160 67 0 0 0 -1 44073 53085306480 10 +16384 171 309831 38638 137 0 0 0 8728 3893 53085221847 9 +10194 233 402256 70750 85 0 0 0 -1 9603 53084990495 8 +24385 -1 1209469 415992 8 1 0 0 -1 29287 53086409465 10 +32141 180 1209470 456275 112 0 0 0 25 7493 53086420014 10 +46654 73 79505 6443 39 0 0 0 416 12870 53086447179 11 +48872 -1 1209471 143 74 1 0 0 -1 20498 53086190882 20 +3851 54 1209472 54584 197 0 0 0 222 34862 53086449220 10 +16642 30 1209473 21168 3 0 0 0 1692 33912 53084085100 10 +57447 217 868717 213177 88 0 1 0 16814 33754 53086253173 10 +37650 51 288580 3310 177 0 0 0 -1 18942 53086433092 9 +670 -1 571891 16897 7 1 1 0 -1 44074 53086451941 9 +16698 -1 1209474 456276 83 1 0 1 1590 39965 53084815349 9 +8255 89 1209475 51415 22 0 1 0 -1 5807 53085049022 10 +72 51 1196155 13315 29 0 1 0 3565 1087 53086433711 4 +48647 159 137161 59611 114 0 1 0 11588 19767 53084540124 10 +57448 66 1209476 224774 35 0 0 0 317 34873 53086433953 10 +22835 106 686629 67037 64 0 0 0 -1 30409 53085752685 10 +2327 8 53968 5312 35 0 1 0 -1 32615 53085730895 9 +5045 100 340148 4866 108 0 1 0 273 7220 53086335739 10 +18658 45 215302 900 0 0 0 0 -1 19487 53085418824 10 +24993 109 1209477 116919 5 0 1 0 12 13470 53085684437 21 +57449 214 8317 7935 79 0 0 0 -1 44075 53085912160 9 +6055 217 68275 33192 103 0 0 0 -1 38530 53086282873 21 +57450 48 157990 546 135 0 0 0 -1 44076 53085865033 10 +57451 129 176945 27406 28 0 0 0 -1 44077 53085395234 10 +8541 12 1209478 31095 42 0 1 0 -1 12080 53086436156 10 +3406 -1 1209479 46849 68 2 0 0 -1 19356 53086375995 2 +5798 129 493064 41821 94 0 0 0 595 33618 53086212382 19 +21624 52 94301 11708 22 0 1 0 5291 36739 53085832387 10 +2083 173 1209480 40611 122 0 0 0 -1 31475 53085078625 10 +57417 99 143241 13263 118 0 0 0 -1 43998 53086091383 9 +7918 207 12620 31965 42 0 1 0 -1 37035 53085818765 7 +10235 269 1209481 78850 96 0 1 0 -1 6199 53086431251 7 +57452 297 1209482 2738 112 0 0 0 -1 44078 53084402300 10 +12986 266 114237 6756 20 0 0 0 404 3438 53086373539 9 +48307 115 1209483 456277 162 0 0 0 -1 18643 53084914127 4 +11130 12 2633 42363 102 0 0 0 -1 6636 53086421291 9 +12940 268 1137846 69512 28 0 0 0 -1 7066 53086347355 8 +57227 129 541042 24282 198 0 1 0 -1 44079 53084948734 10 +3588 259 161900 52048 73 0 1 0 -1 2449 53086445895 9 +57453 5 1209484 60297 -1 0 0 0 -1 31390 53086372063 10 +32933 20 1209485 56832 137 0 0 0 22 2838 53086456303 9 +2125 24 1209486 41659 52 0 0 0 -1 8226 53086452225 9 +1615 99 1534 12106 69 0 1 0 2261 21629 53085829649 14 +33863 68 1209487 1283 0 0 1 0 -1 28277 53085988775 9 +5933 134 2771 27411 64 0 1 0 -1 850 53086434217 9 +9379 113 12803 13736 182 0 0 0 -1 15031 53086335760 10 +29831 -1 1209488 231377 -1 1 0 0 -1 16942 53078504296 9 +49183 150 23929 36830 41 0 0 0 273 21457 53085651152 21 +49211 7 1209489 33166 199 0 1 0 -1 21543 53086381916 7 +48289 -1 1209490 8925 128 1 0 0 8509 18585 53086178859 9 +907 45 643932 33139 9 0 0 0 -1 32141 53086420908 42 +32183 232 81546 19108 73 0 0 0 206 2648 53086376751 7 +31997 80 1209491 3709 49 0 0 0 -1 11096 53085741857 10 +1396 -1 1209492 3962 -1 1 0 0 -1 44080 53081166934 10 +31956 70 584468 51539 106 0 1 0 33213 1824 53085312711 10 +5732 -1 1209493 456278 200 1 0 0 -1 5100 53086341408 9 +10496 22 1209494 290120 113 0 1 0 -1 26483 53086357296 9 +40411 -1 60281 2542 136 1 0 0 -1 22135 53086090800 24 +2945 -1 1209495 65069 7 1 1 0 -1 4727 53086394412 14 +57454 123 496 28162 201 0 0 0 -1 44081 53086458298 9 +5296 89 1209496 22908 178 0 0 0 -1 2538 53084054634 9 +2434 97 837808 20224 177 0 0 0 404 1219 53086439675 10 +14333 120 15924 2813 112 0 1 0 -1 1997 53086136768 9 +2062 41 87999 313825 39 0 1 0 120 10512 53085654064 21 +50351 70 1209497 456279 202 0 1 0 -1 24714 53086350722 4 +24444 193 295472 106181 17 0 1 0 1079 34768 53086420165 10 +36295 138 1209498 456280 68 0 0 0 -1 24340 53086466707 14 +17721 237 1209499 228348 128 0 1 0 512 9703 53086390167 7 +1993 300 883237 71621 9 0 1 0 -1 13315 53084710933 20 +19790 233 1209500 73465 80 0 1 0 2083 44082 53085223375 10 +33754 166 81719 16497 64 0 0 0 -1 6812 53086434268 9 +37469 15 1209501 126902 69 0 0 0 238 44083 53085212628 10 +35535 81 1209502 456281 176 0 0 0 622 34148 53086446596 10 +26225 6 801784 168777 203 0 1 0 3454 18863 53084813379 10 +48951 293 39466 38503 83 0 1 0 12778 20749 53085121817 13 +1234 6 1209503 3547 22 0 1 1 468 7242 53086415297 10 +41026 -1 1209504 54978 204 1 0 0 64952 31155 53086354237 10 +17717 73 4474 29502 4 0 1 0 -1 7246 53085654373 39 +35604 57 151486 21718 45 0 1 0 -1 13567 53085652609 10 +7520 6 1209505 178973 103 0 0 0 282 33342 53086446872 10 +26835 185 14168 5813 4 0 1 0 -1 21933 53086423678 6 +53167 40 1209506 216910 2 0 1 0 -1 44039 53086366390 10 +2007 99 1209507 3659 96 0 0 0 -1 1483 53084349613 9 +17248 18 1209508 134823 113 0 0 0 60 35733 53086004346 10 +37930 -1 481970 7322 205 1 1 0 -1 14591 53086027942 5 +40568 24 596107 50797 79 0 0 0 -1 1588 53085672269 4 +8473 91 1209509 369882 32 0 0 0 110 5712 53086423972 7 +21459 215 1209510 456282 148 0 0 0 -1 42798 53086433277 10 +47048 -1 836027 77188 36 2 0 0 -1 14338 53086367225 10 +9207 205 456342 5312 35 0 0 0 -1 34601 53085557991 14 +37493 73 728135 34975 206 0 0 0 -1 43910 53084952618 4 +25649 46 177465 21451 207 0 0 0 -1 44084 53084631048 10 +40431 106 506714 116229 26 0 0 0 -1 28047 53084291960 10 +19497 178 1209511 29149 7 0 0 0 -1 10747 53086406595 7 +20096 219 1209512 456283 1 0 1 0 -1 747 53086398804 17 +21536 53 243616 4999 44 0 0 0 -1 7636 53084992630 10 +47839 45 1209513 97530 185 0 0 0 -1 17086 53085426055 10 +37126 76 211795 1902 71 0 1 0 1673 35827 53086393342 15 +38387 16 13771 3722 -1 0 1 0 -1 44085 53086025265 10 +57455 213 1209514 59854 32 0 0 0 3552 44086 53083904501 10 +2258 134 41946 1959 185 0 1 0 -1 6251 53086372491 23 +4380 92 1209515 195758 7 0 0 0 17265 3747 53086458955 10 +31401 -1 1209516 360569 -1 1 0 0 -1 10788 53081240669 10 +14388 75 1209517 456284 208 0 1 0 5283 2654 53086426412 6 +14195 31 1209518 47833 38 0 0 0 -1 18047 53086321557 9 +39374 46 1209519 317236 13 0 0 0 39193 8420 53086442309 9 +57456 325 183510 38435 20 0 1 0 448 39325 53086161593 21 +4878 242 1209520 142899 209 0 1 0 284 3038 53085848106 11 +20718 -1 253047 2948 33 1 1 0 -1 35314 53086336772 9 +269 284 105722 55981 137 0 1 0 -1 20132 53086433862 9 +40647 -1 286224 20211 1 1 0 0 -1 15006 53086057297 10 +16703 167 440111 56953 113 0 0 0 86 5518 53084733346 9 +56252 10 3613 477 182 0 1 0 -1 44087 53084989041 29 +35730 -1 380507 10881 210 1 0 0 3059 36559 53085761473 9 +57457 -1 1209521 53819 23 1 0 0 992 44088 53086237728 9 +3260 98 1209522 456285 186 0 0 0 199 6742 53084565302 4 +10955 99 9096 6801 196 0 1 0 -1 13237 53086430899 4 +35977 138 1209523 35842 94 0 1 0 13827 7329 53084184521 20 +53565 106 505990 242481 22 0 1 0 -1 36415 53086377316 10 +11634 6 9635 297 -1 0 0 0 -1 8900 53086336481 18 +3271 -1 492108 55954 1 1 0 0 2464 44089 53086209695 9 +1899 -1 1209524 165251 42 1 0 0 -1 33031 53086095468 19 +3697 30 879375 2305 85 0 0 0 4100 8636 53084623036 10 +32231 47 1209525 3041 70 0 1 0 4434 44090 53086436467 28 +57458 92 61284 11727 54 0 0 0 -1 44091 53085327820 10 +5490 -1 1209526 456286 144 1 0 0 66 1812 53086195262 37 +9784 248 618732 20681 64 0 1 0 -1 16339 53086441760 10 +11972 177 164776 2142 35 0 1 0 1578 1332 53086106977 8 +21303 116 34201 1781 69 0 1 0 110 31201 53085347805 10 +2215 47 1209527 456287 10 0 0 0 -1 11892 53086300491 9 +35119 51 1209528 25986 31 0 0 0 1115 15831 53086178005 9 +34622 6 561679 13733 96 0 1 0 -1 44092 53083874535 17 +1005 78 24974 3067 31 0 0 0 4181 3522 53085384335 9 +57459 159 1209529 307874 -1 0 1 0 -1 44093 53084113299 9 +7316 235 423720 53076 108 0 1 0 -1 17139 53085605673 7 +4725 81 541303 146860 169 0 0 0 -1 7003 53085561933 16 +15555 -1 1209530 342817 10 1 0 0 -1 10092 53084736864 9 +47018 136 13367 19736 115 0 0 0 -1 14204 53086350428 10 +6083 140 17375 66652 3 0 1 0 344 44094 53085226873 8 +566 120 77557 71429 69 0 1 0 27697 44095 53084429607 13 +31106 59 954053 83106 39 0 0 0 -1 44096 53085930569 19 +7359 -1 1209531 52228 33 1 0 0 3190 44097 53085811152 9 +57460 91 36211 54195 135 0 1 1 1059 44098 53085060377 9 +26948 360 1209532 80933 4 0 0 0 63 11424 53086463275 21 +31412 -1 1209533 135891 128 1 0 0 -1 44099 53081206772 34 +6922 114 1209534 42790 211 0 0 0 108 44100 53083998180 12 +30812 206 716993 11378 47 0 1 0 -1 27523 53085864410 7 +31805 53 1209118 214956 7 0 0 0 -1 32405 53085854063 8 +26079 -1 1209535 456288 166 1 0 0 57 33156 53085079063 7 +30954 8 1209536 136410 24 0 1 0 -1 3465 53085242882 10 +14626 6 1209537 24246 4 3 0 0 -1 8298 53086257128 9 +11344 33 514110 14712 73 0 0 0 -1 10750 53084010396 9 +57461 109 175654 1166 212 0 0 0 -1 44101 53084547155 9 +4857 -1 1209538 6802 15 1 1 0 -1 1787 53085759761 2 +13145 -1 254842 85854 14 2 0 1 -1 4557 53086381621 10 +21988 66 411119 31019 160 0 0 0 4656 42031 53086242708 9 +1638 114 8387 9130 13 0 1 0 4305 32122 53086273887 21 +30726 -1 66757 7 47 1 0 0 -1 10040 53085129236 4 +57462 237 381442 41035 33 0 1 0 2189 42342 53086107703 10 +57463 103 102156 24317 103 0 0 0 -1 32275 53086003864 19 +54857 5 459904 221726 162 0 1 0 -1 44102 53086199649 10 +17391 111 1209539 456289 29 0 0 0 -1 36369 53086458792 5 +5856 140 1209540 21540 -1 0 0 0 -1 6453 53086333125 9 +57464 49 606517 777 6 0 0 0 -1 36805 53086436535 10 +57465 144 1209541 108241 29 0 0 0 -1 44103 53085851009 21 +57466 151 317108 50444 106 0 0 0 249 35893 53085837944 9 +3512 28 128269 7675 67 0 1 0 3206 32813 53086277061 10 +26091 66 1209542 43174 58 0 0 0 25 44104 53086074156 21 +7753 56 218665 19176 35 0 0 0 246 11343 53085840647 9 +8422 -1 1209543 45036 48 1 0 0 21821 6464 53083177545 10 +16610 18 1209544 97183 32 0 0 0 2746 37009 53086428577 10 +31457 -1 245685 103060 1 1 0 0 222 2765 53086048218 6 +2382 25 1209545 131739 -1 0 0 0 -1 44105 53086340925 21 +2678 70 1017950 36962 3 0 0 0 -1 2594 53086028403 14 +11139 70 16644 10730 4 0 1 0 -1 2279 53086192234 10 +20781 271 1058 5667 34 0 0 0 -1 7821 53085862851 28 +18611 36 275522 25017 33 0 0 0 -1 12623 53086203232 9 +14219 282 1209546 135181 12 0 1 0 -1 44106 53084830452 21 +43186 14 618737 13701 9 0 1 0 1335 436 53086182742 10 +22734 107 446922 54376 213 0 1 0 2463 2826 53085988318 10 +32720 14 505446 19356 35 0 1 0 799 44107 53085645344 42 +46127 -1 1209547 193057 4 1 0 0 68 10861 53086369705 9 +46619 176 1209548 195162 165 0 0 0 -1 12743 53084907302 10 +46628 27 87151 77505 46 0 0 0 -1 12781 53085158225 25 +50808 179 1209549 78032 78 0 1 0 67 25916 53085821995 10 +22835 106 187885 4661 61 0 0 0 -1 30409 53086367716 7 +1325 102 675398 6577 6 0 0 0 -1 4276 53086427432 25 +57467 -1 1209550 287239 76 1 1 0 -1 39647 53085905151 10 +1104 129 1209551 456290 4 0 1 0 -1 2513 53086380887 10 +20354 18 1209552 87962 32 0 0 0 -1 40679 53086446094 10 +31462 217 31172 16381 2 0 0 0 -1 44108 53085414582 10 +6817 -1 1209553 57196 214 1 0 0 6714 31851 53086281659 10 +6157 40 7403 78817 4 0 1 0 -1 22319 53086023808 40 +57468 99 8153 20030 4 0 0 0 -1 44109 53084541086 6 +30691 114 1209554 456291 17 0 0 0 33 228 53084207810 10 +20216 199 15366 12387 58 0 1 0 -1 38647 53085675276 7 +31092 30 1209555 456292 49 0 0 0 -1 43 53085999249 21 +2598 45 130496 26363 100 0 0 0 -1 12083 53086276418 2 +42962 -1 1209556 110525 -1 1 1 0 -1 34916 53065383090 10 +1583 140 1004716 85031 29 0 1 0 58 1758 53086439509 20 +11008 -1 1209557 4061 69 1 1 0 13844 15086 53083322931 10 +42290 199 1209558 5574 33 0 1 0 -1 3701 53084128388 10 +8012 14 127996 40830 32 0 0 0 789 11365 53085138946 16 +37134 66 1209559 262547 135 0 1 0 -1 21508 53086281633 10 +53945 38 1209560 114206 73 0 1 0 -1 44110 53083969850 12 +36068 73 9193 29781 89 0 0 0 2510 10762 53086292921 9 +19035 44 1209561 456293 94 0 1 0 -1 23839 53086114079 6 +30994 121 1209562 10965 11 0 0 0 3609 30952 53086372574 10 +57469 15 625994 11544 54 0 1 0 9793 44111 53086264675 9 +30811 56 1209563 456294 33 0 1 0 16591 6665 53086442666 10 +23081 125 312480 229544 7 0 0 0 651 31018 53085507249 9 +2340 19 1209564 14784 19 0 1 0 62 26869 53083940650 10 +32945 109 1209565 32496 215 0 0 0 780 33235 53085911191 10 +57470 138 98052 358 90 0 1 0 -1 31954 53085667166 5 +57471 113 1209566 456295 216 0 0 0 -1 44112 53083975964 9 +33105 144 1209567 315118 44 0 0 0 -1 36735 53086433489 10 +717 88 101803 76371 81 0 0 0 8939 1384 53086454343 6 +2172 10 96487 21039 47 0 1 0 -1 2701 53086344587 9 +2764 -1 1209568 66176 106 1 1 0 -1 149 53085830401 10 +374 99 1209569 67623 159 0 0 0 -1 28043 53084212815 5 +32444 82 1209570 55453 151 0 0 0 -1 32160 53086458804 4 +54312 6 1047735 7395 125 0 0 0 -1 30435 53086444230 10 +6140 217 1209571 2453 108 0 1 0 857 6243 53085911015 10 +14393 32 892726 3209 68 0 1 0 -1 8592 53086112512 9 +33257 16 1209572 23194 217 0 0 0 412 11055 53085659067 7 +51532 -1 23914 44588 33 1 0 0 -1 27743 53084631308 11 +4857 134 61949 232 64 0 0 0 -1 1787 53086458250 7 +16066 -1 1209573 70086 77 1 0 0 -1 37781 53085926437 3 +5507 -1 1209574 61849 -1 1 1 0 -1 10679 53081512342 6 +31950 -1 119340 5813 4 1 0 0 -1 31807 53085568351 7 +19221 66 1209575 105828 34 0 1 0 2543 3718 53086376083 36 +34227 110 658657 150414 94 0 0 0 -1 32005 53086081839 10 diff --git a/examples/run_mtl.py b/examples/run_mtl.py index 51d7936a..6a098b76 100644 --- a/examples/run_mtl.py +++ b/examples/run_mtl.py @@ -51,7 +51,7 @@ print('cuda ready...') device = 'cuda:0' - model = MMOE(dnn_feature_columns, task_types=['binary', 'binary'], + model = PLE(dnn_feature_columns, task_types=['binary', 'binary'], l2_reg_embedding=1e-5, task_names=target, device=device) model.compile("adagrad", loss="binary_crossentropy", metrics=['binary_crossentropy'], ) From ae8b626c477804a64e525719368a175385f9daae Mon Sep 17 00:00:00 2001 From: zanshuxun <631763140@qq.com> Date: Sat, 2 Jul 2022 12:31:35 +0800 Subject: [PATCH 20/47] ple --- deepctr_torch/models/multitask/ple.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/deepctr_torch/models/multitask/ple.py b/deepctr_torch/models/multitask/ple.py index f9c7fef3..d104f90d 100644 --- a/deepctr_torch/models/multitask/ple.py +++ b/deepctr_torch/models/multitask/ple.py @@ -70,25 +70,27 @@ def __init__(self, dnn_feature_columns, shared_expert_num=1, specific_expert_num # expert dnn self.specific_experts = nn.ModuleList( - [nn.ModuleList([nn.ModuleList([DNN(self.input_dim, expert_dnn_hidden_units, activation=dnn_activation, + [nn.ModuleList([nn.ModuleList([DNN(self.input_dim if level_num == 0 else expert_dnn_hidden_units[-1], + expert_dnn_hidden_units, activation=dnn_activation, l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, init_std=init_std, device=device) for _ in range(self.specific_expert_num)]) - for _ in range(self.num_tasks)]) for _ in range(self.num_levels)]) + for _ in range(self.num_tasks)]) for level_num in range(self.num_levels)]) self.shared_experts = nn.ModuleList( - [nn.ModuleList([DNN(self.input_dim, expert_dnn_hidden_units, activation=dnn_activation, + [nn.ModuleList([DNN(self.input_dim if level_num == 0 else expert_dnn_hidden_units[-1], + expert_dnn_hidden_units, activation=dnn_activation, l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, init_std=init_std, device=device) for _ in range(self.shared_expert_num)]) - for _ in range(self.num_levels)]) + for level_num in range(self.num_levels)]) # specific gate dnn specific_gate_output_dim = self.specific_expert_num + self.shared_expert_num if len(gate_dnn_hidden_units) > 0: self.specific_gate_dnn = nn.ModuleList( - [nn.ModuleList([DNN(self.input_dim, gate_dnn_hidden_units, activation=dnn_activation, + [nn.ModuleList([DNN(self.input_dim if level_num == 0 else gate_dnn_hidden_units[-1], gate_dnn_hidden_units, activation=dnn_activation, l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, init_std=init_std, device=device) for _ in range(self.num_tasks)]) - for _ in range(self.num_levels)]) + for level_num in range(self.num_levels)]) self.specific_gate_dnn_final_layer = nn.ModuleList( [nn.ModuleList([nn.Linear(gate_dnn_hidden_units[-1], specific_gate_output_dim, bias=False) for _ in range(self.num_tasks)]) for _ in range(self.num_levels)]) From 269a3052210f177de7fe5facfe177e2d42bb0e46 Mon Sep 17 00:00:00 2001 From: zanshuxun <631763140@qq.com> Date: Sat, 2 Jul 2022 12:33:42 +0800 Subject: [PATCH 21/47] mtl --- deepctr_torch/models/multitask/ple.py | 2 +- examples/run_mtl.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deepctr_torch/models/multitask/ple.py b/deepctr_torch/models/multitask/ple.py index d104f90d..2553195b 100644 --- a/deepctr_torch/models/multitask/ple.py +++ b/deepctr_torch/models/multitask/ple.py @@ -41,7 +41,7 @@ class PLE(BaseModel): """ def __init__(self, dnn_feature_columns, shared_expert_num=1, specific_expert_num=1, num_levels=2, - expert_dnn_hidden_units=(256,), gate_dnn_hidden_units=(64,), tower_dnn_hidden_units=(64,), + expert_dnn_hidden_units=(256, 128), gate_dnn_hidden_units=(64,), tower_dnn_hidden_units=(64,), l2_reg_linear=0.00001, l2_reg_embedding=0.00001, l2_reg_dnn=0, init_std=0.0001, seed=1024, dnn_dropout=0, dnn_activation='relu', dnn_use_bn=False, task_types=('binary', 'binary'), task_names=('ctr', 'ctcvr'), device='cpu', gpus=None): diff --git a/examples/run_mtl.py b/examples/run_mtl.py index 6a098b76..022120ec 100644 --- a/examples/run_mtl.py +++ b/examples/run_mtl.py @@ -52,7 +52,7 @@ device = 'cuda:0' model = PLE(dnn_feature_columns, task_types=['binary', 'binary'], - l2_reg_embedding=1e-5, task_names=target, device=device) + l2_reg_embedding=1e-5, task_names=target, device=device) model.compile("adagrad", loss="binary_crossentropy", metrics=['binary_crossentropy'], ) From 0d0ec88ccc4e2d7c3ac7663c0a68f686a66c4f8b Mon Sep 17 00:00:00 2001 From: zanshuxun <631763140@qq.com> Date: Sat, 2 Jul 2022 12:47:05 +0800 Subject: [PATCH 22/47] dim --- deepctr_torch/models/multitask/ple.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/deepctr_torch/models/multitask/ple.py b/deepctr_torch/models/multitask/ple.py index 2553195b..108c11da 100644 --- a/deepctr_torch/models/multitask/ple.py +++ b/deepctr_torch/models/multitask/ple.py @@ -87,7 +87,8 @@ def __init__(self, dnn_feature_columns, shared_expert_num=1, specific_expert_num specific_gate_output_dim = self.specific_expert_num + self.shared_expert_num if len(gate_dnn_hidden_units) > 0: self.specific_gate_dnn = nn.ModuleList( - [nn.ModuleList([DNN(self.input_dim if level_num == 0 else gate_dnn_hidden_units[-1], gate_dnn_hidden_units, activation=dnn_activation, + [nn.ModuleList([DNN(self.input_dim if level_num == 0 else expert_dnn_hidden_units[-1], + gate_dnn_hidden_units, activation=dnn_activation, l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, init_std=init_std, device=device) for _ in range(self.num_tasks)]) for level_num in range(self.num_levels)]) @@ -99,8 +100,9 @@ def __init__(self, dnn_feature_columns, shared_expert_num=1, specific_expert_num l2=l2_reg_dnn) else: self.specific_gate_dnn_final_layer = nn.ModuleList( - [nn.ModuleList([nn.Linear(gate_dnn_hidden_units[-1], specific_gate_output_dim, bias=False) - for _ in range(self.num_tasks)]) for _ in range(self.num_levels)]) + [nn.ModuleList([nn.Linear(self.input_dim if level_num == 0 else expert_dnn_hidden_units[-1], + specific_gate_output_dim, bias=False) for _ in range(self.num_tasks)]) for + level_num in range(self.num_levels)]) # shared gate dnn shared_gate_output_dim = self.num_tasks * self.specific_expert_num + self.shared_expert_num @@ -117,8 +119,8 @@ def __init__(self, dnn_feature_columns, shared_expert_num=1, specific_expert_num l2=l2_reg_dnn) else: self.shared_gate_dnn_final_layer = nn.ModuleList( - [nn.Linear(gate_dnn_hidden_units[-1], shared_gate_output_dim, bias=False) - for _ in range(self.num_levels)]) + [nn.Linear(self.input_dim if level_num == 0 else expert_dnn_hidden_units[-1], shared_gate_output_dim, + bias=False) for level_num in range(self.num_levels)]) # tower dnn (task-specific) if len(tower_dnn_hidden_units) > 0: @@ -174,7 +176,8 @@ def cgc_net(self, inputs, level_num, is_last=False): for i in range(self.num_tasks): # concat task-specific expert and task-shared expert cur_experts_outputs = specific_expert_outputs[ - i * self.specific_expert_num:(i + 1) * self.specific_expert_num] + shared_expert_outputs + i * self.specific_expert_num:( + i + 1) * self.specific_expert_num] + shared_expert_outputs cur_experts_outputs = torch.stack(cur_experts_outputs, 1) # gate dnn From ee23764e56103f1f59d10ce1832e5503d037e970 Mon Sep 17 00:00:00 2001 From: zanshuxun <631763140@qq.com> Date: Sat, 2 Jul 2022 12:48:38 +0800 Subject: [PATCH 23/47] 1 --- deepctr_torch/models/multitask/ple.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/deepctr_torch/models/multitask/ple.py b/deepctr_torch/models/multitask/ple.py index 108c11da..719cd450 100644 --- a/deepctr_torch/models/multitask/ple.py +++ b/deepctr_torch/models/multitask/ple.py @@ -83,7 +83,7 @@ def __init__(self, dnn_feature_columns, shared_expert_num=1, specific_expert_num init_std=init_std, device=device) for _ in range(self.shared_expert_num)]) for level_num in range(self.num_levels)]) - # specific gate dnn + # gate dnn specific_gate_output_dim = self.specific_expert_num + self.shared_expert_num if len(gate_dnn_hidden_units) > 0: self.specific_gate_dnn = nn.ModuleList( @@ -104,7 +104,6 @@ def __init__(self, dnn_feature_columns, shared_expert_num=1, specific_expert_num specific_gate_output_dim, bias=False) for _ in range(self.num_tasks)]) for level_num in range(self.num_levels)]) - # shared gate dnn shared_gate_output_dim = self.num_tasks * self.specific_expert_num + self.shared_expert_num if len(gate_dnn_hidden_units) > 0: self.shared_gate_dnn = nn.ModuleList([DNN(self.input_dim, gate_dnn_hidden_units, activation=dnn_activation, From 14ec3736432c3912d99ad023ea0c2a271a46e301 Mon Sep 17 00:00:00 2001 From: zanshuxun <631763140@qq.com> Date: Sat, 2 Jul 2022 13:39:11 +0800 Subject: [PATCH 24/47] 1 --- deepctr_torch/models/multitask/esmm.py | 2 + deepctr_torch/models/multitask/mmoe.py | 3 +- deepctr_torch/models/multitask/ple.py | 3 +- .../models/multitask/sharedbottom.py | 2 + .../{run_mtl.py => run_multitask_learning.py} | 9 +- tests/models/multitask/ESMM_test.py | 27 ++++ tests/models/multitask/MMOE_test.py | 33 +++++ tests/models/multitask/SharedBottom_test.py | 30 +++++ tests/models/multitask/__init__.py | 0 tests/utils_mtl.py | 120 ++++++++++++++++++ 10 files changed, 223 insertions(+), 6 deletions(-) rename examples/{run_mtl.py => run_multitask_learning.py} (85%) create mode 100644 tests/models/multitask/ESMM_test.py create mode 100644 tests/models/multitask/MMOE_test.py create mode 100644 tests/models/multitask/SharedBottom_test.py create mode 100644 tests/models/multitask/__init__.py create mode 100644 tests/utils_mtl.py diff --git a/deepctr_torch/models/multitask/esmm.py b/deepctr_torch/models/multitask/esmm.py index 1628c3fd..cf3ffac2 100644 --- a/deepctr_torch/models/multitask/esmm.py +++ b/deepctr_torch/models/multitask/esmm.py @@ -45,6 +45,8 @@ def __init__(self, dnn_feature_columns, tower_dnn_hidden_units=(256, 128), self.num_tasks = len(task_names) if self.num_tasks != 2: raise ValueError("the length of task_names must be equal to 2") + if len(dnn_feature_columns) == 0: + raise ValueError("dnn_feature_columns is null!") if len(task_types) != self.num_tasks: raise ValueError("num_tasks must be equal to the length of task_types") diff --git a/deepctr_torch/models/multitask/mmoe.py b/deepctr_torch/models/multitask/mmoe.py index 18113482..d300088d 100644 --- a/deepctr_torch/models/multitask/mmoe.py +++ b/deepctr_torch/models/multitask/mmoe.py @@ -51,7 +51,8 @@ def __init__(self, dnn_feature_columns, num_experts=3, expert_dnn_hidden_units=( raise ValueError("num_tasks must be greater than 1") if num_experts <= 1: raise ValueError("num_experts must be greater than 1") - + if len(dnn_feature_columns) == 0: + raise ValueError("dnn_feature_columns is null!") if len(task_types) != self.num_tasks: raise ValueError("num_tasks must be equal to the length of task_types") diff --git a/deepctr_torch/models/multitask/ple.py b/deepctr_torch/models/multitask/ple.py index 719cd450..8fd5739e 100644 --- a/deepctr_torch/models/multitask/ple.py +++ b/deepctr_torch/models/multitask/ple.py @@ -51,7 +51,8 @@ def __init__(self, dnn_feature_columns, shared_expert_num=1, specific_expert_num self.num_tasks = len(task_names) if self.num_tasks <= 1: raise ValueError("num_tasks must be greater than 1") - + if len(dnn_feature_columns) == 0: + raise ValueError("dnn_feature_columns is null!") if len(task_types) != self.num_tasks: raise ValueError("num_tasks must be equal to the length of task_types") diff --git a/deepctr_torch/models/multitask/sharedbottom.py b/deepctr_torch/models/multitask/sharedbottom.py index 85dfd474..86065a88 100644 --- a/deepctr_torch/models/multitask/sharedbottom.py +++ b/deepctr_torch/models/multitask/sharedbottom.py @@ -46,6 +46,8 @@ def __init__(self, dnn_feature_columns, bottom_dnn_hidden_units=(256, 128), towe self.num_tasks = len(task_names) if self.num_tasks <= 1: raise ValueError("num_tasks must be greater than 1") + if len(dnn_feature_columns) == 0: + raise ValueError("dnn_feature_columns is null!") if len(task_types) != self.num_tasks: raise ValueError("num_tasks must be equal to the length of task_types") diff --git a/examples/run_mtl.py b/examples/run_multitask_learning.py similarity index 85% rename from examples/run_mtl.py rename to examples/run_multitask_learning.py index 022120ec..cc675a08 100644 --- a/examples/run_mtl.py +++ b/examples/run_multitask_learning.py @@ -51,13 +51,14 @@ print('cuda ready...') device = 'cuda:0' - model = PLE(dnn_feature_columns, task_types=['binary', 'binary'], - l2_reg_embedding=1e-5, task_names=target, device=device) + model = MMOE(dnn_feature_columns, task_types=['binary', 'binary'], + l2_reg_embedding=1e-5, task_names=target, device=device) model.compile("adagrad", loss="binary_crossentropy", metrics=['binary_crossentropy'], ) history = model.fit(train_model_input, train[target].values, batch_size=32, epochs=10, verbose=2) pred_ans = model.predict(test_model_input, 256) print("") - print("test LogLoss", round(log_loss(test[target].values, pred_ans), 4)) - print("test AUC", round(roc_auc_score(test[target].values, pred_ans), 4)) + for i, target_name in enumerate(target): + print("%s test LogLoss" % target_name, round(log_loss(test[target[i]].values, pred_ans[:, i]), 4)) + print("%s test AUC" % target_name, round(roc_auc_score(test[target[i]].values, pred_ans[:, i]), 4)) diff --git a/tests/models/multitask/ESMM_test.py b/tests/models/multitask/ESMM_test.py new file mode 100644 index 00000000..c148e5df --- /dev/null +++ b/tests/models/multitask/ESMM_test.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +import pytest + +from deepctr_torch.models import ESMM +from ...utils_mtl import get_mtl_test_data, SAMPLE_SIZE, check_mtl_model, get_device + + +@pytest.mark.parametrize( + 'num_experts, tower_dnn_hidden_units, task_types, sparse_feature_num, dense_feature_num', + [ + (3, (256, 128), ['binary', 'binary'], 3, 3) + ] +) +def test_ESMM(num_experts, tower_dnn_hidden_units, task_types, + sparse_feature_num, dense_feature_num): + model_name = "ESMM" + sample_size = SAMPLE_SIZE + x, y_list, feature_columns = get_mtl_test_data( + sample_size, sparse_feature_num=sparse_feature_num, dense_feature_num=dense_feature_num) + + model = ESMM(feature_columns, tower_dnn_hidden_units=tower_dnn_hidden_units, + task_types=task_types, device=get_device()) + check_mtl_model(model, model_name, x, y_list, task_types) + + +if __name__ == "__main__": + pass diff --git a/tests/models/multitask/MMOE_test.py b/tests/models/multitask/MMOE_test.py new file mode 100644 index 00000000..587da56a --- /dev/null +++ b/tests/models/multitask/MMOE_test.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +import pytest + +from deepctr_torch.models import MMOE +from ...utils_mtl import get_mtl_test_data, SAMPLE_SIZE, check_mtl_model, get_device + + +@pytest.mark.parametrize( + 'num_experts, expert_dnn_hidden_units, gate_dnn_hidden_units, tower_dnn_hidden_units, task_types, ' + 'sparse_feature_num, dense_feature_num', + [ + (3, (256, 128), (64,), (64,), ['binary', 'binary'], 3, 3), + (3, (256, 128), (), (64,), ['binary', 'binary'], 3, 3), + (3, (256, 128), (64,), (), ['binary', 'binary'], 3, 3), + (3, (256, 128), (), (), ['binary', 'binary'], 3, 3), + (3, (256, 128), (64,), (64,), ['binary', 'regression'], 3, 3), + ] +) +def test_MMOE(num_experts, expert_dnn_hidden_units, gate_dnn_hidden_units, tower_dnn_hidden_units, task_types, + sparse_feature_num, dense_feature_num): + model_name = "MMOE" + sample_size = SAMPLE_SIZE + x, y_list, feature_columns = get_mtl_test_data( + sample_size, sparse_feature_num=sparse_feature_num, dense_feature_num=dense_feature_num) + + model = MMOE(feature_columns, num_experts=num_experts, expert_dnn_hidden_units=expert_dnn_hidden_units, + gate_dnn_hidden_units=gate_dnn_hidden_units, tower_dnn_hidden_units=tower_dnn_hidden_units, + task_types=task_types, device=get_device()) + check_mtl_model(model, model_name, x, y_list, task_types) + + +if __name__ == "__main__": + pass diff --git a/tests/models/multitask/SharedBottom_test.py b/tests/models/multitask/SharedBottom_test.py new file mode 100644 index 00000000..75f991ba --- /dev/null +++ b/tests/models/multitask/SharedBottom_test.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +import pytest + +from deepctr_torch.models import SharedBottom +from ...utils_mtl import get_mtl_test_data, SAMPLE_SIZE, check_mtl_model, get_device + + +@pytest.mark.parametrize( + 'num_experts, bottom_dnn_hidden_units, tower_dnn_hidden_units, task_types, sparse_feature_num, dense_feature_num', + [ + (3, (256, 128), (64,), ['binary', 'binary'], 3, 3), + (3, (256, 128), (), ['binary', 'binary'], 3, 3), + (3, (256, 128), (64,), ['binary', 'regression'], 3, 3), + ] +) +def test_SharedBottom(num_experts, bottom_dnn_hidden_units, tower_dnn_hidden_units, task_types, + sparse_feature_num, dense_feature_num): + model_name = "SharedBottom" + sample_size = SAMPLE_SIZE + x, y_list, feature_columns = get_mtl_test_data( + sample_size, sparse_feature_num=sparse_feature_num, dense_feature_num=dense_feature_num) + + model = SharedBottom(feature_columns, bottom_dnn_hidden_units=bottom_dnn_hidden_units, + tower_dnn_hidden_units=tower_dnn_hidden_units, + task_types=task_types, device=get_device()) + check_mtl_model(model, model_name, x, y_list, task_types) + + +if __name__ == "__main__": + pass diff --git a/tests/models/multitask/__init__.py b/tests/models/multitask/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/utils_mtl.py b/tests/utils_mtl.py new file mode 100644 index 00000000..61020cf1 --- /dev/null +++ b/tests/utils_mtl.py @@ -0,0 +1,120 @@ +# -*- coding: utf-8 -*- +import os + +import numpy as np +import torch as torch + +from deepctr_torch.callbacks import EarlyStopping, ModelCheckpoint +from deepctr_torch.inputs import SparseFeat, DenseFeat, VarLenSparseFeat + +SAMPLE_SIZE = 64 + + +def gen_sequence(dim, max_len, sample_size): + return np.array([np.random.randint(0, dim, max_len) for _ in range(sample_size)]), np.random.randint(1, max_len + 1, + sample_size) + + +def get_mtl_test_data(sample_size=1000, embedding_size=4, sparse_feature_num=1, dense_feature_num=1, + sequence_feature=['sum', 'mean', 'max'], include_length=False, task_types=('binary', 'binary'), + hash_flag=False, prefix=''): + feature_columns = [] + model_input = {} + + if 'weight' in sequence_feature: + feature_columns.append( + VarLenSparseFeat(SparseFeat(prefix + "weighted_seq", vocabulary_size=2, embedding_dim=embedding_size), + maxlen=3, length_name=prefix + "weighted_seq" + "_seq_length", + weight_name=prefix + "weight")) + s_input, s_len_input = gen_sequence( + 2, 3, sample_size) + + model_input[prefix + "weighted_seq"] = s_input + model_input[prefix + 'weight'] = np.random.randn(sample_size, 3, 1) + model_input[prefix + "weighted_seq" + "_seq_length"] = s_len_input + sequence_feature.pop(sequence_feature.index('weight')) + + for i in range(sparse_feature_num): + dim = np.random.randint(1, 10) + feature_columns.append(SparseFeat(prefix + 'sparse_feature_' + str(i), dim, embedding_size, dtype=torch.int32)) + for i in range(dense_feature_num): + feature_columns.append(DenseFeat(prefix + 'dense_feature_' + str(i), 1, dtype=torch.float32)) + for i, mode in enumerate(sequence_feature): + dim = np.random.randint(1, 10) + maxlen = np.random.randint(1, 10) + feature_columns.append( + VarLenSparseFeat(SparseFeat(prefix + 'sequence_' + mode, vocabulary_size=dim, embedding_dim=embedding_size), + maxlen=maxlen, combiner=mode)) + + for fc in feature_columns: + if isinstance(fc, SparseFeat): + model_input[fc.name] = np.random.randint(0, fc.vocabulary_size, sample_size) + elif isinstance(fc, DenseFeat): + model_input[fc.name] = np.random.random(sample_size) + else: + s_input, s_len_input = gen_sequence( + fc.vocabulary_size, fc.maxlen, sample_size) + model_input[fc.name] = s_input + if include_length: + fc.length_name = prefix + "sequence_" + str(i) + '_seq_length' + model_input[prefix + "sequence_" + str(i) + '_seq_length'] = s_len_input + + y_list = [] # multi label + for task in task_types: + if task == 'binary': + y = np.random.randint(0, 2, sample_size) + y_list.append(y) + else: + y = np.random.random(sample_size) + y_list.append(y) + y_list = np.array(y_list).transpose() # (sample_size, num_tasks) + + return model_input, y_list, feature_columns + + +def check_mtl_model(model, model_name, x, y_list, task_types, check_model_io=True): + ''' + compile model,train and evaluate it,then save/load weight and model file. + :param model: + :param model_name: + :param x: + :param y_list: mutil label of y + :param task_types: + :param check_model_io: + :return: + ''' + loss_list = [] + for task_type in task_types: + if task_type == 'binary': + loss_list.append('binary_crossentropy') + elif task_type == 'regression': + loss_list.append('mae') + print('loss:', loss_list) + + early_stopping = EarlyStopping(monitor='val_acc', min_delta=0, verbose=1, patience=0, mode='max') + model_checkpoint = ModelCheckpoint(filepath='model.ckpt', monitor='val_acc', verbose=1, + save_best_only=True, + save_weights_only=False, mode='max', period=1) + + model.compile('adam', loss_list, metrics=['binary_crossentropy', 'acc']) + model.fit(x, y_list, batch_size=100, epochs=1, validation_split=0.5, callbacks=[early_stopping, model_checkpoint]) + + print(model_name + 'test, train valid pass!') + torch.save(model.state_dict(), model_name + '_weights.h5') + model.load_state_dict(torch.load(model_name + '_weights.h5')) + os.remove(model_name + '_weights.h5') + print(model_name + 'test save load weight pass!') + if check_model_io: + torch.save(model, model_name + '.h5') + model = torch.load(model_name + '.h5') + os.remove(model_name + '.h5') + print(model_name + 'test save load model pass!') + print(model_name + 'test pass!') + + +def get_device(use_cuda=True): + device = 'cpu' + if use_cuda and torch.cuda.is_available(): + print('cuda ready...') + device = 'cuda:0' + return device From 310c04351162eca9835857da16f690fc5b0f5143 Mon Sep 17 00:00:00 2001 From: zanshuxun <631763140@qq.com> Date: Sat, 2 Jul 2022 13:44:09 +0800 Subject: [PATCH 25/47] test --- deepctr_torch/models/multitask/ple.py | 8 +++---- examples/run_multitask_learning.py | 2 +- tests/models/multitask/PLE_test.py | 34 +++++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 5 deletions(-) create mode 100644 tests/models/multitask/PLE_test.py diff --git a/deepctr_torch/models/multitask/ple.py b/deepctr_torch/models/multitask/ple.py index 8fd5739e..ab829f3b 100644 --- a/deepctr_torch/models/multitask/ple.py +++ b/deepctr_torch/models/multitask/ple.py @@ -107,9 +107,10 @@ def __init__(self, dnn_feature_columns, shared_expert_num=1, specific_expert_num shared_gate_output_dim = self.num_tasks * self.specific_expert_num + self.shared_expert_num if len(gate_dnn_hidden_units) > 0: - self.shared_gate_dnn = nn.ModuleList([DNN(self.input_dim, gate_dnn_hidden_units, activation=dnn_activation, + self.shared_gate_dnn = nn.ModuleList([DNN(self.input_dim if level_num == 0 else expert_dnn_hidden_units[-1], + gate_dnn_hidden_units, activation=dnn_activation, l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, - init_std=init_std, device=device) for _ in + init_std=init_std, device=device) for level_num in range(self.num_levels)]) self.shared_gate_dnn_final_layer = nn.ModuleList( [nn.Linear(gate_dnn_hidden_units[-1], shared_gate_output_dim, bias=False) @@ -176,8 +177,7 @@ def cgc_net(self, inputs, level_num, is_last=False): for i in range(self.num_tasks): # concat task-specific expert and task-shared expert cur_experts_outputs = specific_expert_outputs[ - i * self.specific_expert_num:( - i + 1) * self.specific_expert_num] + shared_expert_outputs + i * self.specific_expert_num:(i + 1) * self.specific_expert_num] + shared_expert_outputs cur_experts_outputs = torch.stack(cur_experts_outputs, 1) # gate dnn diff --git a/examples/run_multitask_learning.py b/examples/run_multitask_learning.py index cc675a08..8eb69827 100644 --- a/examples/run_multitask_learning.py +++ b/examples/run_multitask_learning.py @@ -51,7 +51,7 @@ print('cuda ready...') device = 'cuda:0' - model = MMOE(dnn_feature_columns, task_types=['binary', 'binary'], + model = PLE(dnn_feature_columns, shared_expert_num=0, specific_expert_num=0, num_levels=2,task_types=['binary', 'binary'], l2_reg_embedding=1e-5, task_names=target, device=device) model.compile("adagrad", loss="binary_crossentropy", metrics=['binary_crossentropy'], ) diff --git a/tests/models/multitask/PLE_test.py b/tests/models/multitask/PLE_test.py new file mode 100644 index 00000000..24ba6b3d --- /dev/null +++ b/tests/models/multitask/PLE_test.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +import pytest + +from deepctr_torch.models import PLE +from ...utils_mtl import get_mtl_test_data, SAMPLE_SIZE, check_mtl_model, get_device + + +@pytest.mark.parametrize( + 'shared_expert_num, specific_expert_num, num_levels, expert_dnn_hidden_units, gate_dnn_hidden_units, ' + 'tower_dnn_hidden_units, task_types, sparse_feature_num ,dense_feature_num', + [ + (1, 1, 2, (256, 128), (64,), (64,), ['binary', 'binary'], 3, 3), + (3, 3, 3, (256, 128), (), (64,), ['binary', 'binary'], 3, 3), + (3, 3, 3, (256, 128), (64,), (), ['binary', 'binary'], 3, 3), + (3, 3, 3, (256, 128), (), (), ['binary', 'binary'], 3, 3), + (3, 3, 3, (256, 128), (64,), (64,), ['binary', 'regression'], 3, 3), + ] +) +def test_PLE(shared_expert_num, specific_expert_num, num_levels, expert_dnn_hidden_units, gate_dnn_hidden_units, + tower_dnn_hidden_units, task_types, sparse_feature_num, dense_feature_num): + model_name = "PLE" + sample_size = SAMPLE_SIZE + x, y_list, feature_columns = get_mtl_test_data( + sample_size, sparse_feature_num=sparse_feature_num, dense_feature_num=dense_feature_num) + + model = PLE(feature_columns, shared_expert_num=shared_expert_num, specific_expert_num=specific_expert_num, + num_levels=num_levels, expert_dnn_hidden_units=expert_dnn_hidden_units, + gate_dnn_hidden_units=gate_dnn_hidden_units, tower_dnn_hidden_units=tower_dnn_hidden_units, + task_types=task_types, device=get_device()) + check_mtl_model(model, model_name, x, y_list, task_types) + + +if __name__ == "__main__": + pass From 0f56a636f26e5ced218f67ff64cb1041453c3a5b Mon Sep 17 00:00:00 2001 From: zanshuxun <631763140@qq.com> Date: Sat, 2 Jul 2022 13:47:50 +0800 Subject: [PATCH 26/47] dien lengths .cpu() --- deepctr_torch/models/dien.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/deepctr_torch/models/dien.py b/deepctr_torch/models/dien.py index 917777f9..c31c0c9d 100644 --- a/deepctr_torch/models/dien.py +++ b/deepctr_torch/models/dien.py @@ -217,7 +217,7 @@ def forward(self, keys, keys_length, neg_keys=None): masked_keys = torch.masked_select(keys, mask.view(-1, 1, 1)).view(-1, max_length, dim) - packed_keys = pack_padded_sequence(masked_keys, lengths=masked_keys_length, batch_first=True, + packed_keys = pack_padded_sequence(masked_keys, lengths=masked_keys_length.cpu(), batch_first=True, enforce_sorted=False) packed_interests, _ = self.gru(packed_keys) interests, _ = pad_packed_sequence(packed_interests, batch_first=True, padding_value=0.0, @@ -353,7 +353,7 @@ def forward(self, query, keys, keys_length, mask=None): query = torch.masked_select(query, mask.view(-1, 1)).view(-1, dim).unsqueeze(1) if self.gru_type == 'GRU': - packed_keys = pack_padded_sequence(keys, lengths=keys_length, batch_first=True, enforce_sorted=False) + packed_keys = pack_padded_sequence(keys, lengths=keys_length.cpu(), batch_first=True, enforce_sorted=False) packed_interests, _ = self.interest_evolution(packed_keys) interests, _ = pad_packed_sequence(packed_interests, batch_first=True, padding_value=0.0, total_length=max_length) @@ -362,15 +362,15 @@ def forward(self, query, keys, keys_length, mask=None): elif self.gru_type == 'AIGRU': att_scores = self.attention(query, keys, keys_length.unsqueeze(1)) # [b, 1, T] interests = keys * att_scores.transpose(1, 2) # [b, T, H] - packed_interests = pack_padded_sequence(interests, lengths=keys_length, batch_first=True, + packed_interests = pack_padded_sequence(interests, lengths=keys_length.cpu(), batch_first=True, enforce_sorted=False) _, outputs = self.interest_evolution(packed_interests) outputs = outputs.squeeze(0) # [b, H] elif self.gru_type == 'AGRU' or self.gru_type == 'AUGRU': att_scores = self.attention(query, keys, keys_length.unsqueeze(1)).squeeze(1) # [b, T] - packed_interests = pack_padded_sequence(keys, lengths=keys_length, batch_first=True, + packed_interests = pack_padded_sequence(keys, lengths=keys_length.cpu(), batch_first=True, enforce_sorted=False) - packed_scores = pack_padded_sequence(att_scores, lengths=keys_length, batch_first=True, + packed_scores = pack_padded_sequence(att_scores, lengths=keys_length.cpu(), batch_first=True, enforce_sorted=False) outputs = self.interest_evolution(packed_interests, packed_scores) outputs, _ = pad_packed_sequence(outputs, batch_first=True, padding_value=0.0, total_length=max_length) From 5660a4b54bbc3582b6826e4231334d2c50b0dd1f Mon Sep 17 00:00:00 2001 From: zanshuxun <631763140@qq.com> Date: Sat, 2 Jul 2022 14:38:30 +0800 Subject: [PATCH 27/47] docs --- README.md | 12 +++-- docs/pics/multitaskmodels/ESMM.png | Bin 0 -> 188744 bytes docs/pics/multitaskmodels/MMOE.png | Bin 0 -> 96849 bytes docs/pics/multitaskmodels/PLE.png | Bin 0 -> 195075 bytes docs/pics/multitaskmodels/SharedBottom.png | Bin 0 -> 32482 bytes docs/source/Features.md | 49 ++++++++++++++++++ .../deepctr_torch.models.multitask.esmm.rst | 7 +++ .../deepctr_torch.models.multitask.mmoe.rst | 7 +++ .../deepctr_torch.models.multitask.ple.rst | 7 +++ ...tr_torch.models.multitask.sharedbottom.rst | 7 +++ 10 files changed, 85 insertions(+), 4 deletions(-) create mode 100644 docs/pics/multitaskmodels/ESMM.png create mode 100644 docs/pics/multitaskmodels/MMOE.png create mode 100644 docs/pics/multitaskmodels/PLE.png create mode 100644 docs/pics/multitaskmodels/SharedBottom.png create mode 100644 docs/source/deepctr_torch.models.multitask.esmm.rst create mode 100644 docs/source/deepctr_torch.models.multitask.mmoe.rst create mode 100644 docs/source/deepctr_torch.models.multitask.ple.rst create mode 100644 docs/source/deepctr_torch.models.multitask.sharedbottom.rst diff --git a/README.md b/README.md index 6d02554e..f151e158 100644 --- a/README.md +++ b/README.md @@ -38,10 +38,14 @@ Let's [**Get Started!**](https://deepctr-torch.readthedocs.io/en/latest/Quick-St | AutoInt | [CIKM 2019][AutoInt: Automatic Feature Interaction Learning via Self-Attentive Neural Networks](https://arxiv.org/abs/1810.11921) | | ONN | [arxiv 2019][Operation-aware Neural Networks for User Response Prediction](https://arxiv.org/pdf/1904.12579.pdf) | | FiBiNET | [RecSys 2019][FiBiNET: Combining Feature Importance and Bilinear feature Interaction for Click-Through Rate Prediction](https://arxiv.org/pdf/1905.09433.pdf) | -| IFM | [IJCAI 2019][An Input-aware Factorization Machine for Sparse Prediction](https://www.ijcai.org/Proceedings/2019/0203.pdf) | -| DCN V2 | [arxiv 2020][DCN V2: Improved Deep & Cross Network and Practical Lessons for Web-scale Learning to Rank Systems](https://arxiv.org/abs/2008.13535) | -| DIFM | [IJCAI 2020][A Dual Input-aware Factorization Machine for CTR Prediction](https://www.ijcai.org/Proceedings/2020/0434.pdf) | -| AFN | [AAAI 2020][Adaptive Factorization Network: Learning Adaptive-Order Feature Interactions](https://arxiv.org/pdf/1909.03276) | +| IFM | [IJCAI 2019][An Input-aware Factorization Machine for Sparse Prediction](https://www.ijcai.org/Proceedings/2019/0203.pdf) | +| DCN V2 | [arxiv 2020][DCN V2: Improved Deep & Cross Network and Practical Lessons for Web-scale Learning to Rank Systems](https://arxiv.org/abs/2008.13535) | +| DIFM | [IJCAI 2020][A Dual Input-aware Factorization Machine for CTR Prediction](https://www.ijcai.org/Proceedings/2020/0434.pdf) | +| AFN | [AAAI 2020][Adaptive Factorization Network: Learning Adaptive-Order Feature Interactions](https://arxiv.org/pdf/1909.03276) | +| SharedBottom | [arxiv 2017][An Overview of Multi-Task Learning in Deep Neural Networks](https://arxiv.org/pdf/1706.05098.pdf) | +| ESMM | [SIGIR 2018][Entire Space Multi-Task Model: An Effective Approach for Estimating Post-Click Conversion Rate](https://arxiv.org/abs/1804.07931) | +| MMOE | [KDD 2018][Modeling Task Relationships in Multi-task Learning with Multi-gate Mixture-of-Experts](https://dl.acm.org/doi/abs/10.1145/3219819.3220007) | +| PLE | [RecSys 2020][Progressive Layered Extraction (PLE): A Novel Multi-Task Learning (MTL) Model for Personalized Recommendations](https://dl.acm.org/doi/10.1145/3383313.3412236) | diff --git a/docs/pics/multitaskmodels/ESMM.png b/docs/pics/multitaskmodels/ESMM.png new file mode 100644 index 0000000000000000000000000000000000000000..49f4819aaa1e783000c0d3ab5e0df867a3ebde16 GIT binary patch literal 188744 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%0DoB-k63Jg-9p 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 z zcqUA5p*0#r7*G8Fdzj;7fkf9eejrVQ`inG8zLViIkLX>m&%GAr2pY)lkX(LB!s2G8gY1ooZID~Nz%cipKct5qU=9D54OOWx zrZZQX`us7G5UbrJML;D-LyCR-kDY5i@6Rs8P zl58p@V4x+RQ!x3pcJ&ql^BA=$SC7gc(s-z(P38!fJN&w0Iy(n00pNujk(ODm0m^)IepPBsC^@QbDeU11er-44}74u+@Qko zZE}w8&MH7_d~t<>9yr23*2$xcjOT}sebGXop##Kr>nq-88x)&!W(?#e-V!91{OK0< zaNiFw&wA}X;#ts#kq(wVDY>NAy&;_#AJiT3`JmT<#pMenrI87Z=F{+Frnq@MiC#jq z?8mZ#Pi69s&#N4h%jIJj4#?Y+FD7EdjEX+|VDWTr_}uD?s!{WGwt4i@D%&yzc`;A; z5>DLx@TH?|h=o=lREaw!U4%ffR_2w}Ow9rqW->=*6YO$m! zr26i~JICX%#0}%qJ$~RuMd=QBpk6>*1UioyUA@y9m#*Qjy}Dn}epvZ@LPgKupWCuNTL{!dtLNI5{5x-AtD?I! zR0rE~2k# zG8zCge#A6cmLQ|V(%)Yl$`4LA$hNRei@6fax&QRyD+RS}@D{+`e{U2>zY09Im5@Ft zMMfj7(WZf_(5+I#lcQ#~snl3Z>}-qII^}-Q;@eBl&@bR3i?AILx68q?M=rSB0dCvZvkve5 ztEx{zH6orKS|#7o_%|>6SES?$qhN`<$)dM^jA40@!xVTF3RdRm^KCJh&*RO&7wAEe z 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 literal 0 HcmV?d00001 diff --git a/docs/pics/multitaskmodels/MMOE.png b/docs/pics/multitaskmodels/MMOE.png new file mode 100644 index 0000000000000000000000000000000000000000..80566f7a819f9e2dd1fe8a5636f965858f3bdc89 GIT binary patch literal 96849 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 $H{g9 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

k?SH|Vx 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 EFH@QX<^TWy literal 0 HcmV?d00001 diff --git a/docs/pics/multitaskmodels/SharedBottom.png b/docs/pics/multitaskmodels/SharedBottom.png new file mode 100644 index 0000000000000000000000000000000000000000..38d811a2ef62ef4c43b9ff1878669e46fd5ae169 GIT binary patch literal 32482 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 J1~^Pz{{uwO(fa@Z literal 0 HcmV?d00001 diff --git a/docs/source/Features.md b/docs/source/Features.md index f7bc9827..6ad3b06b 100644 --- a/docs/source/Features.md +++ b/docs/source/Features.md @@ -271,6 +271,55 @@ Adaptive Factorization Network (AFN) can learn arbitrary-order cross features ad [Cheng, W., Shen, Y. and Huang, L. 2020. Adaptive Factorization Network: Learning Adaptive-Order Feature Interactions. Proceedings of the AAAI Conference on Artificial Intelligence. 34, 04 (Apr. 2020), 3609-3616.](https://arxiv.org/pdf/1909.03276) +## MultiTask Models + +### SharedBottom + +Hard parameter sharing is the most commonly used approach to MTL in neural networks. It is generally applied by sharing the hidden layers between all tasks, while keeping several task-specific output layers. + +[**SharedBottom Model API**](./deepctr.models.multitask.sharedbottom.html) + +![SharedBottom](../pics/multitaskmodels/SharedBottom.png) + +[Ruder S. An overview of multi-task learning in deep neural networks[J]. arXiv preprint arXiv:1706.05098, 2017.](https://arxiv.org/pdf/1706.05098.pdf) + + +### ESMM(Entire Space Multi-task Model) + +ESMM models CVR in a brand-new perspective by making good use of sequential pattern of user actions, i.e., impression → +click → conversion. The proposed Entire Space Multi-task Model (ESMM) can eliminate the two problems simultaneously by +i) modeling CVR directly over the entire space, ii) employing a feature representation transfer learning strategy. + +[**ESMM Model API**](./deepctr.models.multitask.esmm.html) + +![ESMM](../pics/multitaskmodels/ESMM.png) + +[Ma X, Zhao L, Huang G, et al. Entire space multi-task model: An effective approach for estimating post-click conversion rate[C]//The 41st International ACM SIGIR Conference on Research & Development in Information Retrieval. 2018.](https://arxiv.org/abs/1804.07931) + +### MMOE(Multi-gate Mixture-of-Experts) + +Multi-gate Mixture-of-Experts (MMoE) explicitly learns to model task relationships from data. We adapt the Mixture-of- +Experts (MoE) structure to multi-task learning by sharing the expert submodels across all tasks, while also having a +gating network trained to optimize each task. + +[**MMOE Model API**](./deepctr.models.multitask.mmoe.html) + +![MMOE](../pics/multitaskmodels/MMOE.png) + +[Ma J, Zhao Z, Yi X, et al. Modeling task relationships in multi-task learning with multi-gate mixture-of-experts[C]//Proceedings of the 24th ACM SIGKDD International Conference on Knowledge Discovery & Data Mining. 2018.](https://dl.acm.org/doi/abs/10.1145/3219819.3220007) + +### PLE(Progressive Layered Extraction) + +PLE separates shared components and task-specific components explicitly and adopts a progressive rout- ing mechanism to +extract and separate deeper semantic knowledge gradually, improving efficiency of joint representation learning and +information routing across tasks in a general setup. + +[**PLE Model API**](./deepctr.models.multitask.ple.html) + +![PLE](../pics/multitaskmodels/PLE.png) + +[Tang H, Liu J, Zhao M, et al. Progressive layered extraction (ple): A novel multi-task learning (mtl) model for personalized recommendations[C]//Fourteenth ACM Conference on Recommender Systems. 2020.](https://dl.acm.org/doi/10.1145/3383313.3412236) + ## Layers The models of deepctr are modular, diff --git a/docs/source/deepctr_torch.models.multitask.esmm.rst b/docs/source/deepctr_torch.models.multitask.esmm.rst new file mode 100644 index 00000000..b8e09bad --- /dev/null +++ b/docs/source/deepctr_torch.models.multitask.esmm.rst @@ -0,0 +1,7 @@ +deepctr\_torch.models.multitask.esmm module +============================= + +.. automodule:: deepctr_torch.models.multitask.esmm + :members: + :no-undoc-members: + :no-show-inheritance: diff --git a/docs/source/deepctr_torch.models.multitask.mmoe.rst b/docs/source/deepctr_torch.models.multitask.mmoe.rst new file mode 100644 index 00000000..385a082a --- /dev/null +++ b/docs/source/deepctr_torch.models.multitask.mmoe.rst @@ -0,0 +1,7 @@ +deepctr\_torch.models.multitask.mmoe module +============================= + +.. automodule:: deepctr_torch.models.multitask.mmoe + :members: + :no-undoc-members: + :no-show-inheritance: diff --git a/docs/source/deepctr_torch.models.multitask.ple.rst b/docs/source/deepctr_torch.models.multitask.ple.rst new file mode 100644 index 00000000..a8a8a843 --- /dev/null +++ b/docs/source/deepctr_torch.models.multitask.ple.rst @@ -0,0 +1,7 @@ +deepctr\_torch.models.multitask.ple module +============================= + +.. automodule:: deepctr_torch.models.multitask.ple + :members: + :no-undoc-members: + :no-show-inheritance: diff --git a/docs/source/deepctr_torch.models.multitask.sharedbottom.rst b/docs/source/deepctr_torch.models.multitask.sharedbottom.rst new file mode 100644 index 00000000..4977c75b --- /dev/null +++ b/docs/source/deepctr_torch.models.multitask.sharedbottom.rst @@ -0,0 +1,7 @@ +deepctr\_torch.models.multitask.sharedbottom module +============================= + +.. automodule:: deepctr_torch.models.multitask.sharedbottom + :members: + :no-undoc-members: + :no-show-inheritance: From 6e4611dd9aeaa572653701431e12f9aafb8c7c68 Mon Sep 17 00:00:00 2001 From: zanshuxun <631763140@qq.com> Date: Sat, 2 Jul 2022 14:38:54 +0800 Subject: [PATCH 28/47] docs --- docs/source/Features.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/source/Features.md b/docs/source/Features.md index 6ad3b06b..ea81d143 100644 --- a/docs/source/Features.md +++ b/docs/source/Features.md @@ -277,7 +277,7 @@ Adaptive Factorization Network (AFN) can learn arbitrary-order cross features ad Hard parameter sharing is the most commonly used approach to MTL in neural networks. It is generally applied by sharing the hidden layers between all tasks, while keeping several task-specific output layers. -[**SharedBottom Model API**](./deepctr.models.multitask.sharedbottom.html) +[**SharedBottom Model API**](./deepctr_torch.models.multitask.sharedbottom.html) ![SharedBottom](../pics/multitaskmodels/SharedBottom.png) @@ -290,7 +290,7 @@ ESMM models CVR in a brand-new perspective by making good use of sequential patt click → conversion. The proposed Entire Space Multi-task Model (ESMM) can eliminate the two problems simultaneously by i) modeling CVR directly over the entire space, ii) employing a feature representation transfer learning strategy. -[**ESMM Model API**](./deepctr.models.multitask.esmm.html) +[**ESMM Model API**](./deepctr_torch.models.multitask.esmm.html) ![ESMM](../pics/multitaskmodels/ESMM.png) @@ -302,7 +302,7 @@ Multi-gate Mixture-of-Experts (MMoE) explicitly learns to model task relationshi Experts (MoE) structure to multi-task learning by sharing the expert submodels across all tasks, while also having a gating network trained to optimize each task. -[**MMOE Model API**](./deepctr.models.multitask.mmoe.html) +[**MMOE Model API**](./deepctr_torch.models.multitask.mmoe.html) ![MMOE](../pics/multitaskmodels/MMOE.png) @@ -314,7 +314,7 @@ PLE separates shared components and task-specific components explicitly and adop extract and separate deeper semantic knowledge gradually, improving efficiency of joint representation learning and information routing across tasks in a general setup. -[**PLE Model API**](./deepctr.models.multitask.ple.html) +[**PLE Model API**](./deepctr_torch.models.multitask.ple.html) ![PLE](../pics/multitaskmodels/PLE.png) From 4c73e7ec331051b92d05d22829fb7e6531cff958 Mon Sep 17 00:00:00 2001 From: zanshuxun <631763140@qq.com> Date: Sat, 2 Jul 2022 14:53:11 +0800 Subject: [PATCH 29/47] eg --- examples/run_multitask_learning.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/run_multitask_learning.py b/examples/run_multitask_learning.py index 8eb69827..cc675a08 100644 --- a/examples/run_multitask_learning.py +++ b/examples/run_multitask_learning.py @@ -51,7 +51,7 @@ print('cuda ready...') device = 'cuda:0' - model = PLE(dnn_feature_columns, shared_expert_num=0, specific_expert_num=0, num_levels=2,task_types=['binary', 'binary'], + model = MMOE(dnn_feature_columns, task_types=['binary', 'binary'], l2_reg_embedding=1e-5, task_names=target, device=device) model.compile("adagrad", loss="binary_crossentropy", metrics=['binary_crossentropy'], ) From 80552b633d0e1e1618bedb192f4e841ee3e45092 Mon Sep 17 00:00:00 2001 From: 631763140 <631763140@qq.com> Date: Sat, 2 Jul 2022 15:48:34 +0800 Subject: [PATCH 30/47] =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deepctr_torch/models/multitask/ple.py | 52 +++++++++++++-------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/deepctr_torch/models/multitask/ple.py b/deepctr_torch/models/multitask/ple.py index ab829f3b..4a538520 100644 --- a/deepctr_torch/models/multitask/ple.py +++ b/deepctr_torch/models/multitask/ple.py @@ -69,7 +69,8 @@ def __init__(self, dnn_feature_columns, shared_expert_num=1, specific_expert_num self.gate_dnn_hidden_units = gate_dnn_hidden_units self.tower_dnn_hidden_units = tower_dnn_hidden_units - # expert dnn + # 1. experts + # task-specific experts self.specific_experts = nn.ModuleList( [nn.ModuleList([nn.ModuleList([DNN(self.input_dim if level_num == 0 else expert_dnn_hidden_units[-1], expert_dnn_hidden_units, activation=dnn_activation, @@ -77,6 +78,7 @@ def __init__(self, dnn_feature_columns, shared_expert_num=1, specific_expert_num init_std=init_std, device=device) for _ in range(self.specific_expert_num)]) for _ in range(self.num_tasks)]) for level_num in range(self.num_levels)]) + # shared experts self.shared_experts = nn.ModuleList( [nn.ModuleList([DNN(self.input_dim if level_num == 0 else expert_dnn_hidden_units[-1], expert_dnn_hidden_units, activation=dnn_activation, @@ -84,7 +86,8 @@ def __init__(self, dnn_feature_columns, shared_expert_num=1, specific_expert_num init_std=init_std, device=device) for _ in range(self.shared_expert_num)]) for level_num in range(self.num_levels)]) - # gate dnn + # 2. gates + # gates for task-specific experts specific_gate_output_dim = self.specific_expert_num + self.shared_expert_num if len(gate_dnn_hidden_units) > 0: self.specific_gate_dnn = nn.ModuleList( @@ -105,6 +108,7 @@ def __init__(self, dnn_feature_columns, shared_expert_num=1, specific_expert_num specific_gate_output_dim, bias=False) for _ in range(self.num_tasks)]) for level_num in range(self.num_levels)]) + # gates for shared experts shared_gate_output_dim = self.num_tasks * self.specific_expert_num + self.shared_expert_num if len(gate_dnn_hidden_units) > 0: self.shared_gate_dnn = nn.ModuleList([DNN(self.input_dim if level_num == 0 else expert_dnn_hidden_units[-1], @@ -155,24 +159,26 @@ def __init__(self, dnn_feature_columns, shared_expert_num=1, specific_expert_num l2=l2_reg_dnn) self.to(device) - # single Extraction Layer - def cgc_net(self, inputs, level_num, is_last=False): + # a single cgc Layer + def cgc_net(self, inputs, level_num): # inputs: [task1, task2, ... taskn, shared task] - # task-specific expert layer + # 1. experts + # task-specific experts specific_expert_outputs = [] for i in range(self.num_tasks): for j in range(self.specific_expert_num): specific_expert_output = self.specific_experts[level_num][i][j](inputs[i]) specific_expert_outputs.append(specific_expert_output) - # build task-shared expert layer + # shared experts shared_expert_outputs = [] for k in range(self.shared_expert_num): shared_expert_output = self.shared_experts[level_num][k](inputs[-1]) shared_expert_outputs.append(shared_expert_output) - # task_specific gate (count = num_tasks) + # 2. gates + # gates for task-specific experts cgc_outs = [] for i in range(self.num_tasks): # concat task-specific expert and task-shared expert @@ -189,20 +195,17 @@ def cgc_net(self, inputs, level_num, is_last=False): gate_mul_expert = torch.matmul(gate_dnn_out.softmax(1).unsqueeze(1), cur_experts_outputs) # (bs, 1, dim) cgc_outs.append(gate_mul_expert.squeeze()) - # task_shared gate, if the level is not the last, add one shared gate - if not is_last: - # all the expert include task-specific expert and task-shared expert - cur_experts_outputs = specific_expert_outputs + shared_expert_outputs - cur_experts_outputs = torch.stack(cur_experts_outputs, 1) + # gates for shared experts + cur_experts_outputs = specific_expert_outputs + shared_expert_outputs + cur_experts_outputs = torch.stack(cur_experts_outputs, 1) - # build gate layers - if len(self.gate_dnn_hidden_units) > 0: - gate_dnn_out = self.shared_gate_dnn[level_num](inputs[-1]) - gate_dnn_out = self.shared_gate_dnn_final_layer[level_num](gate_dnn_out) - else: - gate_dnn_out = self.shared_gate_dnn_final_layer[level_num](inputs[-1]) - gate_mul_expert = torch.matmul(gate_dnn_out.softmax(1).unsqueeze(1), cur_experts_outputs) # (bs, 1, dim) - cgc_outs.append(gate_mul_expert.squeeze()) + if len(self.gate_dnn_hidden_units) > 0: + gate_dnn_out = self.shared_gate_dnn[level_num](inputs[-1]) + gate_dnn_out = self.shared_gate_dnn_final_layer[level_num](gate_dnn_out) + else: + gate_dnn_out = self.shared_gate_dnn_final_layer[level_num](inputs[-1]) + gate_mul_expert = torch.matmul(gate_dnn_out.softmax(1).unsqueeze(1), cur_experts_outputs) # (bs, 1, dim) + cgc_outs.append(gate_mul_expert.squeeze()) return cgc_outs @@ -211,15 +214,12 @@ def forward(self, X): self.embedding_dict) dnn_input = combined_dnn_input(sparse_embedding_list, dense_value_list) - # build Progressive Layered Extraction + # repeat `dnn_input` for several times to generate cgc input ple_inputs = [dnn_input] * (self.num_tasks + 1) # [task1, task2, ... taskn, shared task] ple_outputs = [] for i in range(self.num_levels): - if i == self.num_levels - 1: # the last level - ple_outputs = self.cgc_net(inputs=ple_inputs, level_num=i, is_last=True) - else: - ple_outputs = self.cgc_net(inputs=ple_inputs, level_num=i, is_last=False) - ple_inputs = ple_outputs + ple_outputs = self.cgc_net(inputs=ple_inputs, level_num=i) + ple_inputs = ple_outputs # tower dnn (task-specific) task_outs = [] From d9d45cb192a5dd290fc1d985333672fcfc38d145 Mon Sep 17 00:00:00 2001 From: 631763140 <631763140@qq.com> Date: Sat, 2 Jul 2022 16:06:38 +0800 Subject: [PATCH 31/47] =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deepctr_torch/models/multitask/ple.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deepctr_torch/models/multitask/ple.py b/deepctr_torch/models/multitask/ple.py index 4a538520..8087ad67 100644 --- a/deepctr_torch/models/multitask/ple.py +++ b/deepctr_torch/models/multitask/ple.py @@ -127,7 +127,7 @@ def __init__(self, dnn_feature_columns, shared_expert_num=1, specific_expert_num [nn.Linear(self.input_dim if level_num == 0 else expert_dnn_hidden_units[-1], shared_gate_output_dim, bias=False) for level_num in range(self.num_levels)]) - # tower dnn (task-specific) + # 3. tower dnn (task-specific) if len(tower_dnn_hidden_units) > 0: self.tower_dnn = nn.ModuleList( [DNN(expert_dnn_hidden_units[-1], tower_dnn_hidden_units, activation=dnn_activation, From 924dcf7cf939d14d1d2061f7aaa1248f789ab8ef Mon Sep 17 00:00:00 2001 From: 631763140 <631763140@qq.com> Date: Sat, 2 Jul 2022 16:45:02 +0800 Subject: [PATCH 32/47] format --- README.md | 2 +- deepctr_torch/models/multitask/esmm.py | 2 +- deepctr_torch/models/multitask/mmoe.py | 2 +- docs/source/Features.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index f151e158..d4966821 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ Let's [**Get Started!**](https://deepctr-torch.readthedocs.io/en/latest/Quick-St | DIFM | [IJCAI 2020][A Dual Input-aware Factorization Machine for CTR Prediction](https://www.ijcai.org/Proceedings/2020/0434.pdf) | | AFN | [AAAI 2020][Adaptive Factorization Network: Learning Adaptive-Order Feature Interactions](https://arxiv.org/pdf/1909.03276) | | SharedBottom | [arxiv 2017][An Overview of Multi-Task Learning in Deep Neural Networks](https://arxiv.org/pdf/1706.05098.pdf) | -| ESMM | [SIGIR 2018][Entire Space Multi-Task Model: An Effective Approach for Estimating Post-Click Conversion Rate](https://arxiv.org/abs/1804.07931) | +| ESMM | [SIGIR 2018][Entire Space Multi-Task Model: An Effective Approach for Estimating Post-Click Conversion Rate](https://dl.acm.org/doi/10.1145/3209978.3210104) | | MMOE | [KDD 2018][Modeling Task Relationships in Multi-task Learning with Multi-gate Mixture-of-Experts](https://dl.acm.org/doi/abs/10.1145/3219819.3220007) | | PLE | [RecSys 2020][Progressive Layered Extraction (PLE): A Novel Multi-Task Learning (MTL) Model for Personalized Recommendations](https://dl.acm.org/doi/10.1145/3383313.3412236) | diff --git a/deepctr_torch/models/multitask/esmm.py b/deepctr_torch/models/multitask/esmm.py index cf3ffac2..4a0d2fe2 100644 --- a/deepctr_torch/models/multitask/esmm.py +++ b/deepctr_torch/models/multitask/esmm.py @@ -4,7 +4,7 @@ zanshuxun, zanshuxun@aliyun.com Reference: - [1] Ma X, Zhao L, Huang G, et al. Entire space multi-task model: An effective approach for estimating post-click conversion rate[C]//The 41st International ACM SIGIR Conference on Research & Development in Information Retrieval. 2018.(https://arxiv.org/abs/1804.07931) + [1] Ma X, Zhao L, Huang G, et al. Entire space multi-task model: An effective approach for estimating post-click conversion rate[C]//The 41st International ACM SIGIR Conference on Research & Development in Information Retrieval. 2018.(https://dl.acm.org/doi/10.1145/3209978.3210104) """ import torch import torch.nn as nn diff --git a/deepctr_torch/models/multitask/mmoe.py b/deepctr_torch/models/multitask/mmoe.py index d300088d..109d1805 100644 --- a/deepctr_torch/models/multitask/mmoe.py +++ b/deepctr_torch/models/multitask/mmoe.py @@ -4,7 +4,7 @@ zanshuxun, zanshuxun@aliyun.com Reference: - [1] Jiaqi Ma, Zhe Zhao, Xinyang Yi, et al. Modeling Task Relationships in Multi-task Learning with Multi-gate Mixture-of-Experts[C]](https://dl.acm.org/doi/10.1145/3219819.3220007) + [1] Jiaqi Ma, Zhe Zhao, Xinyang Yi, et al. Modeling Task Relationships in Multi-task Learning with Multi-gate Mixture-of-Experts[C] (https://dl.acm.org/doi/10.1145/3219819.3220007) """ import torch import torch.nn as nn diff --git a/docs/source/Features.md b/docs/source/Features.md index ea81d143..fc521726 100644 --- a/docs/source/Features.md +++ b/docs/source/Features.md @@ -294,7 +294,7 @@ i) modeling CVR directly over the entire space, ii) employing a feature represen ![ESMM](../pics/multitaskmodels/ESMM.png) -[Ma X, Zhao L, Huang G, et al. Entire space multi-task model: An effective approach for estimating post-click conversion rate[C]//The 41st International ACM SIGIR Conference on Research & Development in Information Retrieval. 2018.](https://arxiv.org/abs/1804.07931) +[Ma X, Zhao L, Huang G, et al. Entire space multi-task model: An effective approach for estimating post-click conversion rate[C]//The 41st International ACM SIGIR Conference on Research & Development in Information Retrieval. 2018.](https://dl.acm.org/doi/10.1145/3209978.3210104) ### MMOE(Multi-gate Mixture-of-Experts) From 1efafb3c4c06088347a94d7148e66f74218423db Mon Sep 17 00:00:00 2001 From: 631763140 <631763140@qq.com> Date: Sat, 2 Jul 2022 16:47:41 +0800 Subject: [PATCH 33/47] format --- deepctr_torch/models/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deepctr_torch/models/__init__.py b/deepctr_torch/models/__init__.py index 93e4fdb6..784134b5 100644 --- a/deepctr_torch/models/__init__.py +++ b/deepctr_torch/models/__init__.py @@ -16,4 +16,4 @@ from .dien import DIEN from .din import DIN from .afn import AFN -from .multitask import SharedBottom, ESMM, MMOE, PLE \ No newline at end of file +from .multitask import SharedBottom, ESMM, MMOE, PLE From 18f04ed7cee5f1d74f64bc05ece77a2adf5705e2 Mon Sep 17 00:00:00 2001 From: 631763140 <631763140@qq.com> Date: Sat, 2 Jul 2022 16:59:29 +0800 Subject: [PATCH 34/47] byterec_sample.txt 200 --- examples/byterec_sample.txt | 800 ------------------------------------ 1 file changed, 800 deletions(-) diff --git a/examples/byterec_sample.txt b/examples/byterec_sample.txt index 975bfa7c..8fc06566 100644 --- a/examples/byterec_sample.txt +++ b/examples/byterec_sample.txt @@ -1,803 +1,3 @@ -57384 52 43192 142828 0 0 0 0 4513 34178 53085993699 39 -3230 5 46822 231026 1 0 1 0 5330 24878 53086372896 16 -1249 328 1209078 456220 2 0 0 0 39979 14274 53086458433 4 -11928 8 1209079 456221 3 0 0 0 -1 16649 53086463774 9 -51266 89 1209080 126416 4 0 1 0 -1 27090 53086432937 19 -23006 -1 1209081 122067 5 1 0 0 3639 14908 53086163309 10 -12637 265 269351 6757 6 0 1 0 -1 27794 53086427987 4 -42686 140 1209082 178779 7 0 0 0 7 17817 53085001012 10 -1775 28 1209083 1616 8 0 1 0 14463 30899 53086441559 10 -57385 -1 1209084 20448 9 1 0 0 3735 43941 53085729143 14 -10987 115 65804 43245 10 0 1 0 7 17481 53085562259 21 -17534 123 1209085 456222 11 0 0 0 -1 34312 53086389136 10 -17538 110 554984 3889 12 0 0 0 -1 1083 53086422910 9 -12624 248 183163 1605 3 0 0 0 -1 18695 53086200164 9 -53305 91 471042 47416 13 0 0 0 -1 32001 53085240163 10 -7362 12 92647 49301 14 0 0 0 -1 17934 53086324562 10 -42395 31 1209086 73570 15 0 0 0 6725 43942 53086348708 20 -12676 57 18585 61824 1 0 1 0 59 6733 53085889369 9 -10993 -1 1209087 7706 -1 1 0 0 -1 1855 53081848642 10 -37914 99 463540 25534 17 0 0 0 53 9558 53084303614 8 -57386 -1 1209088 192544 18 1 0 0 -1 30858 53085582397 20 -6703 120 1209089 68745 19 0 1 0 -1 800 53086351637 10 -53651 78 224493 127164 20 0 0 0 2464 39844 53086369016 10 -34052 139 22741 12255 21 0 1 0 -1 43943 53086443915 12 -23289 220 1209090 65069 7 0 0 0 -1 41484 53086464402 10 -17656 134 1209091 125019 22 0 0 0 2961 9287 53086424272 10 -49903 62 1209092 12644 23 0 0 0 1283 23498 53085991885 10 -314 97 1209093 15537 24 0 1 0 -1 2580 53086289816 9 -7377 -1 351162 56018 25 1 0 0 685 24475 53083717645 2 -932 91 556678 23862 26 0 1 0 -1 8686 53085672533 9 -19570 99 87257 119609 27 0 0 0 -1 10614 53086436868 20 -42404 68 1209094 166190 28 0 1 0 -1 43944 53084369705 10 -27297 340 126001 8463 29 0 0 0 12 43945 53085685201 21 -16386 61 1209095 456223 30 0 0 0 -1 27835 53086333119 10 -30459 189 66964 65695 31 0 0 0 86 43946 53085224195 11 -21872 67 169542 9925 32 0 0 0 380 11858 53085053660 20 -6585 -1 1209096 431421 33 1 0 0 930 23036 53086255763 10 -8308 13 100302 48578 34 0 0 0 -1 43947 53086092845 9 -5490 -1 1209097 21585 35 2 0 0 -1 1812 53086457907 19 -31894 -1 1209098 62430 20 1 0 0 25 43948 53085956762 19 -9308 177 910755 45495 32 0 0 0 992 7861 53085650077 9 -18284 31 1209099 37899 36 0 0 0 40022 15893 53086436543 19 -12533 148 1209100 504 37 0 1 0 597 32620 53086424288 30 -43738 99 1209101 228209 4 0 1 0 -1 598 53086083418 10 -20495 28 1209102 37442 6 0 0 0 762 7431 53086356318 19 -32444 -1 1209103 57514 38 1 0 0 -1 32160 53073121156 9 -14887 70 387521 10504 33 0 0 0 -1 14217 53086459719 10 -13907 18 1209104 89836 7 0 0 0 -1 12892 53086465351 9 -1978 21 1209105 56257 7 3 0 0 -1 32762 53085674405 10 -11074 99 87164 62916 23 0 0 0 10666 7998 53084717098 10 -16936 189 1209106 456224 39 0 0 0 2510 42756 53086430941 10 -29595 -1 962888 22423 40 1 0 0 -1 43949 53083871230 9 -31471 -1 1209107 456225 -1 1 0 0 -1 43950 53077777264 20 -31257 2 1209108 81329 41 0 1 0 -1 19186 53085397650 35 -57387 299 28992 23643 42 0 0 0 815 43951 53086266457 3 -48809 120 550538 104855 43 0 0 0 1557 20301 53085916634 9 -51750 154 224 4092 44 0 0 0 530 28234 53085818229 21 -57388 3 6736 17438 31 0 1 0 512 33024 53086359747 26 -8824 -1 1209109 97089 45 1 0 0 -1 1281 53086211445 42 -31664 175 230545 9176 42 0 0 0 -1 7911 53086455569 10 -30886 164 1209110 369482 46 3 0 0 -1 40077 53086438047 19 -24495 6 1209111 107478 47 0 1 0 -1 3387 53086000562 7 -57389 151 4273 14567 48 0 0 0 58 43952 53086425175 9 -48604 91 1209112 215101 14 0 1 0 -1 19621 53086367379 6 -45711 -1 1209113 5699 0 1 0 0 25120 9166 53084022649 19 -45715 -1 1209114 365903 49 1 0 0 -1 9180 53083976724 39 -13111 26 1209115 11460 20 0 1 0 21395 18976 53084174668 10 -50505 195 1209116 289843 9 0 0 0 -1 25149 53085409502 19 -11218 159 860980 1799 11 0 0 0 -1 31264 53086434757 21 -57390 138 1209117 456226 39 0 0 0 -1 43953 53086449042 9 -5885 89 339942 91922 50 0 1 0 -1 4363 53086193136 10 -32309 214 1209118 214956 7 0 0 0 -1 12812 53085854063 8 -538 16 1209119 168144 51 0 1 0 -1 32354 53084130452 21 -3298 -1 1209120 46061 49 1 0 0 986 32479 53085530989 10 -4471 120 1209121 4099 -1 0 1 0 -1 6164 53084232132 20 -12436 109 96639 26058 -1 0 0 0 -1 794 53086048818 10 -786 254 1209122 5634 52 0 0 0 -1 4666 53086213277 10 -3893 115 309730 4026 42 0 1 0 -1 6918 53086266560 4 -57391 252 156807 13257 53 0 0 0 -1 43954 53085683310 9 -38728 104 984880 59977 54 0 0 0 -1 21095 53086341571 9 -47654 -1 42316 1511 33 1 1 0 2376 16484 53086343209 6 -7024 68 1209123 57727 33 0 1 0 1947 43955 53085507605 21 -53006 113 536861 277942 55 0 0 0 25 34626 53086102738 9 -6422 243 1209124 68382 56 0 0 0 -1 30431 53086381058 20 -48034 70 204373 456227 57 0 0 0 -1 17745 53086375221 9 -3902 159 113715 23386 33 0 0 0 -1 465 53084330627 12 -33723 106 1209125 456228 48 0 0 0 -1 20225 53085078980 10 -57392 62 1209126 5279 58 0 1 0 -1 37608 53085157706 21 -7878 167 286406 39543 59 0 0 0 -1 38121 53084349382 3 -41801 99 253393 134396 60 0 0 0 -1 43956 53086199899 10 -14575 102 1209127 157421 61 0 0 0 6977 12306 53086336433 10 -6193 21 380271 159138 62 0 1 0 1085 16235 53086434265 9 -2808 35 1209128 12478 63 0 0 0 1219 365 53086443225 9 -8161 51 225233 8390 64 0 1 0 -1 8286 53086357798 9 -4475 1 876313 9922 65 0 1 0 88 6766 53086350963 7 -46666 24 27202 44427 66 0 0 0 -1 12905 53086437135 10 -57393 -1 1209129 25529 -1 1 0 0 -1 31130 53077964861 10 -19680 18 1209130 157447 10 0 1 0 25 43957 53086039170 11 -13100 -1 1209131 21663 67 1 1 0 11895 15995 53086192701 11 -32254 231 101821 63944 68 0 0 0 -1 30803 53086368443 7 -44822 281 174386 2222 6 0 0 0 5403 5556 53086294114 10 -57394 28 1209132 33040 15 0 1 0 82 43958 53085472784 9 -34670 6 1209133 223047 7 0 0 0 -1 34302 53086195312 9 -32322 89 147859 8171 33 0 1 0 14943 41659 53085735562 9 -3849 165 196109 28485 11 0 0 0 -1 35461 53086209969 7 -10113 144 1209134 166541 0 0 1 0 3173 40369 53086344137 10 -9138 242 93680 11061 69 0 0 0 -1 22171 53086372249 4 -46496 -1 1209135 18453 70 1 0 0 -1 12265 53086326271 21 -18091 6 1209136 23906 41 0 0 0 1954 2031 53086300944 10 -23496 75 13941 77103 39 0 1 0 -1 20715 53086431651 9 -5023 -1 1209137 31400 71 1 0 0 4961 2067 53086423223 9 -20213 167 1209090 65069 7 0 1 0 -1 43959 53086464402 10 -57395 128 223408 81805 72 0 0 0 699 43960 53084449852 41 -2603 3 1209138 87825 8 3 0 0 -1 30971 53086470864 21 -32323 166 1209139 64613 73 0 0 0 -1 43961 53085061913 21 -39344 59 1209140 112211 74 0 0 0 -1 28876 53086444185 9 -35643 122 1209141 54552 75 0 1 0 2165 20406 53083925641 9 -37308 99 1209142 73183 22 0 0 0 8647 803 53085339114 9 -3033 -1 1209143 238932 66 1 0 0 -1 33847 53086025083 10 -1021 180 1209144 70707 76 0 0 0 101 15941 53085841282 10 -33864 39 1209145 10562 52 0 1 0 5215 31257 53086429833 9 -54344 122 374671 75564 17 0 0 0 142 37109 53085937838 4 -6600 318 76321 8680 77 0 1 0 36242 34784 53085996007 21 -2557 16 1209146 7350 78 0 1 0 -1 10680 53086432757 10 -57396 -1 334471 3708 79 1 0 0 -1 43962 53086172428 3 -36299 125 138429 58621 4 0 1 0 -1 12793 53086442416 7 -57397 -1 1209147 365461 80 1 0 0 -1 43963 53083235030 7 -15839 155 34074 16382 69 0 0 0 863 10631 53086265255 10 -16421 -1 396354 9739 81 1 1 0 -1 33837 53086115120 2 -23877 68 1209148 404962 82 0 0 0 -1 7440 53086463914 11 -21868 105 164147 1627 54 0 0 0 -1 9284 53086387208 22 -52996 54 32765 64820 11 0 1 0 1083 39501 53086441636 9 -31751 49 808123 52369 29 0 1 0 222 5216 53086356597 10 -9521 138 22819 36233 49 0 0 0 8593 32251 53086453053 7 -30967 -1 328334 201737 33 1 0 0 -1 43964 53084810403 9 -1502 253 1209149 326190 -1 0 0 0 -1 33215 53086257168 10 -15428 47 431747 213115 9 0 1 0 -1 43965 53085155846 20 -903 -1 70297 1634 83 1 0 0 -1 873 53084474769 11 -36342 -1 1209150 29761 84 1 0 0 -1 751 53076340891 9 -16311 57 7596 2191 41 0 0 0 578 15153 53086354469 9 -43656 13 1209151 16060 33 0 1 0 -1 194 53086342969 10 -34411 102 6177 4508 85 0 0 0 7 10287 53084998532 21 -3283 19 1209152 4810 86 0 0 0 3921 2481 53084351967 9 -34642 -1 1209153 17477 87 1 0 0 -1 3241 53085677458 10 -8901 -1 1209154 190193 88 1 0 0 -1 43966 53082311168 10 -57398 234 72330 55748 42 0 0 0 -1 43967 53085884345 7 -2833 194 1209155 65069 7 0 1 0 -1 1264 53086356450 7 -4319 120 213457 73457 73 0 0 0 -1 17768 53085762400 10 -49967 59 335901 47237 5 0 1 0 -1 23665 53086364997 41 -19065 15 4520 1711 89 0 0 0 726 12938 53086466125 21 -2026 40 210879 41756 64 0 1 0 3945 8758 53086110139 7 -20068 19 1565 6131 90 0 0 0 255 38002 53086385908 9 -6767 -1 342364 3961 91 1 0 0 -1 43968 53086004633 10 -57399 220 1209156 76810 84 0 0 0 -1 43969 53085902651 10 -39803 76 1087322 1294 68 0 0 0 -1 1313 53086015088 5 -7545 70 1209157 226515 92 0 1 0 33 2206 53084129401 10 -33308 16 1209158 155935 -1 0 0 0 -1 3787 53086421547 12 -43611 -1 1209159 456229 3 1 0 0 43 14888 53085225379 10 -37325 260 1209160 86437 60 0 0 0 5394 12723 53086085413 9 -14160 78 1209161 17233 93 0 1 0 -1 4880 53086366351 11 -57400 -1 1209162 57242 5 1 0 0 -1 41107 53085655430 4 -22402 264 1209163 57294 82 0 0 0 33468 28113 53085879492 4 -1287 -1 1209164 214922 4 1 1 0 -1 27262 53085767138 5 -57401 195 101650 9227 94 0 0 0 -1 43970 53084784422 10 -1212 167 786663 427 95 0 0 0 172 7187 53085472651 9 -6055 217 11396 43233 0 0 0 0 413 38530 53085458533 7 -13580 266 17281 5921 4 0 0 0 -1 15642 53086442501 10 -9217 46 131537 21621 7 0 1 0 -1 21716 53086405434 24 -3265 -1 1209165 1153 96 1 0 0 -1 6069 53082210290 5 -15694 14 172342 282 13 0 0 0 -1 24617 53086372927 10 -37855 76 1209166 456230 64 0 0 0 491 17177 53084796207 9 -16082 -1 1209167 8216 -1 1 0 0 -1 43971 53079735844 6 -33780 21 43192 142828 0 0 0 0 4513 5630 53085993699 39 -10917 -1 1209168 143408 28 1 1 0 -1 833 53086198926 10 -11606 106 70962 6833 17 0 1 0 -1 43972 53086342197 9 -6709 -1 1209169 203150 4 1 0 0 -1 4668 53086339448 2 -53727 -1 1209170 456231 97 1 0 0 3377 43973 53083952666 3 -54196 138 1209171 52543 72 0 0 0 -1 32954 53086349076 11 -8974 13 1078552 27880 32 0 0 0 68 9228 53086430192 21 -36480 248 54838 2855 98 0 1 0 2710 43974 53085491038 10 -31877 222 1209172 60408 99 0 0 0 -1 43975 53086281553 4 -46879 134 1209173 456232 22 3 0 0 4075 13656 53084046085 2 -4720 -1 1045116 99385 87 1 0 0 -1 30513 53085299798 21 -13306 150 1209174 456233 100 0 0 0 -1 7020 53085167029 7 -28158 -1 1209175 127217 1 2 1 0 -1 19123 53086466767 2 -57402 220 363910 14103 11 0 1 0 61 32320 53086261958 10 -43866 73 1209176 456234 101 0 0 0 46 1215 53086431103 8 -51796 21 34074 16382 69 0 1 0 863 28348 53086265255 10 -53073 -1 1209177 143444 102 1 0 0 307 43976 53085480856 9 -57403 292 1209178 8145 103 0 1 0 1717 43977 53085671625 10 -6939 123 660357 343569 104 0 1 0 -1 3345 53085594143 40 -6430 73 1209179 456235 78 0 0 0 -1 30700 53086424096 7 -50941 60 163999 39568 31 0 0 0 1899 26232 53086012435 6 -809 171 752253 21663 67 0 0 0 2814 4610 53086431679 10 -13589 31 544024 51861 34 0 1 0 -1 3838 53085543451 19 -32619 20 1209180 139406 105 0 1 0 -1 30866 53086389242 4 -9575 106 1209181 456236 89 0 1 0 -1 34766 53085956868 8 -51720 80 1209182 2453 -1 0 0 0 -1 28174 53084376234 3 -19622 286 1209183 2246 106 0 0 0 16621 43978 53083857346 9 -13205 -1 1209184 233266 107 1 1 0 1261 43979 53086370106 10 -2552 76 1209185 146367 49 0 0 0 -1 14347 53086425451 9 -31979 -1 939695 28160 96 1 0 0 3287 7758 53085492212 10 -57404 -1 648668 19687 85 1 0 0 -1 31784 53085992236 10 -57405 16 1209186 276671 107 0 1 0 -1 43980 53085674875 9 -1117 316 1209187 228270 7 0 0 0 -1 4525 53084895228 9 -37448 115 567569 44888 42 0 0 0 1699 43981 53085738314 9 -9669 146 1209188 167894 82 0 1 0 4019 19132 53085875614 11 -19435 40 377366 25924 85 0 0 0 -1 33801 53085422342 10 -53299 6 4297 45326 74 0 0 0 -1 43982 53086417671 10 -11043 -1 1209189 214651 108 1 0 0 -1 36611 53083396103 9 -8144 12 1209190 71308 33 0 0 0 28240 12439 53086443979 9 -6812 16 1209191 67265 32 0 0 0 8320 30364 53086451803 7 -8623 82 1209192 10098 106 0 1 0 -1 11996 53086444998 8 -9629 31 1209193 184752 109 0 1 0 -1 32093 53085591140 5 -52799 175 1209194 109629 101 0 1 0 -1 33106 53085915481 6 -38008 -1 1209195 456237 11 1 0 1 56 18558 53085805030 9 -51750 154 234989 33229 9 0 1 0 -1 28234 53085437678 8 -57406 226 71963 34917 110 0 1 0 30276 36314 53086303187 28 -20955 243 265934 6467 33 0 1 0 13350 33575 53086329076 42 -46869 203 1209196 75848 108 0 1 0 5865 13628 53086256219 4 -37906 182 1209197 456238 111 0 0 0 63 6455 53086423321 11 -53073 -1 1209198 215218 24 1 0 0 -1 43976 53085826604 10 -44362 47 426 380 24 0 1 0 -1 3543 53086393938 9 -31772 12 1209199 401070 4 0 0 0 -1 15842 53084279659 10 -15416 156 1209200 214084 112 0 0 0 -1 18637 53086351076 10 -13403 18 1209201 220117 113 0 0 0 -1 9568 53086422898 10 -19455 302 1209202 60666 76 0 1 0 813 27541 53086330213 10 -10923 45 852899 613 74 0 0 0 14069 14577 53085721201 10 -33333 173 1209203 40932 114 0 1 0 -1 20625 53084384166 10 -49183 150 970335 114198 -1 0 0 0 -1 21457 53085484281 9 -6452 99 750749 20526 67 0 1 0 -1 18924 53085605049 10 -57407 -1 978611 4895 -1 1 1 0 -1 43983 53080857372 10 -36546 181 141432 2989 103 0 0 0 2228 33780 53085397913 30 -4956 193 26094 1344 79 0 1 0 410 38669 53085314548 18 -57408 -1 1209204 321149 71 1 0 0 -1 43984 53085917661 10 -22580 -1 343880 9514 101 1 1 0 -1 37448 53085680731 2 -41840 -1 1209205 1886 68 1 0 0 -1 15253 53085842482 10 -2085 29 1209206 456239 37 0 1 0 -1 4983 53086440092 10 -39056 59 1209207 456240 18 0 0 0 43 7471 53086422631 9 -37584 68 75987 1028 14 0 0 0 -1 19348 53086345061 18 -47304 41 16118 573 7 0 0 0 -1 15230 53085412854 11 -43834 100 353335 122030 115 0 0 0 315 1098 53086461802 8 -26244 -1 1209208 327068 86 1 0 0 -1 1623 53069870239 10 -57409 -1 1209209 98276 73 1 0 0 -1 43985 53085400449 10 -6703 120 1209210 33843 116 0 0 0 -1 800 53086380082 14 -7084 40 1209211 264412 117 0 0 0 8363 43986 53084012578 7 -43815 138 414536 20319 85 0 0 0 -1 1004 53085942353 7 -5204 150 1209212 456241 118 0 0 0 -1 43987 53085573010 10 -33070 18 1209213 133810 39 0 0 0 31146 4561 53086426278 12 -27813 -1 1209214 140031 1 1 0 0 -1 19331 53082223235 17 -45451 178 1209215 29424 49 0 0 0 -1 8183 53086455649 13 -38422 35 208986 49131 119 0 0 0 -1 35482 53085755875 10 -4515 -1 1209216 11746 -1 1 0 0 -1 43988 53081893166 13 -43779 18 1209217 338395 120 0 0 0 11462 778 53086438978 17 -6964 68 251234 5424 6 0 1 0 -1 4328 53086350493 11 -21836 8 609386 57719 4 0 0 0 -1 43989 53084544507 2 -4354 286 1209218 8360 121 0 1 0 -1 17527 53085330935 17 -21515 226 1209219 14179 2 0 1 0 284 43990 53085490359 12 -57410 -1 43146 50765 78 1 1 0 -1 43991 53085943836 10 -44483 91 18505 2933 113 0 0 0 -1 4072 53085678558 12 -538 16 1209220 424029 34 0 0 0 -1 32354 53086025633 16 -6939 123 1209221 189735 122 0 0 0 238 3345 53086354044 16 -34817 100 153074 470 123 0 1 0 -1 32606 53086379471 2 -27589 357 1209222 295007 39 0 0 0 -1 28070 53086377620 21 -4657 -1 1209223 174907 7 1 1 0 -1 30865 53086012840 14 -57411 60 1209224 33647 124 0 0 0 337 36349 53084258240 14 -50151 292 1209225 49212 125 0 0 0 -1 24206 53086372366 14 -35758 273 346136 20957 78 0 1 0 -1 8819 53086438829 10 -32247 134 106480 42478 126 0 0 0 199 39560 53085826567 10 -57412 28 300062 63041 127 0 1 0 3463 43992 53085835603 9 -52885 150 1209226 46123 128 0 0 0 20518 32978 53084108828 9 -41321 8 1209227 258821 55 0 1 0 -1 19815 53085224206 20 -48978 -1 1209228 456242 33 1 1 0 -1 20835 53084226691 18 -30198 -1 1209229 4889 96 1 0 0 6065 13199 53085979582 7 -27394 235 7813 58469 129 0 0 0 -1 6267 53086378999 10 -55222 316 1209230 3328 7 0 0 0 3153 43993 53086325877 14 -206 -1 1209231 1243 130 1 0 0 -1 13511 53086259925 14 -14484 -1 136238 23715 96 1 0 0 -1 37906 53086383583 7 -9616 91 1209232 228275 101 0 0 0 -1 10282 53086395967 14 -2998 77 315336 81814 86 0 0 0 -1 43994 53086445157 2 -12601 46 62767 10083 131 0 1 0 3758 18224 53086362326 9 -57413 228 558375 24277 39 0 0 0 757 31127 53085659471 5 -37996 53 206837 19950 69 0 0 0 6123 43995 53086349753 10 -15627 35 1209233 456243 42 0 0 0 57 43996 53086385814 13 -3244 81 1209234 128982 132 0 1 0 110 3976 53086446342 15 -10388 118 72266 51077 0 0 0 0 -1 12174 53086453978 9 -39845 155 84627 202 133 0 0 0 -1 24881 53086461911 11 -37126 76 659576 13254 73 0 1 0 -1 35827 53085870653 7 -36078 140 1209235 213746 101 0 1 0 -1 41855 53086362375 10 -30928 30 1209236 15497 134 0 1 0 2219 34737 53084398120 21 -4112 -1 1209237 41018 125 1 0 0 -1 500 53086200656 9 -3407 99 1209238 38830 14 0 0 0 -1 22465 53083946541 17 -52039 292 86024 2793 60 0 1 0 -1 28869 53086431733 10 -48061 24 36211 54195 135 0 1 0 1059 17845 53085060377 9 -47620 216 137096 4362 97 0 0 0 639 16348 53086260234 10 -17690 29 1209239 12519 20 0 0 0 11024 36558 53086417339 10 -57414 19 1209240 194880 26 0 1 0 275 31509 53085935784 9 -41458 239 1209241 72160 136 0 0 0 863 40102 53086373381 16 -32275 45 386589 16739 28 0 1 0 -1 1549 53086434679 21 -6767 -1 1209242 94486 137 1 1 0 -1 43968 53083267801 10 -3269 114 891464 251567 33 0 0 0 10602 35716 53086278091 10 -6645 -1 1209243 1477 -1 1 0 0 -1 2801 53080570389 9 -2876 -1 1209244 6927 33 1 0 0 -1 31860 53086359689 17 -57415 110 1209245 1237 10 0 1 0 -1 30723 53086425618 15 -9382 144 897593 5682 138 0 0 0 3380 33153 53086393825 10 -57416 35 1209246 44820 139 0 0 0 930 43997 53086419568 20 -9332 150 1209247 177283 9 0 1 0 -1 536 53086002634 10 -57417 99 113616 37554 140 0 1 0 -1 43998 53084983779 6 -1022 31 38600 33717 29 0 0 0 -1 394 53085400590 10 -1205 57 52290 203268 65 0 0 0 -1 35917 53085737401 41 -32830 93 211440 3938 45 0 0 0 7 9479 53086428185 20 -18333 18 318002 59803 48 0 0 0 33 10277 53086101222 7 -45657 38 1209248 456244 103 0 0 0 2247 8942 53086409762 24 -36342 217 1209249 100029 13 0 0 0 -1 751 53086442996 22 -6988 91 913490 16759 38 0 0 0 -1 43999 53085181080 10 -19389 159 844135 149385 35 0 1 0 -1 10029 53086370262 10 -12874 -1 1209250 34289 42 1 1 0 -1 44000 53085985407 10 -987 97 135416 2961 17 0 0 0 3342 15467 53086445911 9 -15808 243 779177 56502 85 0 1 0 -1 34366 53086452747 7 -19635 10 779177 56502 104 0 1 0 -1 13950 53086452747 7 -24015 -1 1209251 35286 42 1 1 0 -1 3816 53084018605 9 -887 -1 1209252 120830 13 2 0 1 4406 8677 53086456029 18 -9385 57 1161002 881 133 0 1 0 -1 12505 53086275822 10 -47573 240 1209253 456245 136 0 0 0 -1 16176 53086454534 7 -1408 13 1209254 6282 4 0 0 0 -1 2768 53086457491 10 -8512 91 1209255 34787 35 0 0 0 -1 34630 53086417505 10 -863 106 275307 17656 90 0 1 0 176 31625 53085265695 9 -23749 81 41081 3376 141 0 1 0 2732 44001 53086431357 9 -19041 -1 1209256 19479 107 1 0 0 562 44002 53085417929 7 -2538 -1 1209257 2020 35 1 0 0 -1 44003 53086217075 16 -32851 107 1209258 456246 17 0 1 0 110 9542 53086381912 16 -57418 6 1209259 242319 142 0 0 0 -1 44004 53083850779 16 -14245 205 646683 215742 75 0 0 0 -1 5765 53086332292 21 -22520 251 1209260 98473 15 0 0 0 68 3091 53086455237 25 -7807 -1 1209261 9922 65 1 0 0 -1 44005 53085382733 16 -57419 0 1297 4895 143 0 1 0 -1 44006 53086385592 9 -2114 -1 1209262 17443 67 1 0 0 -1 38563 53085667385 24 -30212 -1 1209263 9488 29 1 0 0 -1 27908 53086455897 25 -37496 242 84149 14216 52 0 0 0 -1 19717 53086386442 4 -29096 16 157739 8121 123 0 1 0 -1 31064 53085857182 10 -45016 183 168022 30411 144 0 1 0 -1 6317 53084254394 10 -35698 35 1209264 29219 33 0 0 0 -1 44007 53086455632 21 -36342 -1 1209265 22826 9 1 0 0 4820 751 53068781633 9 -33580 349 1209266 196786 4 0 1 0 -1 12181 53085678882 42 -57420 194 1209267 456247 145 3 1 0 835 44008 53086381438 24 -4618 11 1209268 93954 111 0 0 0 10827 7820 53086346486 12 -11012 56 1209269 456248 146 0 1 0 -1 12902 53086442751 10 -1237 94 259356 2715 147 0 1 0 -1 12991 53085917520 7 -57421 31 1209270 37222 148 0 0 0 16142 44009 53083877358 30 -20271 91 618587 27846 35 0 1 0 8284 12963 53085936678 21 -11114 169 172316 51004 132 0 1 0 7835 30428 53084786773 20 -11408 261 18019 10874 69 0 1 0 -1 1201 53085256360 9 -57422 -1 82101 236 4 1 1 0 -1 36896 53086366768 15 -31765 143 127213 65254 86 0 0 0 10601 33761 53085260647 9 -31255 364 96335 9393 6 0 0 0 -1 13558 53084474466 7 -38125 57 1209271 288116 35 0 1 0 1031 11151 53086460766 21 -35253 42 431003 100989 64 0 1 0 1058 10461 53086361090 10 -3236 -1 339571 57481 149 1 0 0 -1 12476 53085759810 9 -6295 21 29577 3938 45 0 0 0 2346 44010 53086428999 42 -57423 171 1209272 456249 150 0 1 0 7288 44011 53084363226 18 -13879 157 1209273 196400 45 0 0 0 1102 22599 53085552004 25 -30561 6 1209274 280921 7 0 1 0 -1 12604 53086431566 28 -6315 91 1209275 456250 113 0 1 0 -1 1514 53086419751 10 -18779 167 129880 203275 103 0 0 0 1210 32629 53086395661 15 -3627 -1 4360 546 135 1 1 0 -1 33559 53086116899 10 -16798 29 124248 9100 56 0 0 0 3227 4108 53084279613 19 -43393 73 528923 339 108 0 0 0 33 44012 53085998044 10 -29981 41 29060 32642 4 0 1 0 1856 10734 53084775626 12 -866 92 177162 19146 42 0 0 0 -1 157 53086421013 9 -14210 66 426 380 24 0 1 0 -1 42558 53086393938 9 -5816 -1 100721 1022 151 2 0 0 -1 6204 53086458811 21 -24446 271 426 380 24 0 1 0 -1 11231 53086393938 9 -20583 76 1209276 101410 85 0 1 0 -1 13847 53084172588 23 -39463 180 1209277 239739 75 0 0 0 -1 24355 53086423405 26 -582 189 53474 19183 4 0 1 0 -1 14369 53086420315 10 -6281 -1 286879 77242 44 1 0 0 19217 32962 53085993024 8 -57424 -1 453779 13263 118 1 0 0 -1 44013 53086368646 10 -6348 -1 1209278 98771 -1 1 0 0 -1 9021 53078141801 42 -43925 -1 1209279 267164 34 1 0 0 -1 1490 53086272483 22 -5555 291 1044186 90166 152 0 0 0 11228 5806 53086459792 6 -31743 -1 1209280 16667 46 1 0 0 12 44014 53084949103 26 -20569 129 8637 8679 15 0 0 0 2121 34649 53086436720 10 -44015 -1 1209281 25019 153 1 0 0 1770 1921 53086018645 6 -11367 29 32779 1015 35 0 0 0 724 15067 53086415134 5 -44015 177 1072822 103373 64 0 0 0 -1 1921 53085516281 21 -57425 166 1209282 127296 4 0 1 0 -1 44015 53086084217 10 -2644 -1 1209283 456251 154 1 0 0 -1 24297 53084004110 10 -30931 129 1209284 70116 35 0 1 0 1719 725 53086035775 9 -4878 242 1025856 1849 85 0 0 0 1035 3038 53085488449 20 -9598 -1 1209285 176223 23 1 0 0 312 3987 53081125856 10 -43762 -1 1209286 5652 32 1 0 0 834 683 53086085405 10 -7678 -1 1209287 189135 7 2 0 0 110 306 53086110331 10 -57426 25 966400 32876 -1 0 0 0 -1 44016 53086091231 9 -2092 45 1209288 101979 4 0 0 0 -1 5922 53086457464 10 -6699 -1 1209289 94305 137 1 0 0 298 5717 53082791262 9 -3743 159 800130 20196 42 0 0 0 -1 14584 53085499923 9 -2019 106 1209290 900 0 0 0 0 -1 37121 53084802862 11 -17976 -1 660537 13961 24 1 0 0 -1 5767 53085601749 8 -2250 -1 1209291 267336 38 1 0 0 -1 6156 53058291105 7 -9047 52 26148 1430 29 0 1 0 1525 44017 53086171911 18 -33318 91 718666 140810 27 0 1 0 46 841 53085774929 42 -33729 7 573750 167549 85 0 1 0 -1 6638 53085155259 9 -4842 -1 653496 7245 4 1 1 0 -1 43158 53086104079 4 -20787 189 194134 9933 155 0 1 0 -1 42285 53086415753 7 -48784 83 1209292 51784 134 0 0 0 -1 20231 53085848555 9 -5517 20 72514 3549 52 0 1 0 -1 828 53086414858 10 -13171 118 302290 15626 156 0 0 0 -1 35824 53086038424 20 -49502 154 366642 98813 39 0 0 0 -1 22414 53085264824 12 -49203 170 57596 128171 42 0 0 0 -1 21510 53086011500 9 -11022 144 1209293 120824 68 0 1 0 10503 7891 53086424065 9 -47662 150 1209294 266206 74 3 0 0 -1 16501 53085199281 10 -13446 -1 632780 34340 0 2 0 0 -1 31183 53086343196 20 -10153 89 1209295 92764 85 0 0 0 -1 31140 53085432810 8 -21890 26 38815 2097 44 0 1 0 -1 9591 53086418088 9 -23615 166 1209296 202802 17 0 0 0 39138 42245 53084558517 20 -34398 116 277319 123194 1 0 0 0 3605 4950 53086083610 14 -39727 -1 533992 28924 113 1 1 0 8506 7506 53085835593 6 -35164 150 284645 34379 52 0 0 0 5866 24579 53086330078 9 -53164 185 1209297 22618 68 0 0 0 -1 35159 53086017683 20 -53211 -1 1209298 6210 4 1 0 0 13655 31974 53086329526 20 -18179 304 118269 2589 7 0 1 0 -1 10068 53086247022 2 -8439 98 9635 297 157 0 0 0 -1 12773 53086336481 18 -3218 133 3985 47023 158 0 1 1 -1 24017 53086416149 7 -57427 123 1209299 456252 159 0 0 0 -1 44018 53086468209 21 -985 10 1209300 92339 6 0 0 0 82 147 53085562522 21 -16888 45 1209301 456253 160 0 0 0 312 17884 53086425402 21 -11410 185 1209302 456254 161 3 0 0 -1 6100 53084215934 10 -17404 6 1209303 4562 9 0 1 0 -1 19947 53086205945 10 -15144 125 629875 15298 -1 0 1 0 -1 11832 53085909148 9 -31195 77 461724 39401 120 0 0 0 272 1693 53085652257 6 -17801 -1 119140 7665 44 1 0 0 -1 7692 53085908018 7 -36342 217 1209304 219153 80 0 0 0 43 751 53084031977 9 -57428 71 1209305 454555 33 0 1 0 -1 44019 53084036966 4 -33790 -1 1209306 51601 -1 1 0 0 -1 44020 53076834356 10 -32640 -1 1209307 14617 159 1 0 0 -1 19226 53086269390 10 -16313 31 102127 36013 162 0 1 0 1588 44021 53086332975 10 -57429 217 176324 19289 63 0 1 0 -1 44022 53086373501 4 -3609 34 4437 12848 119 0 1 0 -1 3730 53086360896 10 -6219 45 53218 9595 29 0 0 0 2234 28948 53084824784 9 -15626 175 1209308 124904 32 0 1 0 -1 6483 53086436540 10 -22493 -1 1209309 256140 55 1 0 0 -1 26677 53083308576 9 -30995 -1 1209310 25350 133 1 0 0 -1 1293 53085672905 10 -35173 21 1209311 456255 163 0 0 0 -1 21299 53086392342 9 -17694 261 52417 7721 35 0 1 0 7 44023 53085837365 10 -34846 68 30361 266 151 0 1 0 -1 6430 53085746566 7 -20098 31 93301 2581 88 0 1 0 -1 23599 53085499299 10 -34317 97 547 14869 106 0 0 0 -1 44024 53084784807 24 -2045 175 1209312 126650 28 0 0 0 -1 1869 53086348275 10 -1528 136 1209313 39925 23 0 1 0 -1 44025 53086421433 10 -11080 109 1030427 105941 80 0 0 0 3887 5208 53084791499 6 -1775 28 1209314 13470 135 0 0 0 7915 30899 53086462152 7 -22324 337 273047 36168 164 0 0 0 -1 18353 53086379543 18 -27400 142 850731 108958 89 0 1 0 -1 27711 53084831045 9 -45596 63 228395 224852 84 0 1 0 -1 8740 53086293445 9 -6014 -1 1209315 204921 -1 1 0 0 -1 14505 53060981968 10 -7530 73 1209316 35817 113 0 0 0 237 2014 53086340022 6 -29509 -1 1209317 99427 146 1 1 1 -1 27227 53086376546 11 -3044 -1 1209318 291389 9 1 0 0 -1 6450 53077721936 11 -46016 138 861315 57985 44 0 0 0 -1 10431 53086377898 9 -12368 114 11961 27071 63 0 1 0 -1 3118 53086382698 8 -1754 153 62718 2474 7 0 1 0 -1 7177 53084610071 10 -11356 71 34074 16382 69 0 0 0 863 2088 53086265255 10 -28543 25 1209319 136378 44 0 1 0 -1 6304 53086436917 10 -12862 138 1209320 133071 80 0 1 0 -1 3194 53086101577 9 -44160 224 1209321 456256 34 0 1 0 -1 2593 53084479155 10 -36131 258 10820 61705 147 0 0 0 9563 20010 53086303152 18 -36957 106 648393 159854 82 0 1 0 -1 44026 53084795011 9 -44020 -1 531578 5531 4 1 1 0 4556 1937 53086463430 10 -14020 -1 1209322 118795 42 1 1 0 -1 8947 53086250268 10 -30934 -1 1209323 85686 95 1 0 0 -1 12465 53086358390 10 -44946 -1 1209324 5968 66 1 0 0 1089 6050 53085905987 10 -22218 19 86098 10542 85 0 0 0 -1 7354 53085752011 21 -34392 155 1209325 320270 165 0 0 0 -1 37493 53085853387 10 -6195 167 1209326 9641 85 0 1 0 16396 44027 53086420980 10 -8992 -1 1209327 102617 166 1 0 0 15137 36546 53084811735 7 -36165 55 704966 18494 87 0 0 0 3240 17351 53086100376 20 -44922 -1 124183 87707 33 1 0 0 -1 5952 53084958032 10 -5758 91 1209328 61871 24 0 0 0 7049 30460 53086425997 10 -12028 -1 1209329 47049 33 2 0 0 327 8118 53086377785 10 -5151 -1 1209330 456257 17 1 0 0 -1 35110 53086384107 8 -57430 114 30869 8772 70 0 0 0 -1 44028 53086371364 9 -47611 182 34877 180671 52 0 0 0 -1 16319 53086355829 10 -9610 56 89833 35730 149 0 1 0 1455 5430 53086263549 10 -57431 134 1209331 247928 1 0 0 0 35 44029 53086369591 10 -38028 99 1209332 633 44 0 1 0 -1 9738 53085740319 10 -15151 18 1209333 133863 20 0 0 0 5613 44030 53086444143 14 -14917 335 1209334 93563 50 0 1 0 13814 33939 53086450293 10 -47053 271 1209335 456258 34 0 0 0 35 14361 53086444708 10 -3543 103 1876 10198 151 0 0 0 -1 29695 53086381604 18 -33664 21 1209336 64383 6 0 0 0 -1 37606 53084373165 16 -19471 -1 1209337 36857 -1 1 0 0 -1 42073 53060360961 18 -44372 15 1209338 456259 35 0 0 0 280 3568 53086446517 9 -11053 31 1209339 209247 34 0 0 0 33 41078 53084440099 18 -7946 77 1209340 13632 72 0 0 0 1532 38365 53084058969 10 -52817 -1 1209341 30554 52 1 0 0 -1 44031 53086126702 26 -57432 -1 1194338 38268 89 1 0 0 -1 44032 53085678659 10 -38448 171 60256 2465 135 0 0 0 208 20893 53086449493 9 -34722 57 24426 31126 20 0 1 0 -1 25975 53085125318 10 -16141 29 524494 348968 13 0 0 0 2578 1593 53086429721 7 -52870 129 37311 18166 7 0 0 0 -1 44033 53085324168 33 -35319 72 12290 130255 74 0 1 0 -1 1516 53086377971 10 -7414 26 1209342 121019 23 0 1 0 57 44034 53084049005 9 -12637 265 1123678 140911 167 0 0 0 -1 27794 53085428965 10 -4533 -1 386575 9927 84 1 0 0 3338 17066 53084708546 9 -32738 -1 1209343 449557 0 2 0 0 4102 32343 53086423930 16 -43887 21 570895 1481 44 0 1 0 -1 1315 53085895075 10 -52930 -1 1209344 8898 -1 1 0 0 -1 30583 53070013158 9 -57433 218 1209345 154921 44 0 1 0 -1 41405 53085396178 8 -3229 60 847161 187849 104 0 1 0 -1 12418 53086378649 16 -2414 68 15059 1979 156 0 0 0 -1 35496 53085551127 27 -8101 -1 1209346 7177 23 1 0 0 1568 15856 53086013476 10 -31923 27 751941 19627 168 0 0 0 1283 16340 53086336124 10 -40200 1 50443 19811 89 0 0 0 -1 44035 53085308569 10 -26272 15 1209271 288116 35 0 0 0 1031 37106 53086460766 21 -7655 31 600275 28402 44 0 0 0 3176 5381 53086423642 10 -5975 123 410712 3185 13 0 1 0 172 30760 53086332960 21 -11401 29 374907 4353 13 3 1 0 -1 245 53086422657 7 -8863 -1 1209347 21242 23 1 0 0 -1 6143 53083506787 10 -34651 -1 1209348 35160 33 1 0 0 909 702 53083781795 8 -47953 100 502585 27495 89 0 1 0 237 17513 53085907318 10 -57434 76 3762 6263 169 0 0 0 -1 39716 53086372238 7 -57435 225 785901 204893 85 0 1 0 -1 44036 53084606840 9 -34770 6 4474 29502 4 0 1 0 -1 27553 53085654373 39 -8220 319 582813 186881 30 0 1 0 284 6553 53085918233 14 -2123 65 117920 18942 5 0 1 0 -1 7249 53085241804 7 -1391 157 1209349 177705 42 0 0 0 4238 30592 53085660740 7 -46155 315 1209350 456260 85 0 1 0 -1 10954 53086344104 7 -13056 236 6768 71154 148 0 1 1 -1 44037 53086271031 10 -17556 140 1209351 45571 22 0 0 0 -1 2976 53084099083 10 -46654 73 1209352 215313 73 0 0 0 2642 12870 53085739792 9 -23709 6 8364 19043 170 0 1 0 -1 21388 53085383838 38 -27911 172 951317 64806 171 0 1 0 -1 16402 53085837888 10 -34182 235 1209353 2174 7 0 0 0 -1 1273 53083933126 9 -777 99 70275 57073 151 0 1 0 -1 11162 53085835198 9 -48034 70 13383 7857 78 0 0 0 -1 17745 53086107958 10 -37739 -1 65235 11490 134 1 0 0 -1 4332 53086276235 10 -22031 343 607250 85558 122 0 0 0 -1 24292 53085665030 6 -19275 56 427959 42832 159 0 1 0 468 27531 53086276432 9 -425 151 89642 25000 127 0 0 0 -1 39520 53086120689 20 -35830 109 223961 66792 36 0 1 0 -1 44038 53085586892 3 -43996 -1 1209354 456261 54 1 0 0 -1 1818 53082241016 10 -1249 328 4129 19908 82 0 1 0 4200 14274 53086201539 10 -53167 40 24426 31126 20 0 0 0 -1 44039 53085125318 10 -27297 340 1209355 244 29 0 1 0 -1 43945 53085080311 10 -2031 -1 57915 1518 103 1 0 0 1522 1894 53085852063 22 -57436 -1 1209356 407979 114 1 0 0 -1 31306 53086438187 9 -9512 -1 1209357 456262 59 1 0 0 22 30797 53085896052 8 -54847 91 1209358 324064 64 0 0 0 199 35597 53086459510 7 -9113 7 1209359 107478 47 0 0 0 -1 12588 53085836708 9 -46873 179 623689 47351 35 0 0 0 811 13637 53086443261 42 -13864 -1 1209360 196143 96 1 0 0 -1 31897 53084546317 9 -47752 57 62966 4998 85 0 1 0 -1 16792 53085506408 10 -34357 210 416756 208778 7 0 0 0 595 677 53086073700 11 -6794 -1 1209361 119867 152 1 0 0 6859 24565 53086041040 7 -25729 187 1209362 456263 92 0 0 0 -1 37317 53085694881 9 -4321 12 643843 132498 74 0 0 0 -1 6620 53086445901 9 -8979 150 1209363 269740 93 0 1 0 296 11131 53085163549 10 -42826 233 1209364 456264 68 0 0 0 2711 22240 53086470810 10 -2258 134 563499 14401 78 0 1 0 -1 6251 53086346212 16 -14016 71 505407 26178 15 0 1 0 1528 2933 53086370952 7 -43924 70 1046617 43201 140 0 0 0 3887 1487 53085818522 21 -35198 69 923305 20426 3 0 0 0 1098 44040 53086425653 10 -5798 129 71064 21744 27 0 0 0 -1 33618 53085233067 2 -12484 169 1209365 94932 172 0 0 0 4998 7477 53086265639 7 -57437 59 776936 165620 133 0 0 0 -1 44041 53086453741 10 -2085 29 412302 136293 170 0 0 0 280 4983 53085747688 9 -50729 180 162156 11980 27 0 0 0 12270 25718 53085152640 9 -54922 139 71475 59442 35 0 1 0 3349 44042 53086447471 10 -3318 47 27110 2635 6 0 0 0 -1 6716 53086415115 18 -4966 190 1209366 25005 10 0 1 0 1548 34803 53086256253 10 -41018 274 1209367 248046 118 0 0 0 586 3018 53086154827 10 -19848 55 309178 106983 143 0 1 0 -1 44043 53085772953 9 -33070 18 116750 5102 70 0 1 0 -1 4561 53085986193 10 -12747 196 125790 48628 127 0 0 0 1705 571 53085859203 6 -26694 -1 1209368 106602 173 1 1 0 -1 44044 53084663898 10 -14917 335 1209369 456265 174 0 0 0 4016 33939 53086343363 10 -31936 133 1209102 37442 6 0 1 0 762 4093 53086356318 19 -626 175 206422 100857 32 0 0 0 944 578 53086374885 9 -1775 28 184617 3386 101 0 1 0 3296 30899 53085400320 10 -51106 155 3679 40854 64 0 0 0 -1 26688 53086114331 9 -18218 106 1209370 109520 47 0 1 0 -1 4271 53086361478 10 -1789 134 1209371 70238 31 0 0 0 39138 21516 53086100342 10 -34793 21 1209372 89255 14 0 0 0 -1 6672 53084792280 9 -57438 -1 1209373 45072 70 1 0 0 -1 37618 53085741119 7 -44736 148 578591 2218 6 0 1 0 -1 5204 53086326558 9 -48213 14 18483 57891 31 0 0 0 -1 18310 53086307935 38 -52622 -1 1209374 78028 135 1 0 0 -1 30084 53085490153 10 -7838 -1 1209375 62468 10 1 0 0 1917 7483 53083790953 10 -57439 92 1209376 456266 7 0 0 0 -1 44045 53086449335 24 -30928 30 635107 32806 71 0 1 0 649 34737 53085422653 10 -12871 210 1058207 52058 35 0 0 0 -1 14134 53086198009 10 -29445 83 1209377 14537 172 0 1 0 -1 44046 53086272167 10 -19287 274 1209378 84914 23 0 1 0 -1 35997 53086437639 10 -11262 105 1209379 88368 88 0 1 0 272 44047 53084643988 6 -32398 116 1209380 456267 25 0 0 0 342 231 53085257783 9 -55836 91 9392 14327 39 0 1 0 -1 33478 53086353626 10 -23647 -1 1209381 76231 4 1 0 0 -1 923 53085252027 9 -2102 25 472014 6344 175 0 0 0 -1 5462 53086419257 10 -9208 -1 1209382 12718 -1 1 0 0 -1 19610 53071237795 10 -31364 335 1209383 6099 46 0 1 0 -1 44048 53086179673 9 -31037 317 7585 43365 35 0 0 0 -1 12371 53086439000 20 -9994 16 307411 290635 35 0 0 0 550 11794 53086424944 10 -17365 99 28335 32396 23 0 1 0 -1 44049 53086266890 10 -15067 225 1209384 16575 162 0 0 0 307 9127 53086468766 9 -20723 272 1209385 79008 31 0 1 0 -1 8266 53086015674 7 -32775 115 1209386 143408 28 0 0 0 -1 44050 53085300815 21 -42384 -1 1209387 5668 -1 1 1 0 -1 44051 53055849125 3 -4533 138 60281 2542 136 0 0 0 -1 17066 53086090800 24 -19065 15 31236 1956 68 0 0 0 -1 12938 53085858393 10 -19499 101 199901 73569 133 0 0 0 -1 23877 53084771534 9 -30729 137 1209388 3889 12 0 0 1 -1 14808 53085471904 9 -31837 108 750117 8782 17 0 0 0 12802 15492 53085208553 10 -12125 84 23090 60697 31 0 1 0 1270 2612 53085415597 11 -54922 83 968506 28232 73 0 0 0 -1 44042 53086368206 11 -6635 96 215812 49835 137 0 0 0 1033 567 53085778100 7 -49255 143 1209389 8130 159 0 0 0 -1 21682 53086298887 9 -1218 83 1209390 40809 39 0 1 0 -1 44052 53086303117 9 -1775 28 301403 44233 176 0 1 0 -1 30899 53086010336 10 -36105 315 1209391 456268 2 0 1 0 298 38662 53085493004 9 -647 -1 212199 286 32 2 0 0 -1 5444 53086350863 10 -19106 -1 1209392 75256 64 1 0 0 -1 6116 53086205060 9 -1978 21 287768 50266 8 0 0 0 -1 32762 53086446588 11 -13574 -1 1209393 167773 33 2 1 1 -1 11752 53086427692 9 -57391 252 776590 63565 35 0 1 0 -1 43954 53086261284 10 -38830 41 922462 138593 34 0 0 0 1273 7141 53086335332 9 -30928 30 1209394 456269 9 0 0 0 -1 34737 53086362499 9 -12753 167 1209395 91389 61 0 1 0 -1 11354 53086384603 9 -42526 49 3108 1395 79 0 0 0 -1 44053 53086113483 7 -7661 57 428746 254584 27 0 0 0 1731 44054 53085248033 10 -21624 52 1209396 39066 166 0 1 0 -1 36739 53084342763 9 -57440 14 337334 88583 177 0 0 0 100 44055 53084815045 8 -1365 24 1209397 3381 113 0 0 0 -1 18304 53086356080 20 -80 77 1209398 456270 58 3 0 0 110 911 53086446912 21 -18841 97 1209399 456271 20 0 0 0 43 44056 53086439064 9 -32036 26 1209400 456272 63 3 0 0 -1 9514 53086469429 9 -32568 -1 1209401 32294 6 1 1 0 -1 21635 53084290196 10 -22844 -1 1209402 12802 19 1 1 0 -1 27448 53086452714 10 -38500 160 1209403 208618 75 3 0 0 3618 29488 53085128111 21 -31273 -1 1209404 63604 29 1 0 0 307 9157 53083482331 10 -2019 106 247632 2892 123 0 1 0 -1 37121 53086367808 7 -10864 299 291769 80265 36 0 1 0 -1 6388 53085389657 10 -42720 256 1096011 7390 22 0 0 0 -1 1449 53084879625 5 -21369 13 652088 122701 140 0 1 0 -1 19027 53086365579 14 -24798 5 1209405 409220 178 0 1 0 -1 25775 53086334056 11 -49011 8 1209406 33843 116 0 1 0 -1 20926 53086369811 11 -20705 45 47309 4986 41 0 0 0 -1 17161 53086282125 4 -1312 6 629875 15298 42 0 0 0 -1 3962 53085909148 9 -31592 89 1209407 23327 6 0 0 0 -1 152 53086431091 9 -53006 113 196989 456273 42 0 0 0 25 34626 53086263205 6 -45282 199 1040419 201862 70 0 0 0 -1 7409 53086088571 9 -44935 138 456399 62422 41 0 1 0 -1 5988 53086343663 2 -31634 140 1209408 42712 9 0 1 0 5735 36610 53086116637 9 -5485 83 74911 14829 15 0 0 0 -1 7969 53085559541 9 -2517 -1 1209409 28180 0 1 0 0 -1 17998 53086006038 10 -45018 -1 237328 5756 179 1 0 0 -1 6337 53085468650 3 -39485 134 1209410 456274 44 0 1 0 46817 7480 53084601824 41 -3697 30 294287 1487 -1 0 0 0 -1 8636 53086432193 9 -2011 17 1209411 28763 167 0 0 0 43 34361 53084297498 7 -14785 239 452650 44581 180 0 0 0 -1 13549 53086330662 8 -38548 47 1209412 447440 118 0 0 0 -1 528 53086452581 10 -5593 73 1209413 19724 27 0 1 0 571 20240 53086416840 9 -13446 -1 1209414 58415 80 1 1 0 -1 31183 53085342556 10 -56696 57 1209415 10627 69 4 0 0 -1 34746 53085664327 9 -19390 61 188773 218620 47 0 0 0 62 8903 53086459299 10 -1434 -1 1062588 3181 27 1 0 0 -1 6174 53080722213 9 -594 -1 1209416 8512 181 1 0 0 -1 30577 53083667505 10 -16603 35 337256 5200 182 0 0 0 -1 7967 53086382006 21 -1010 -1 1209417 123893 183 1 0 0 -1 31262 53086076148 10 -2438 29 77902 10156 33 0 1 0 3077 6838 53086440674 4 -18577 47 1209418 193190 80 0 0 0 -1 44057 53086139279 10 -50128 340 108412 9803 31 0 0 0 10290 24158 53084339396 10 -7742 -1 1209419 10770 64 1 1 0 -1 3405 53086106871 9 -5687 -1 1209420 1298 184 1 0 0 97 2614 53085058700 10 -1789 134 1209421 22364 85 0 1 0 -1 21516 53086461216 10 -2897 35 687693 123242 44 0 0 0 -1 17504 53084558951 10 -47670 -1 1209422 423756 66 2 0 0 16712 16522 53086436532 9 -51384 78 1209423 315742 52 0 1 0 -1 27371 53085527503 10 -31549 258 1209424 62106 137 0 0 0 -1 9790 53086460133 9 -31419 -1 1209425 633 44 1 0 0 422 20312 53085475408 13 -8492 -1 525550 247228 39 1 0 0 -1 498 53085506870 9 -57441 -1 1209426 9443 1 1 0 0 -1 44058 53083399810 10 -20852 -1 1209427 36389 125 1 0 0 -1 1097 53085425555 10 -3207 19 1209428 11987 137 0 0 0 59 30580 53086439316 10 -14829 253 188983 56353 33 0 1 0 -1 9791 53086345485 4 -31097 144 16615 11947 133 0 0 0 -1 34702 53086291770 10 -1514 -1 1209429 27816 -1 1 0 0 -1 12960 53081783582 10 -6756 16 182372 146825 54 0 0 0 3146 41922 53086263069 10 -34245 114 8637 8679 15 0 0 0 2121 5325 53086436720 10 -57442 129 840935 133609 85 0 1 0 9680 44059 53085682272 5 -20781 271 626395 16190 144 0 1 0 1348 7821 53085210580 10 -57443 -1 1209430 10433 185 1 1 0 216 44060 53082870030 10 -16703 167 71277 6969 3 0 1 0 2438 5518 53085304024 8 -22709 24 1209431 155935 85 0 0 0 -1 2237 53086425906 10 -32562 156 1209432 23293 186 0 0 0 1866 25093 53086423410 42 -35065 115 1209433 377867 187 0 1 0 -1 31413 53085859250 10 -30691 221 1209434 88230 -1 0 0 0 -1 228 53084110855 10 -34689 100 649949 273510 86 0 0 0 202 41375 53085843068 10 -30906 100 773087 3242 52 0 0 0 36 31605 53086437860 7 -24714 28 1209435 402771 188 0 1 0 930 44061 53085636881 10 -14763 -1 1209436 38473 85 1 0 0 280 7445 53085228070 9 -28664 19 187548 7514 32 0 1 0 20 41854 53086416011 19 -36484 99 309958 55783 189 0 0 0 -1 43600 53085921061 20 -47871 134 866390 339673 38 0 0 0 -1 17199 53085872715 9 -11154 30 1209437 214626 160 0 1 0 -1 9994 53086434859 10 -10943 -1 1209438 332820 74 1 0 0 1144 38783 53085594880 10 -10087 -1 1209439 75256 64 1 1 0 -1 38827 53086461012 10 -18177 14 401881 13098 41 0 0 0 -1 18097 53085926453 10 -18252 66 439357 90951 34 0 0 0 -1 6325 53085946084 2 -27297 340 1209440 15169 52 0 1 0 20485 43945 53086027949 9 -902 6 424370 130673 4 0 0 0 -1 4625 53085503854 9 -21138 -1 235217 1480 96 1 0 0 -1 15720 53082814398 10 -31852 33 44819 13176 168 0 0 0 2561 29629 53086351530 10 -48446 72 1619 8904 64 0 0 0 -1 19089 53086270835 41 -47243 292 243388 28109 43 0 0 0 -1 15024 53086084799 5 -3511 25 1103526 33440 25 0 0 0 -1 8703 53085343041 7 -6315 91 954795 3393 10 0 1 0 -1 1514 53084876399 10 -39763 293 1209441 24580 78 0 1 0 -1 26367 53085308249 9 -9927 -1 1209442 48742 140 1 0 0 -1 668 53086036765 9 -5023 180 1209443 232757 12 0 0 0 78 2067 53085777135 9 -33724 32 1209444 6619 102 0 0 0 522 30840 53086412661 9 -31859 109 485176 225954 44 0 0 0 1635 38443 53085432204 4 -37521 81 39191 26108 85 0 1 0 -1 254 53086390926 37 -3443 249 1209445 56970 61 0 0 0 -1 9803 53085992324 8 -57444 82 1042496 93588 190 0 1 0 989 30412 53086352968 21 -25389 174 11892 20841 9 0 1 0 -1 12738 53086391363 5 -38816 18 503663 14377 39 0 1 0 -1 44062 53086181800 9 -45662 -1 1209446 118701 4 1 0 0 -1 8970 53086236937 9 -40328 240 1209447 55477 191 0 0 0 708 44063 53084902849 9 -32141 180 1209448 217537 29 0 0 0 -1 7493 53085578570 8 -32293 224 1209449 330513 168 0 0 0 36 16345 53085147928 7 -26690 252 663615 23861 91 0 0 0 -1 7886 53086453209 9 -35705 224 121306 270 28 0 1 0 613 35289 53085818693 9 -25402 91 1297 4895 143 0 1 0 -1 41791 53086385592 9 -8366 273 1209428 11987 137 0 0 0 59 2116 53086439316 10 -848 293 1209450 29792 0 0 1 0 -1 19074 53085510705 3 -31901 -1 1209451 189420 170 2 0 0 3560 694 53086424349 9 -57445 186 86854 9031 192 0 1 0 -1 44064 53085404711 9 -17246 195 209849 8208 20 0 1 0 7593 8547 53086428489 9 -31329 54 1209245 1237 10 0 0 0 -1 2383 53086425618 15 -21061 -1 1209452 13059 64 1 0 0 -1 44065 53086346530 9 -28823 287 1170812 630 73 0 0 0 75 41134 53086433672 10 -57446 129 1209453 162736 3 0 1 0 -1 44066 53083935326 10 -53998 -1 1209454 80306 8 1 0 0 67920 33893 53083136790 20 -3293 44 384005 990 11 0 0 0 -1 44067 53086449280 10 -19804 5 376823 6185 89 0 0 0 13790 6658 53086461597 5 -3049 147 197124 16588 146 0 0 0 3991 15610 53086353913 10 -1330 123 1209455 114341 27 0 1 1 36077 1564 53085582947 21 -12440 94 1209456 102761 111 0 1 0 6156 3191 53086417924 10 -31812 117 777418 53925 193 0 0 0 3890 12831 53086433620 10 -12017 -1 1209457 21364 194 1 0 0 -1 44068 53086364961 20 -13068 151 155888 155421 23 0 1 0 43 3325 53085765249 7 -19734 -1 1209458 19691 -1 1 1 0 -1 13188 53074671152 20 -47740 31 1136191 190289 34 0 0 0 -1 16757 53085478636 10 -7036 -1 1209459 217936 -1 1 0 0 -1 10474 53080052286 21 -53786 8 1209460 124495 23 0 0 0 -1 44069 53085095927 10 -20326 81 65747 6627 195 0 0 0 -1 44070 53085970478 21 -17311 102 1110195 52656 64 0 1 0 -1 17020 53086456128 10 -2623 -1 1209461 134931 196 1 0 0 -1 620 53085381994 9 -31733 151 1209462 224995 -1 0 0 0 -1 2366 53086356595 10 -34040 33 7294 9260 35 0 1 0 -1 38168 53085060103 10 -4814 95 1209463 143822 9 0 1 0 4325 1303 53086203312 21 -825 -1 1209464 67677 87 1 0 0 7097 30416 53086272102 21 -24173 119 1209465 91555 80 0 0 0 -1 44071 53086454386 21 -54463 67 22348 63412 88 0 0 0 -1 44072 53086173646 7 -37944 90 1209466 37070 24 0 1 0 1318 15692 53086424568 20 -3893 115 1209467 14748 44 0 1 0 -1 6918 53086370458 10 -39165 156 1209468 6160 67 0 0 0 -1 44073 53085306480 10 -16384 171 309831 38638 137 0 0 0 8728 3893 53085221847 9 -10194 233 402256 70750 85 0 0 0 -1 9603 53084990495 8 -24385 -1 1209469 415992 8 1 0 0 -1 29287 53086409465 10 -32141 180 1209470 456275 112 0 0 0 25 7493 53086420014 10 -46654 73 79505 6443 39 0 0 0 416 12870 53086447179 11 -48872 -1 1209471 143 74 1 0 0 -1 20498 53086190882 20 -3851 54 1209472 54584 197 0 0 0 222 34862 53086449220 10 -16642 30 1209473 21168 3 0 0 0 1692 33912 53084085100 10 -57447 217 868717 213177 88 0 1 0 16814 33754 53086253173 10 -37650 51 288580 3310 177 0 0 0 -1 18942 53086433092 9 -670 -1 571891 16897 7 1 1 0 -1 44074 53086451941 9 -16698 -1 1209474 456276 83 1 0 1 1590 39965 53084815349 9 -8255 89 1209475 51415 22 0 1 0 -1 5807 53085049022 10 -72 51 1196155 13315 29 0 1 0 3565 1087 53086433711 4 -48647 159 137161 59611 114 0 1 0 11588 19767 53084540124 10 -57448 66 1209476 224774 35 0 0 0 317 34873 53086433953 10 -22835 106 686629 67037 64 0 0 0 -1 30409 53085752685 10 -2327 8 53968 5312 35 0 1 0 -1 32615 53085730895 9 -5045 100 340148 4866 108 0 1 0 273 7220 53086335739 10 -18658 45 215302 900 0 0 0 0 -1 19487 53085418824 10 -24993 109 1209477 116919 5 0 1 0 12 13470 53085684437 21 -57449 214 8317 7935 79 0 0 0 -1 44075 53085912160 9 -6055 217 68275 33192 103 0 0 0 -1 38530 53086282873 21 -57450 48 157990 546 135 0 0 0 -1 44076 53085865033 10 -57451 129 176945 27406 28 0 0 0 -1 44077 53085395234 10 -8541 12 1209478 31095 42 0 1 0 -1 12080 53086436156 10 -3406 -1 1209479 46849 68 2 0 0 -1 19356 53086375995 2 -5798 129 493064 41821 94 0 0 0 595 33618 53086212382 19 -21624 52 94301 11708 22 0 1 0 5291 36739 53085832387 10 -2083 173 1209480 40611 122 0 0 0 -1 31475 53085078625 10 -57417 99 143241 13263 118 0 0 0 -1 43998 53086091383 9 -7918 207 12620 31965 42 0 1 0 -1 37035 53085818765 7 -10235 269 1209481 78850 96 0 1 0 -1 6199 53086431251 7 57452 297 1209482 2738 112 0 0 0 -1 44078 53084402300 10 12986 266 114237 6756 20 0 0 0 404 3438 53086373539 9 48307 115 1209483 456277 162 0 0 0 -1 18643 53084914127 4 From 40b7d4c75598bde704ea521bdc3c63a28fe730d4 Mon Sep 17 00:00:00 2001 From: 631763140 <631763140@qq.com> Date: Sat, 2 Jul 2022 17:02:32 +0800 Subject: [PATCH 35/47] byterec_sample.txt 200 --- examples/byterec_sample.txt | 304 ++++++++++++++++++------------------ 1 file changed, 152 insertions(+), 152 deletions(-) diff --git a/examples/byterec_sample.txt b/examples/byterec_sample.txt index 8fc06566..d27740ea 100644 --- a/examples/byterec_sample.txt +++ b/examples/byterec_sample.txt @@ -1,3 +1,155 @@ +37448 115 567569 44888 42 0 0 0 1699 43981 53085738314 9 +8623 82 1209192 10098 106 0 1 0 -1 11996 53086444998 8 +9629 31 1209193 184752 109 0 1 0 -1 32093 53085591140 5 +52799 175 1209194 109629 101 0 1 0 -1 33106 53085915481 6 +38008 -1 1209195 456237 11 1 0 1 56 18558 53085805030 9 +51750 154 234989 33229 9 0 1 0 -1 28234 53085437678 8 +57406 226 71963 34917 110 0 1 0 30276 36314 53086303187 28 +39056 59 1209207 456240 18 0 0 0 43 7471 53086422631 9 +37584 68 75987 1028 14 0 0 0 -1 19348 53086345061 18 +47304 41 16118 573 7 0 0 0 -1 15230 53085412854 11 +43834 100 353335 122030 115 0 0 0 315 1098 53086461802 8 +26244 -1 1209208 327068 86 1 0 0 -1 1623 53069870239 10 +34398 116 277319 123194 1 0 0 0 3605 4950 53086083610 14 +39727 -1 533992 28924 113 1 1 0 8506 7506 53085835593 6 +35164 150 284645 34379 52 0 0 0 5866 24579 53086330078 9 +53164 185 1209297 22618 68 0 0 0 -1 35159 53086017683 20 +53211 -1 1209298 6210 4 1 0 0 13655 31974 53086329526 20 +18179 304 118269 2589 7 0 1 0 -1 10068 53086247022 2 +8439 98 9635 297 157 0 0 0 -1 12773 53086336481 18 +3218 133 3985 47023 158 0 1 1 -1 24017 53086416149 7 +57427 123 1209299 456252 159 0 0 0 -1 44018 53086468209 21 +985 10 1209300 92339 6 0 0 0 82 147 53085562522 21 +16888 45 1209301 456253 160 0 0 0 312 17884 53086425402 21 +11410 185 1209302 456254 161 3 0 0 -1 6100 53084215934 10 +17404 6 1209303 4562 9 0 1 0 -1 19947 53086205945 10 +7838 -1 1209375 62468 10 1 0 0 1917 7483 53083790953 10 +57439 92 1209376 456266 7 0 0 0 -1 44045 53086449335 24 +30928 30 635107 32806 71 0 1 0 649 34737 53085422653 10 +12871 210 1058207 52058 35 0 0 0 -1 14134 53086198009 10 +29445 83 1209377 14537 172 0 1 0 -1 44046 53086272167 10 +19287 274 1209378 84914 23 0 1 0 -1 35997 53086437639 10 +11262 105 1209379 88368 88 0 1 0 272 44047 53084643988 6 +32398 116 1209380 456267 25 0 0 0 342 231 53085257783 9 +55836 91 9392 14327 39 0 1 0 -1 33478 53086353626 10 +23647 -1 1209381 76231 4 1 0 0 -1 923 53085252027 9 +2102 25 472014 6344 175 0 0 0 -1 5462 53086419257 10 +9208 -1 1209382 12718 -1 1 0 0 -1 19610 53071237795 10 +31364 335 1209383 6099 46 0 1 0 -1 44048 53086179673 9 +31037 317 7585 43365 35 0 0 0 -1 12371 53086439000 20 +9994 16 307411 290635 35 0 0 0 550 11794 53086424944 10 +17365 99 28335 32396 23 0 1 0 -1 44049 53086266890 10 +15067 225 1209384 16575 162 0 0 0 307 9127 53086468766 9 +20723 272 1209385 79008 31 0 1 0 -1 8266 53086015674 7 +32775 115 1209386 143408 28 0 0 0 -1 44050 53085300815 21 +42384 -1 1209387 5668 -1 1 1 0 -1 44051 53055849125 3 +4533 138 60281 2542 136 0 0 0 -1 17066 53086090800 24 +19065 15 31236 1956 68 0 0 0 -1 12938 53085858393 10 +19499 101 199901 73569 133 0 0 0 -1 23877 53084771534 9 +30729 137 1209388 3889 12 0 0 1 -1 14808 53085471904 9 +31837 108 750117 8782 17 0 0 0 12802 15492 53085208553 10 +12125 84 23090 60697 31 0 1 0 1270 2612 53085415597 11 +54922 83 968506 28232 73 0 0 0 -1 44042 53086368206 11 +6635 96 215812 49835 137 0 0 0 1033 567 53085778100 7 +49255 143 1209389 8130 159 0 0 0 -1 21682 53086298887 9 +1218 83 1209390 40809 39 0 1 0 -1 44052 53086303117 9 +1775 28 301403 44233 176 0 1 0 -1 30899 53086010336 10 +36105 315 1209391 456268 2 0 1 0 298 38662 53085493004 9 +647 -1 212199 286 32 2 0 0 -1 5444 53086350863 10 +19106 -1 1209392 75256 64 1 0 0 -1 6116 53086205060 9 +1978 21 287768 50266 8 0 0 0 -1 32762 53086446588 11 +13574 -1 1209393 167773 33 2 1 1 -1 11752 53086427692 9 +57391 252 776590 63565 35 0 1 0 -1 43954 53086261284 10 +38830 41 922462 138593 34 0 0 0 1273 7141 53086335332 9 +30928 30 1209394 456269 9 0 0 0 -1 34737 53086362499 9 +12753 167 1209395 91389 61 0 1 0 -1 11354 53086384603 9 +42526 49 3108 1395 79 0 0 0 -1 44053 53086113483 7 +7661 57 428746 254584 27 0 0 0 1731 44054 53085248033 10 +21624 52 1209396 39066 166 0 1 0 -1 36739 53084342763 9 +57440 14 337334 88583 177 0 0 0 100 44055 53084815045 8 +1365 24 1209397 3381 113 0 0 0 -1 18304 53086356080 20 +80 77 1209398 456270 58 3 0 0 110 911 53086446912 21 +18841 97 1209399 456271 20 0 0 0 43 44056 53086439064 9 +32036 26 1209400 456272 63 3 0 0 -1 9514 53086469429 9 +32568 -1 1209401 32294 6 1 1 0 -1 21635 53084290196 10 +22844 -1 1209402 12802 19 1 1 0 -1 27448 53086452714 10 +38500 160 1209403 208618 75 3 0 0 3618 29488 53085128111 21 +31273 -1 1209404 63604 29 1 0 0 307 9157 53083482331 10 +2019 106 247632 2892 123 0 1 0 -1 37121 53086367808 7 +10864 299 291769 80265 36 0 1 0 -1 6388 53085389657 10 +42720 256 1096011 7390 22 0 0 0 -1 1449 53084879625 5 +21369 13 652088 122701 140 0 1 0 -1 19027 53086365579 14 +24798 5 1209405 409220 178 0 1 0 -1 25775 53086334056 11 +49011 8 1209406 33843 116 0 1 0 -1 20926 53086369811 11 +20705 45 47309 4986 41 0 0 0 -1 17161 53086282125 4 +1312 6 629875 15298 42 0 0 0 -1 3962 53085909148 9 +31592 89 1209407 23327 6 0 0 0 -1 152 53086431091 9 +53006 113 196989 456273 42 0 0 0 25 34626 53086263205 6 +45282 199 1040419 201862 70 0 0 0 -1 7409 53086088571 9 +44935 138 456399 62422 41 0 1 0 -1 5988 53086343663 2 +31634 140 1209408 42712 9 0 1 0 5735 36610 53086116637 9 +5485 83 74911 14829 15 0 0 0 -1 7969 53085559541 9 +2517 -1 1209409 28180 0 1 0 0 -1 17998 53086006038 10 +45018 -1 237328 5756 179 1 0 0 -1 6337 53085468650 3 +39485 134 1209410 456274 44 0 1 0 46817 7480 53084601824 41 +3697 30 294287 1487 -1 0 0 0 -1 8636 53086432193 9 +31549 258 1209424 62106 137 0 0 0 -1 9790 53086460133 9 +31419 -1 1209425 633 44 1 0 0 422 20312 53085475408 13 +8492 -1 525550 247228 39 1 0 0 -1 498 53085506870 9 +57441 -1 1209426 9443 1 1 0 0 -1 44058 53083399810 10 +20852 -1 1209427 36389 125 1 0 0 -1 1097 53085425555 10 +3207 19 1209428 11987 137 0 0 0 59 30580 53086439316 10 +14829 253 188983 56353 33 0 1 0 -1 9791 53086345485 4 +31097 144 16615 11947 133 0 0 0 -1 34702 53086291770 10 +1514 -1 1209429 27816 -1 1 0 0 -1 12960 53081783582 10 +6756 16 182372 146825 54 0 0 0 3146 41922 53086263069 10 +34245 114 8637 8679 15 0 0 0 2121 5325 53086436720 10 +57442 129 840935 133609 85 0 1 0 9680 44059 53085682272 5 +20781 271 626395 16190 144 0 1 0 1348 7821 53085210580 10 +57443 -1 1209430 10433 185 1 1 0 216 44060 53082870030 10 +16703 167 71277 6969 3 0 1 0 2438 5518 53085304024 8 +22709 24 1209431 155935 85 0 0 0 -1 2237 53086425906 10 +32562 156 1209432 23293 186 0 0 0 1866 25093 53086423410 42 +35065 115 1209433 377867 187 0 1 0 -1 31413 53085859250 10 +30691 221 1209434 88230 -1 0 0 0 -1 228 53084110855 10 +34689 100 649949 273510 86 0 0 0 202 41375 53085843068 10 +30906 100 773087 3242 52 0 0 0 36 31605 53086437860 7 +24714 28 1209435 402771 188 0 1 0 930 44061 53085636881 10 +14763 -1 1209436 38473 85 1 0 0 280 7445 53085228070 9 +28664 19 187548 7514 32 0 1 0 20 41854 53086416011 19 +36484 99 309958 55783 189 0 0 0 -1 43600 53085921061 20 +10194 233 402256 70750 85 0 0 0 -1 9603 53084990495 8 +24385 -1 1209469 415992 8 1 0 0 -1 29287 53086409465 10 +32141 180 1209470 456275 112 0 0 0 25 7493 53086420014 10 +46654 73 79505 6443 39 0 0 0 416 12870 53086447179 11 +48872 -1 1209471 143 74 1 0 0 -1 20498 53086190882 20 +3851 54 1209472 54584 197 0 0 0 222 34862 53086449220 10 +16642 30 1209473 21168 3 0 0 0 1692 33912 53084085100 10 +57447 217 868717 213177 88 0 1 0 16814 33754 53086253173 10 +37650 51 288580 3310 177 0 0 0 -1 18942 53086433092 9 +670 -1 571891 16897 7 1 1 0 -1 44074 53086451941 9 +16698 -1 1209474 456276 83 1 0 1 1590 39965 53084815349 9 +8255 89 1209475 51415 22 0 1 0 -1 5807 53085049022 10 +72 51 1196155 13315 29 0 1 0 3565 1087 53086433711 4 +48647 159 137161 59611 114 0 1 0 11588 19767 53084540124 10 +57448 66 1209476 224774 35 0 0 0 317 34873 53086433953 10 +22835 106 686629 67037 64 0 0 0 -1 30409 53085752685 10 +2327 8 53968 5312 35 0 1 0 -1 32615 53085730895 9 +5045 100 340148 4866 108 0 1 0 273 7220 53086335739 10 +18658 45 215302 900 0 0 0 0 -1 19487 53085418824 10 +24993 109 1209477 116919 5 0 1 0 12 13470 53085684437 21 +57449 214 8317 7935 79 0 0 0 -1 44075 53085912160 9 +6055 217 68275 33192 103 0 0 0 -1 38530 53086282873 21 +57450 48 157990 546 135 0 0 0 -1 44076 53085865033 10 +57451 129 176945 27406 28 0 0 0 -1 44077 53085395234 10 +8541 12 1209478 31095 42 0 1 0 -1 12080 53086436156 10 +3406 -1 1209479 46849 68 2 0 0 -1 19356 53086375995 2 +5798 129 493064 41821 94 0 0 0 595 33618 53086212382 19 +21624 52 94301 11708 22 0 1 0 5291 36739 53085832387 10 +2083 173 1209480 40611 122 0 0 0 -1 31475 53085078625 10 +57417 99 143241 13263 118 0 0 0 -1 43998 53086091383 9 +7918 207 12620 31965 42 0 1 0 -1 37035 53085818765 7 +10235 269 1209481 78850 96 0 1 0 -1 6199 53086431251 7 57452 297 1209482 2738 112 0 0 0 -1 44078 53084402300 10 12986 266 114237 6756 20 0 0 0 404 3438 53086373539 9 48307 115 1209483 456277 162 0 0 0 -1 18643 53084914127 4 @@ -31,13 +183,6 @@ 14333 120 15924 2813 112 0 1 0 -1 1997 53086136768 9 2062 41 87999 313825 39 0 1 0 120 10512 53085654064 21 50351 70 1209497 456279 202 0 1 0 -1 24714 53086350722 4 -24444 193 295472 106181 17 0 1 0 1079 34768 53086420165 10 -36295 138 1209498 456280 68 0 0 0 -1 24340 53086466707 14 -17721 237 1209499 228348 128 0 1 0 512 9703 53086390167 7 -1993 300 883237 71621 9 0 1 0 -1 13315 53084710933 20 -19790 233 1209500 73465 80 0 1 0 2083 44082 53085223375 10 -33754 166 81719 16497 64 0 0 0 -1 6812 53086434268 9 -37469 15 1209501 126902 69 0 0 0 238 44083 53085212628 10 35535 81 1209502 456281 176 0 0 0 622 34148 53086446596 10 26225 6 801784 168777 203 0 1 0 3454 18863 53084813379 10 48951 293 39466 38503 83 0 1 0 12778 20749 53085121817 13 @@ -48,153 +193,8 @@ 7520 6 1209505 178973 103 0 0 0 282 33342 53086446872 10 26835 185 14168 5813 4 0 1 0 -1 21933 53086423678 6 53167 40 1209506 216910 2 0 1 0 -1 44039 53086366390 10 -2007 99 1209507 3659 96 0 0 0 -1 1483 53084349613 9 -17248 18 1209508 134823 113 0 0 0 60 35733 53086004346 10 -37930 -1 481970 7322 205 1 1 0 -1 14591 53086027942 5 -40568 24 596107 50797 79 0 0 0 -1 1588 53085672269 4 -8473 91 1209509 369882 32 0 0 0 110 5712 53086423972 7 -21459 215 1209510 456282 148 0 0 0 -1 42798 53086433277 10 -47048 -1 836027 77188 36 2 0 0 -1 14338 53086367225 10 -9207 205 456342 5312 35 0 0 0 -1 34601 53085557991 14 -37493 73 728135 34975 206 0 0 0 -1 43910 53084952618 4 -25649 46 177465 21451 207 0 0 0 -1 44084 53084631048 10 -40431 106 506714 116229 26 0 0 0 -1 28047 53084291960 10 -19497 178 1209511 29149 7 0 0 0 -1 10747 53086406595 7 -20096 219 1209512 456283 1 0 1 0 -1 747 53086398804 17 -21536 53 243616 4999 44 0 0 0 -1 7636 53084992630 10 -47839 45 1209513 97530 185 0 0 0 -1 17086 53085426055 10 -37126 76 211795 1902 71 0 1 0 1673 35827 53086393342 15 -38387 16 13771 3722 -1 0 1 0 -1 44085 53086025265 10 -57455 213 1209514 59854 32 0 0 0 3552 44086 53083904501 10 -2258 134 41946 1959 185 0 1 0 -1 6251 53086372491 23 -4380 92 1209515 195758 7 0 0 0 17265 3747 53086458955 10 -31401 -1 1209516 360569 -1 1 0 0 -1 10788 53081240669 10 -14388 75 1209517 456284 208 0 1 0 5283 2654 53086426412 6 -14195 31 1209518 47833 38 0 0 0 -1 18047 53086321557 9 -39374 46 1209519 317236 13 0 0 0 39193 8420 53086442309 9 -57456 325 183510 38435 20 0 1 0 448 39325 53086161593 21 -4878 242 1209520 142899 209 0 1 0 284 3038 53085848106 11 -20718 -1 253047 2948 33 1 1 0 -1 35314 53086336772 9 -269 284 105722 55981 137 0 1 0 -1 20132 53086433862 9 -40647 -1 286224 20211 1 1 0 0 -1 15006 53086057297 10 -16703 167 440111 56953 113 0 0 0 86 5518 53084733346 9 -56252 10 3613 477 182 0 1 0 -1 44087 53084989041 29 -35730 -1 380507 10881 210 1 0 0 3059 36559 53085761473 9 -57457 -1 1209521 53819 23 1 0 0 992 44088 53086237728 9 -3260 98 1209522 456285 186 0 0 0 199 6742 53084565302 4 -10955 99 9096 6801 196 0 1 0 -1 13237 53086430899 4 -35977 138 1209523 35842 94 0 1 0 13827 7329 53084184521 20 -53565 106 505990 242481 22 0 1 0 -1 36415 53086377316 10 -11634 6 9635 297 -1 0 0 0 -1 8900 53086336481 18 -3271 -1 492108 55954 1 1 0 0 2464 44089 53086209695 9 -1899 -1 1209524 165251 42 1 0 0 -1 33031 53086095468 19 -3697 30 879375 2305 85 0 0 0 4100 8636 53084623036 10 -32231 47 1209525 3041 70 0 1 0 4434 44090 53086436467 28 -57458 92 61284 11727 54 0 0 0 -1 44091 53085327820 10 -5490 -1 1209526 456286 144 1 0 0 66 1812 53086195262 37 -9784 248 618732 20681 64 0 1 0 -1 16339 53086441760 10 -11972 177 164776 2142 35 0 1 0 1578 1332 53086106977 8 -21303 116 34201 1781 69 0 1 0 110 31201 53085347805 10 -2215 47 1209527 456287 10 0 0 0 -1 11892 53086300491 9 -35119 51 1209528 25986 31 0 0 0 1115 15831 53086178005 9 -34622 6 561679 13733 96 0 1 0 -1 44092 53083874535 17 -1005 78 24974 3067 31 0 0 0 4181 3522 53085384335 9 -57459 159 1209529 307874 -1 0 1 0 -1 44093 53084113299 9 -7316 235 423720 53076 108 0 1 0 -1 17139 53085605673 7 -4725 81 541303 146860 169 0 0 0 -1 7003 53085561933 16 -15555 -1 1209530 342817 10 1 0 0 -1 10092 53084736864 9 -47018 136 13367 19736 115 0 0 0 -1 14204 53086350428 10 -6083 140 17375 66652 3 0 1 0 344 44094 53085226873 8 -566 120 77557 71429 69 0 1 0 27697 44095 53084429607 13 31106 59 954053 83106 39 0 0 0 -1 44096 53085930569 19 7359 -1 1209531 52228 33 1 0 0 3190 44097 53085811152 9 57460 91 36211 54195 135 0 1 1 1059 44098 53085060377 9 26948 360 1209532 80933 4 0 0 0 63 11424 53086463275 21 31412 -1 1209533 135891 128 1 0 0 -1 44099 53081206772 34 -6922 114 1209534 42790 211 0 0 0 108 44100 53083998180 12 -30812 206 716993 11378 47 0 1 0 -1 27523 53085864410 7 -31805 53 1209118 214956 7 0 0 0 -1 32405 53085854063 8 -26079 -1 1209535 456288 166 1 0 0 57 33156 53085079063 7 -30954 8 1209536 136410 24 0 1 0 -1 3465 53085242882 10 -14626 6 1209537 24246 4 3 0 0 -1 8298 53086257128 9 -11344 33 514110 14712 73 0 0 0 -1 10750 53084010396 9 -57461 109 175654 1166 212 0 0 0 -1 44101 53084547155 9 -4857 -1 1209538 6802 15 1 1 0 -1 1787 53085759761 2 -13145 -1 254842 85854 14 2 0 1 -1 4557 53086381621 10 -21988 66 411119 31019 160 0 0 0 4656 42031 53086242708 9 -1638 114 8387 9130 13 0 1 0 4305 32122 53086273887 21 -30726 -1 66757 7 47 1 0 0 -1 10040 53085129236 4 -57462 237 381442 41035 33 0 1 0 2189 42342 53086107703 10 -57463 103 102156 24317 103 0 0 0 -1 32275 53086003864 19 -54857 5 459904 221726 162 0 1 0 -1 44102 53086199649 10 -17391 111 1209539 456289 29 0 0 0 -1 36369 53086458792 5 -5856 140 1209540 21540 -1 0 0 0 -1 6453 53086333125 9 -57464 49 606517 777 6 0 0 0 -1 36805 53086436535 10 -57465 144 1209541 108241 29 0 0 0 -1 44103 53085851009 21 -57466 151 317108 50444 106 0 0 0 249 35893 53085837944 9 -3512 28 128269 7675 67 0 1 0 3206 32813 53086277061 10 -26091 66 1209542 43174 58 0 0 0 25 44104 53086074156 21 -7753 56 218665 19176 35 0 0 0 246 11343 53085840647 9 -8422 -1 1209543 45036 48 1 0 0 21821 6464 53083177545 10 -16610 18 1209544 97183 32 0 0 0 2746 37009 53086428577 10 -31457 -1 245685 103060 1 1 0 0 222 2765 53086048218 6 -2382 25 1209545 131739 -1 0 0 0 -1 44105 53086340925 21 -2678 70 1017950 36962 3 0 0 0 -1 2594 53086028403 14 -11139 70 16644 10730 4 0 1 0 -1 2279 53086192234 10 -20781 271 1058 5667 34 0 0 0 -1 7821 53085862851 28 -18611 36 275522 25017 33 0 0 0 -1 12623 53086203232 9 -14219 282 1209546 135181 12 0 1 0 -1 44106 53084830452 21 -43186 14 618737 13701 9 0 1 0 1335 436 53086182742 10 -22734 107 446922 54376 213 0 1 0 2463 2826 53085988318 10 -32720 14 505446 19356 35 0 1 0 799 44107 53085645344 42 -46127 -1 1209547 193057 4 1 0 0 68 10861 53086369705 9 -46619 176 1209548 195162 165 0 0 0 -1 12743 53084907302 10 -46628 27 87151 77505 46 0 0 0 -1 12781 53085158225 25 -50808 179 1209549 78032 78 0 1 0 67 25916 53085821995 10 -22835 106 187885 4661 61 0 0 0 -1 30409 53086367716 7 -1325 102 675398 6577 6 0 0 0 -1 4276 53086427432 25 -57467 -1 1209550 287239 76 1 1 0 -1 39647 53085905151 10 -1104 129 1209551 456290 4 0 1 0 -1 2513 53086380887 10 -20354 18 1209552 87962 32 0 0 0 -1 40679 53086446094 10 -31462 217 31172 16381 2 0 0 0 -1 44108 53085414582 10 -6817 -1 1209553 57196 214 1 0 0 6714 31851 53086281659 10 -6157 40 7403 78817 4 0 1 0 -1 22319 53086023808 40 -57468 99 8153 20030 4 0 0 0 -1 44109 53084541086 6 -30691 114 1209554 456291 17 0 0 0 33 228 53084207810 10 -20216 199 15366 12387 58 0 1 0 -1 38647 53085675276 7 -31092 30 1209555 456292 49 0 0 0 -1 43 53085999249 21 -2598 45 130496 26363 100 0 0 0 -1 12083 53086276418 2 -42962 -1 1209556 110525 -1 1 1 0 -1 34916 53065383090 10 -1583 140 1004716 85031 29 0 1 0 58 1758 53086439509 20 -11008 -1 1209557 4061 69 1 1 0 13844 15086 53083322931 10 -42290 199 1209558 5574 33 0 1 0 -1 3701 53084128388 10 -8012 14 127996 40830 32 0 0 0 789 11365 53085138946 16 -37134 66 1209559 262547 135 0 1 0 -1 21508 53086281633 10 -53945 38 1209560 114206 73 0 1 0 -1 44110 53083969850 12 -36068 73 9193 29781 89 0 0 0 2510 10762 53086292921 9 -19035 44 1209561 456293 94 0 1 0 -1 23839 53086114079 6 -30994 121 1209562 10965 11 0 0 0 3609 30952 53086372574 10 -57469 15 625994 11544 54 0 1 0 9793 44111 53086264675 9 -30811 56 1209563 456294 33 0 1 0 16591 6665 53086442666 10 -23081 125 312480 229544 7 0 0 0 651 31018 53085507249 9 -2340 19 1209564 14784 19 0 1 0 62 26869 53083940650 10 -32945 109 1209565 32496 215 0 0 0 780 33235 53085911191 10 -57470 138 98052 358 90 0 1 0 -1 31954 53085667166 5 -57471 113 1209566 456295 216 0 0 0 -1 44112 53083975964 9 -33105 144 1209567 315118 44 0 0 0 -1 36735 53086433489 10 -717 88 101803 76371 81 0 0 0 8939 1384 53086454343 6 -2172 10 96487 21039 47 0 1 0 -1 2701 53086344587 9 -2764 -1 1209568 66176 106 1 1 0 -1 149 53085830401 10 -374 99 1209569 67623 159 0 0 0 -1 28043 53084212815 5 -32444 82 1209570 55453 151 0 0 0 -1 32160 53086458804 4 -54312 6 1047735 7395 125 0 0 0 -1 30435 53086444230 10 -6140 217 1209571 2453 108 0 1 0 857 6243 53085911015 10 -14393 32 892726 3209 68 0 1 0 -1 8592 53086112512 9 -33257 16 1209572 23194 217 0 0 0 412 11055 53085659067 7 -51532 -1 23914 44588 33 1 0 0 -1 27743 53084631308 11 -4857 134 61949 232 64 0 0 0 -1 1787 53086458250 7 -16066 -1 1209573 70086 77 1 0 0 -1 37781 53085926437 3 -5507 -1 1209574 61849 -1 1 1 0 -1 10679 53081512342 6 -31950 -1 119340 5813 4 1 0 0 -1 31807 53085568351 7 -19221 66 1209575 105828 34 0 1 0 2543 3718 53086376083 36 -34227 110 658657 150414 94 0 0 0 -1 32005 53086081839 10 From 5e59953acad7b90aa33da3cc48324567970549f2 Mon Sep 17 00:00:00 2001 From: zanshuxun <631763140@qq.com> Date: Sun, 31 Jul 2022 19:06:44 +0800 Subject: [PATCH 36/47] multi_module_list --- deepctr_torch/models/multitask/ple.py | 59 +++++++++++++++++---------- 1 file changed, 38 insertions(+), 21 deletions(-) diff --git a/deepctr_torch/models/multitask/ple.py b/deepctr_torch/models/multitask/ple.py index 8087ad67..cc1d8996 100644 --- a/deepctr_torch/models/multitask/ple.py +++ b/deepctr_torch/models/multitask/ple.py @@ -69,33 +69,49 @@ def __init__(self, dnn_feature_columns, shared_expert_num=1, specific_expert_num self.gate_dnn_hidden_units = gate_dnn_hidden_units self.tower_dnn_hidden_units = tower_dnn_hidden_units - # 1. experts - # task-specific experts - self.specific_experts = nn.ModuleList( - [nn.ModuleList([nn.ModuleList([DNN(self.input_dim if level_num == 0 else expert_dnn_hidden_units[-1], - expert_dnn_hidden_units, activation=dnn_activation, + def multi_module_list(num_level, num_tasks, expert_num, inputs_dim_level0, inputs_dim_not_level0, hidden_units): + return nn.ModuleList( + [nn.ModuleList([nn.ModuleList([DNN(inputs_dim_level0 if level_num == 0 else inputs_dim_not_level0, + hidden_units, activation=dnn_activation, l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, init_std=init_std, device=device) for _ in - range(self.specific_expert_num)]) - for _ in range(self.num_tasks)]) for level_num in range(self.num_levels)]) + range(expert_num)]) + for _ in range(num_tasks)]) for level_num in range(num_level)]) + + # 1. experts + # task-specific experts + self.specific_experts = multi_module_list(self.num_levels, self.num_tasks, self.specific_expert_num, + self.input_dim, expert_dnn_hidden_units[-1], expert_dnn_hidden_units) + # self.specific_experts = nn.ModuleList( + # [nn.ModuleList([nn.ModuleList([DNN(self.input_dim if level_num == 0 else expert_dnn_hidden_units[-1], + # expert_dnn_hidden_units, activation=dnn_activation, + # l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, + # init_std=init_std, device=device) for _ in + # range(self.specific_expert_num)]) + # for _ in range(self.num_tasks)]) for level_num in range(self.num_levels)]) + # shared experts - self.shared_experts = nn.ModuleList( - [nn.ModuleList([DNN(self.input_dim if level_num == 0 else expert_dnn_hidden_units[-1], - expert_dnn_hidden_units, activation=dnn_activation, - l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, - init_std=init_std, device=device) for _ in range(self.shared_expert_num)]) - for level_num in range(self.num_levels)]) + self.shared_experts = multi_module_list(self.num_levels, 1, self.specific_expert_num, + self.input_dim, expert_dnn_hidden_units[-1], expert_dnn_hidden_units) + # self.shared_experts = nn.ModuleList( + # [nn.ModuleList([DNN(self.input_dim if level_num == 0 else expert_dnn_hidden_units[-1], + # expert_dnn_hidden_units, activation=dnn_activation, + # l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, + # init_std=init_std, device=device) for _ in range(self.shared_expert_num)]) + # for level_num in range(self.num_levels)]) # 2. gates # gates for task-specific experts specific_gate_output_dim = self.specific_expert_num + self.shared_expert_num if len(gate_dnn_hidden_units) > 0: - self.specific_gate_dnn = nn.ModuleList( - [nn.ModuleList([DNN(self.input_dim if level_num == 0 else expert_dnn_hidden_units[-1], - gate_dnn_hidden_units, activation=dnn_activation, - l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, - init_std=init_std, device=device) for _ in range(self.num_tasks)]) - for level_num in range(self.num_levels)]) + self.specific_gate_dnn = multi_module_list(self.num_levels, self.num_tasks, 1, + self.input_dim, expert_dnn_hidden_units[-1], gate_dnn_hidden_units) + # self.specific_gate_dnn = nn.ModuleList( + # [nn.ModuleList([DNN(self.input_dim if level_num == 0 else expert_dnn_hidden_units[-1], + # gate_dnn_hidden_units, activation=dnn_activation, + # l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, + # init_std=init_std, device=device) for _ in range(self.num_tasks)]) + # for level_num in range(self.num_levels)]) self.specific_gate_dnn_final_layer = nn.ModuleList( [nn.ModuleList([nn.Linear(gate_dnn_hidden_units[-1], specific_gate_output_dim, bias=False) for _ in range(self.num_tasks)]) for _ in range(self.num_levels)]) @@ -174,7 +190,7 @@ def cgc_net(self, inputs, level_num): # shared experts shared_expert_outputs = [] for k in range(self.shared_expert_num): - shared_expert_output = self.shared_experts[level_num][k](inputs[-1]) + shared_expert_output = self.shared_experts[level_num][0][k](inputs[-1]) shared_expert_outputs.append(shared_expert_output) # 2. gates @@ -188,7 +204,7 @@ def cgc_net(self, inputs, level_num): # gate dnn if len(self.gate_dnn_hidden_units) > 0: - gate_dnn_out = self.specific_gate_dnn[level_num][i](inputs[i]) + gate_dnn_out = self.specific_gate_dnn[level_num][i][0](inputs[i]) gate_dnn_out = self.specific_gate_dnn_final_layer[level_num][i](gate_dnn_out) else: gate_dnn_out = self.specific_gate_dnn_final_layer[level_num][i](inputs[i]) @@ -233,3 +249,4 @@ def forward(self, X): task_outs.append(output) task_outs = torch.cat(task_outs, -1) return task_outs + From 7dff848e490815281edfcdfc167bac8ec62ce395 Mon Sep 17 00:00:00 2001 From: zanshuxun <631763140@qq.com> Date: Sun, 31 Jul 2022 19:08:13 +0800 Subject: [PATCH 37/47] format --- deepctr_torch/models/multitask/ple.py | 38 +++++++-------------------- 1 file changed, 10 insertions(+), 28 deletions(-) diff --git a/deepctr_torch/models/multitask/ple.py b/deepctr_torch/models/multitask/ple.py index cc1d8996..aafea87c 100644 --- a/deepctr_torch/models/multitask/ple.py +++ b/deepctr_torch/models/multitask/ple.py @@ -71,47 +71,29 @@ def __init__(self, dnn_feature_columns, shared_expert_num=1, specific_expert_num def multi_module_list(num_level, num_tasks, expert_num, inputs_dim_level0, inputs_dim_not_level0, hidden_units): return nn.ModuleList( - [nn.ModuleList([nn.ModuleList([DNN(inputs_dim_level0 if level_num == 0 else inputs_dim_not_level0, - hidden_units, activation=dnn_activation, - l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, - init_std=init_std, device=device) for _ in - range(expert_num)]) - for _ in range(num_tasks)]) for level_num in range(num_level)]) + [nn.ModuleList([nn.ModuleList([DNN(inputs_dim_level0 if level_num == 0 else inputs_dim_not_level0, + hidden_units, activation=dnn_activation, + l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, + init_std=init_std, device=device) for _ in + range(expert_num)]) + for _ in range(num_tasks)]) for level_num in range(num_level)]) # 1. experts # task-specific experts self.specific_experts = multi_module_list(self.num_levels, self.num_tasks, self.specific_expert_num, self.input_dim, expert_dnn_hidden_units[-1], expert_dnn_hidden_units) - # self.specific_experts = nn.ModuleList( - # [nn.ModuleList([nn.ModuleList([DNN(self.input_dim if level_num == 0 else expert_dnn_hidden_units[-1], - # expert_dnn_hidden_units, activation=dnn_activation, - # l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, - # init_std=init_std, device=device) for _ in - # range(self.specific_expert_num)]) - # for _ in range(self.num_tasks)]) for level_num in range(self.num_levels)]) # shared experts self.shared_experts = multi_module_list(self.num_levels, 1, self.specific_expert_num, self.input_dim, expert_dnn_hidden_units[-1], expert_dnn_hidden_units) - # self.shared_experts = nn.ModuleList( - # [nn.ModuleList([DNN(self.input_dim if level_num == 0 else expert_dnn_hidden_units[-1], - # expert_dnn_hidden_units, activation=dnn_activation, - # l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, - # init_std=init_std, device=device) for _ in range(self.shared_expert_num)]) - # for level_num in range(self.num_levels)]) # 2. gates # gates for task-specific experts specific_gate_output_dim = self.specific_expert_num + self.shared_expert_num if len(gate_dnn_hidden_units) > 0: self.specific_gate_dnn = multi_module_list(self.num_levels, self.num_tasks, 1, - self.input_dim, expert_dnn_hidden_units[-1], gate_dnn_hidden_units) - # self.specific_gate_dnn = nn.ModuleList( - # [nn.ModuleList([DNN(self.input_dim if level_num == 0 else expert_dnn_hidden_units[-1], - # gate_dnn_hidden_units, activation=dnn_activation, - # l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, - # init_std=init_std, device=device) for _ in range(self.num_tasks)]) - # for level_num in range(self.num_levels)]) + self.input_dim, expert_dnn_hidden_units[-1], + gate_dnn_hidden_units) self.specific_gate_dnn_final_layer = nn.ModuleList( [nn.ModuleList([nn.Linear(gate_dnn_hidden_units[-1], specific_gate_output_dim, bias=False) for _ in range(self.num_tasks)]) for _ in range(self.num_levels)]) @@ -199,7 +181,8 @@ def cgc_net(self, inputs, level_num): for i in range(self.num_tasks): # concat task-specific expert and task-shared expert cur_experts_outputs = specific_expert_outputs[ - i * self.specific_expert_num:(i + 1) * self.specific_expert_num] + shared_expert_outputs + i * self.specific_expert_num:( + i + 1) * self.specific_expert_num] + shared_expert_outputs cur_experts_outputs = torch.stack(cur_experts_outputs, 1) # gate dnn @@ -249,4 +232,3 @@ def forward(self, X): task_outs.append(output) task_outs = torch.cat(task_outs, -1) return task_outs - From 1c7150898f55e3e62d10d4c36ef09f33c3aa946b Mon Sep 17 00:00:00 2001 From: wuhen Date: Fri, 12 Aug 2022 16:30:15 +0800 Subject: [PATCH 38/47] 1 --- deepctr_torch/models/multitask/ple.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deepctr_torch/models/multitask/ple.py b/deepctr_torch/models/multitask/ple.py index aafea87c..d1d82319 100644 --- a/deepctr_torch/models/multitask/ple.py +++ b/deepctr_torch/models/multitask/ple.py @@ -50,7 +50,7 @@ def __init__(self, dnn_feature_columns, shared_expert_num=1, specific_expert_num seed=seed, device=device, gpus=gpus) self.num_tasks = len(task_names) if self.num_tasks <= 1: - raise ValueError("num_tasks must be greater than 1") + raise ValueError("num_tasks must be greater than 1!") if len(dnn_feature_columns) == 0: raise ValueError("dnn_feature_columns is null!") if len(task_types) != self.num_tasks: From f11a00fe9540723e303e6edce42e02035ee31e3f Mon Sep 17 00:00:00 2001 From: wuhen Date: Fri, 12 Aug 2022 17:00:07 +0800 Subject: [PATCH 39/47] dcnmix --- deepctr_torch/models/dcnmix.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/deepctr_torch/models/dcnmix.py b/deepctr_torch/models/dcnmix.py index 01ef4f5f..9b0e97d4 100644 --- a/deepctr_torch/models/dcnmix.py +++ b/deepctr_torch/models/dcnmix.py @@ -70,9 +70,10 @@ def __init__(self, linear_feature_columns, layer_num=cross_num, device=device) self.add_regularization_weight( filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.dnn.named_parameters()), l2=l2_reg_dnn) - self.add_regularization_weight( - filter(lambda x: ('weight' in x[0] or '_list' in x[0]) and 'bn' not in x[0], self.crossnet.named_parameters()), l2=l2_reg_dnn) self.add_regularization_weight(self.dnn_linear.weight, l2=l2_reg_linear) + self.add_regularization_weight(self.crossnet.U_list, l2=l2_reg_cross) + self.add_regularization_weight(self.crossnet.V_list, l2=l2_reg_cross) + self.add_regularization_weight(self.crossnet.C_list, l2=l2_reg_cross) self.to(device) def forward(self, X): From 3e20cb8da6e1e29467c1613512078716ed2701bc Mon Sep 17 00:00:00 2001 From: wuhen Date: Fri, 12 Aug 2022 17:01:51 +0800 Subject: [PATCH 40/47] =?UTF-8?q?=E7=BC=A9=E5=B0=8Ftest=E7=BB=B4=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/models/AFN_test.py | 6 +++--- tests/models/multitask/ESMM_test.py | 2 +- tests/models/multitask/MMOE_test.py | 10 +++++----- tests/models/multitask/PLE_test.py | 10 +++++----- tests/models/multitask/SharedBottom_test.py | 6 +++--- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/tests/models/AFN_test.py b/tests/models/AFN_test.py index dce5b207..b7f9ef0a 100644 --- a/tests/models/AFN_test.py +++ b/tests/models/AFN_test.py @@ -7,9 +7,9 @@ @pytest.mark.parametrize( 'afn_dnn_hidden_units, sparse_feature_num, dense_feature_num', - [((256, 128), 3, 0), - ((256, 128), 3, 3), - ((256, 128), 0, 3)] + [((32, 16), 3, 0), + ((32, 16), 3, 3), + ((32, 16), 0, 3)] ) def test_AFN(afn_dnn_hidden_units, sparse_feature_num, dense_feature_num): model_name = 'AFN' diff --git a/tests/models/multitask/ESMM_test.py b/tests/models/multitask/ESMM_test.py index c148e5df..a091f791 100644 --- a/tests/models/multitask/ESMM_test.py +++ b/tests/models/multitask/ESMM_test.py @@ -8,7 +8,7 @@ @pytest.mark.parametrize( 'num_experts, tower_dnn_hidden_units, task_types, sparse_feature_num, dense_feature_num', [ - (3, (256, 128), ['binary', 'binary'], 3, 3) + (3, (32, 16), ['binary', 'binary'], 3, 3) ] ) def test_ESMM(num_experts, tower_dnn_hidden_units, task_types, diff --git a/tests/models/multitask/MMOE_test.py b/tests/models/multitask/MMOE_test.py index 587da56a..a37fe29c 100644 --- a/tests/models/multitask/MMOE_test.py +++ b/tests/models/multitask/MMOE_test.py @@ -9,11 +9,11 @@ 'num_experts, expert_dnn_hidden_units, gate_dnn_hidden_units, tower_dnn_hidden_units, task_types, ' 'sparse_feature_num, dense_feature_num', [ - (3, (256, 128), (64,), (64,), ['binary', 'binary'], 3, 3), - (3, (256, 128), (), (64,), ['binary', 'binary'], 3, 3), - (3, (256, 128), (64,), (), ['binary', 'binary'], 3, 3), - (3, (256, 128), (), (), ['binary', 'binary'], 3, 3), - (3, (256, 128), (64,), (64,), ['binary', 'regression'], 3, 3), + (3, (32, 16), (64,), (64,), ['binary', 'binary'], 3, 3), + (3, (32, 16), (), (64,), ['binary', 'binary'], 3, 3), + (3, (32, 16), (64,), (), ['binary', 'binary'], 3, 3), + (3, (32, 16), (), (), ['binary', 'binary'], 3, 3), + (3, (32, 16), (64,), (64,), ['binary', 'regression'], 3, 3), ] ) def test_MMOE(num_experts, expert_dnn_hidden_units, gate_dnn_hidden_units, tower_dnn_hidden_units, task_types, diff --git a/tests/models/multitask/PLE_test.py b/tests/models/multitask/PLE_test.py index 24ba6b3d..ca8561f1 100644 --- a/tests/models/multitask/PLE_test.py +++ b/tests/models/multitask/PLE_test.py @@ -9,11 +9,11 @@ 'shared_expert_num, specific_expert_num, num_levels, expert_dnn_hidden_units, gate_dnn_hidden_units, ' 'tower_dnn_hidden_units, task_types, sparse_feature_num ,dense_feature_num', [ - (1, 1, 2, (256, 128), (64,), (64,), ['binary', 'binary'], 3, 3), - (3, 3, 3, (256, 128), (), (64,), ['binary', 'binary'], 3, 3), - (3, 3, 3, (256, 128), (64,), (), ['binary', 'binary'], 3, 3), - (3, 3, 3, (256, 128), (), (), ['binary', 'binary'], 3, 3), - (3, 3, 3, (256, 128), (64,), (64,), ['binary', 'regression'], 3, 3), + (1, 1, 2, (32, 16), (64,), (64,), ['binary', 'binary'], 3, 3), + (3, 3, 3, (32, 16), (), (64,), ['binary', 'binary'], 3, 3), + (3, 3, 3, (32, 16), (64,), (), ['binary', 'binary'], 3, 3), + (3, 3, 3, (32, 16), (), (), ['binary', 'binary'], 3, 3), + (3, 3, 3, (32, 16), (64,), (64,), ['binary', 'regression'], 3, 3), ] ) def test_PLE(shared_expert_num, specific_expert_num, num_levels, expert_dnn_hidden_units, gate_dnn_hidden_units, diff --git a/tests/models/multitask/SharedBottom_test.py b/tests/models/multitask/SharedBottom_test.py index 75f991ba..f3341f6c 100644 --- a/tests/models/multitask/SharedBottom_test.py +++ b/tests/models/multitask/SharedBottom_test.py @@ -8,9 +8,9 @@ @pytest.mark.parametrize( 'num_experts, bottom_dnn_hidden_units, tower_dnn_hidden_units, task_types, sparse_feature_num, dense_feature_num', [ - (3, (256, 128), (64,), ['binary', 'binary'], 3, 3), - (3, (256, 128), (), ['binary', 'binary'], 3, 3), - (3, (256, 128), (64,), ['binary', 'regression'], 3, 3), + (3, (32, 16), (64,), ['binary', 'binary'], 3, 3), + (3, (32, 16), (), ['binary', 'binary'], 3, 3), + (3, (32, 16), (64,), ['binary', 'regression'], 3, 3), ] ) def test_SharedBottom(num_experts, bottom_dnn_hidden_units, tower_dnn_hidden_units, task_types, From 22323214cb73365e076802b67e7df50b8f2f05f4 Mon Sep 17 00:00:00 2001 From: wuhen Date: Fri, 12 Aug 2022 17:04:02 +0800 Subject: [PATCH 41/47] add_regularization_weight --- deepctr_torch/models/multitask/mmoe.py | 12 ++++-------- deepctr_torch/models/multitask/ple.py | 18 +++++------------- 2 files changed, 9 insertions(+), 21 deletions(-) diff --git a/deepctr_torch/models/multitask/mmoe.py b/deepctr_torch/models/multitask/mmoe.py index 109d1805..121213bb 100644 --- a/deepctr_torch/models/multitask/mmoe.py +++ b/deepctr_torch/models/multitask/mmoe.py @@ -103,14 +103,10 @@ def __init__(self, dnn_feature_columns, num_experts=3, expert_dnn_hidden_units=( self.out = nn.ModuleList([PredictionLayer(task) for task in task_types]) - self.add_regularization_weight( - filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.expert_dnn.named_parameters()), l2=l2_reg_dnn) - self.add_regularization_weight( - filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.gate_dnn_final_layer.named_parameters()), - l2=l2_reg_dnn) - self.add_regularization_weight( - filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.tower_dnn_final_layer.named_parameters()), - l2=l2_reg_dnn) + regularization_modules = [self.expert_dnn, self.gate_dnn, self.tower_dnn] + for module in regularization_modules: + self.add_regularization_weight( + filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], module.named_parameters()), l2=l2_reg_dnn) self.to(device) def forward(self, X): diff --git a/deepctr_torch/models/multitask/ple.py b/deepctr_torch/models/multitask/ple.py index d1d82319..30f8a2e6 100644 --- a/deepctr_torch/models/multitask/ple.py +++ b/deepctr_torch/models/multitask/ple.py @@ -142,19 +142,11 @@ def multi_module_list(num_level, num_tasks, expert_num, inputs_dim_level0, input self.out = nn.ModuleList([PredictionLayer(task) for task in task_types]) - self.add_regularization_weight( - filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.specific_experts.named_parameters()), - l2=l2_reg_dnn) - self.add_regularization_weight( - filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.shared_experts.named_parameters()), - l2=l2_reg_dnn) - self.add_regularization_weight(filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], - self.specific_gate_dnn_final_layer.named_parameters()), l2=l2_reg_dnn) - self.add_regularization_weight(filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], - self.shared_gate_dnn_final_layer.named_parameters()), l2=l2_reg_dnn) - self.add_regularization_weight( - filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.tower_dnn_final_layer.named_parameters()), - l2=l2_reg_dnn) + regularization_modules = [self.specific_experts, self.shared_experts, self.specific_gate_dnn, + self.shared_gate_dnn, self.tower_dnn] + for module in regularization_modules: + self.add_regularization_weight( + filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], module.named_parameters()), l2=l2_reg_dnn) self.to(device) # a single cgc Layer From 4b054bd6c0ed8dd311ba41167e2e9c1a1b0d71c9 Mon Sep 17 00:00:00 2001 From: wuhen Date: Fri, 12 Aug 2022 17:08:52 +0800 Subject: [PATCH 42/47] data url; loss_func --- deepctr_torch/models/basemodel.py | 2 ++ examples/run_multitask_learning.py | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/deepctr_torch/models/basemodel.py b/deepctr_torch/models/basemodel.py index 557c4a65..fcc9a746 100644 --- a/deepctr_torch/models/basemodel.py +++ b/deepctr_torch/models/basemodel.py @@ -246,6 +246,8 @@ def fit(self, x=None, y=None, batch_size=None, epochs=1, verbose=1, initial_epoc optim.zero_grad() if isinstance(loss_func, list): + assert len(loss_func) == self.num_tasks,\ + "the length of `loss_func` should be equal with `self.num_tasks`" loss = sum( [loss_func[i](y_pred[:, i], y[:, i], reduction='sum') for i in range(self.num_tasks)]) else: diff --git a/examples/run_multitask_learning.py b/examples/run_multitask_learning.py index cc675a08..567037a5 100644 --- a/examples/run_multitask_learning.py +++ b/examples/run_multitask_learning.py @@ -8,7 +8,7 @@ from deepctr_torch.models import * if __name__ == "__main__": - # data description can be found in http://ai-lab-challenge.bytedance.com/tce/vc/ + # data description can be found in https://www.biendata.xyz/competition/icmechallenge2019/ data = pd.read_csv('./byterec_sample.txt', sep='\t', names=["uid", "user_city", "item_id", "author_id", "item_city", "channel", "finish", "like", "music_id", "device", "time", "duration_time"]) @@ -53,7 +53,7 @@ model = MMOE(dnn_feature_columns, task_types=['binary', 'binary'], l2_reg_embedding=1e-5, task_names=target, device=device) - model.compile("adagrad", loss="binary_crossentropy", + model.compile("adagrad", loss=["binary_crossentropy", "binary_crossentropy"], metrics=['binary_crossentropy'], ) history = model.fit(train_model_input, train[target].values, batch_size=32, epochs=10, verbose=2) From a35ee3f19604a32174d600b40fac458de6022661 Mon Sep 17 00:00:00 2001 From: wuhen Date: Fri, 12 Aug 2022 17:23:19 +0800 Subject: [PATCH 43/47] final layer --- deepctr_torch/models/multitask/mmoe.py | 14 +++------- deepctr_torch/models/multitask/ple.py | 28 ++++++------------- .../models/multitask/sharedbottom.py | 8 ++---- 3 files changed, 15 insertions(+), 35 deletions(-) diff --git a/deepctr_torch/models/multitask/mmoe.py b/deepctr_torch/models/multitask/mmoe.py index 121213bb..408c62e4 100644 --- a/deepctr_torch/models/multitask/mmoe.py +++ b/deepctr_torch/models/multitask/mmoe.py @@ -77,14 +77,11 @@ def __init__(self, dnn_feature_columns, num_experts=3, expert_dnn_hidden_units=( self.gate_dnn = nn.ModuleList([DNN(self.input_dim, gate_dnn_hidden_units, activation=dnn_activation, l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, init_std=init_std, device=device) for _ in range(self.num_tasks)]) - self.gate_dnn_final_layer = nn.ModuleList( - [nn.Linear(gate_dnn_hidden_units[-1], self.num_experts, bias=False) for _ in range(self.num_tasks)]) self.add_regularization_weight( filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.gate_dnn.named_parameters()), l2=l2_reg_dnn) - else: - self.gate_dnn_final_layer = nn.ModuleList( - [nn.Linear(self.input_dim, self.num_experts, bias=False) for _ in range(self.num_tasks)]) + self.gate_dnn_final_layer = nn.ModuleList( + [nn.Linear(gate_dnn_hidden_units[-1] if len(gate_dnn_hidden_units) > 0 else self.input_dim, self.num_experts, bias=False) for _ in range(self.num_tasks)]) # tower dnn (task-specific) if len(tower_dnn_hidden_units) > 0: @@ -92,14 +89,11 @@ def __init__(self, dnn_feature_columns, num_experts=3, expert_dnn_hidden_units=( [DNN(expert_dnn_hidden_units[-1], tower_dnn_hidden_units, activation=dnn_activation, l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, init_std=init_std, device=device) for _ in range(self.num_tasks)]) - self.tower_dnn_final_layer = nn.ModuleList([nn.Linear(tower_dnn_hidden_units[-1], 1, bias=False) - for _ in range(self.num_tasks)]) self.add_regularization_weight( filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.tower_dnn.named_parameters()), l2=l2_reg_dnn) - else: - self.tower_dnn_final_layer = nn.ModuleList([nn.Linear(expert_dnn_hidden_units[-1], 1, bias=False) - for _ in range(self.num_tasks)]) + self.tower_dnn_final_layer = nn.ModuleList([nn.Linear(tower_dnn_hidden_units[-1] if len(tower_dnn_hidden_units) > 0 else expert_dnn_hidden_units[-1], 1, bias=False) + for _ in range(self.num_tasks)]) self.out = nn.ModuleList([PredictionLayer(task) for task in task_types]) diff --git a/deepctr_torch/models/multitask/ple.py b/deepctr_torch/models/multitask/ple.py index 30f8a2e6..af789685 100644 --- a/deepctr_torch/models/multitask/ple.py +++ b/deepctr_torch/models/multitask/ple.py @@ -94,17 +94,12 @@ def multi_module_list(num_level, num_tasks, expert_num, inputs_dim_level0, input self.specific_gate_dnn = multi_module_list(self.num_levels, self.num_tasks, 1, self.input_dim, expert_dnn_hidden_units[-1], gate_dnn_hidden_units) - self.specific_gate_dnn_final_layer = nn.ModuleList( - [nn.ModuleList([nn.Linear(gate_dnn_hidden_units[-1], specific_gate_output_dim, bias=False) - for _ in range(self.num_tasks)]) for _ in range(self.num_levels)]) self.add_regularization_weight( filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.specific_gate_dnn.named_parameters()), l2=l2_reg_dnn) - else: - self.specific_gate_dnn_final_layer = nn.ModuleList( - [nn.ModuleList([nn.Linear(self.input_dim if level_num == 0 else expert_dnn_hidden_units[-1], - specific_gate_output_dim, bias=False) for _ in range(self.num_tasks)]) for - level_num in range(self.num_levels)]) + self.specific_gate_dnn_final_layer = nn.ModuleList( + [nn.ModuleList([nn.Linear(gate_dnn_hidden_units[-1] if len(gate_dnn_hidden_units) > 0 else self.input_dim if level_num == 0 else expert_dnn_hidden_units[-1], specific_gate_output_dim, bias=False) + for _ in range(self.num_tasks)]) for level_num in range(self.num_levels)]) # gates for shared experts shared_gate_output_dim = self.num_tasks * self.specific_expert_num + self.shared_expert_num @@ -114,16 +109,12 @@ def multi_module_list(num_level, num_tasks, expert_num, inputs_dim_level0, input l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, init_std=init_std, device=device) for level_num in range(self.num_levels)]) - self.shared_gate_dnn_final_layer = nn.ModuleList( - [nn.Linear(gate_dnn_hidden_units[-1], shared_gate_output_dim, bias=False) - for _ in range(self.num_levels)]) self.add_regularization_weight( filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.shared_gate_dnn.named_parameters()), l2=l2_reg_dnn) - else: - self.shared_gate_dnn_final_layer = nn.ModuleList( - [nn.Linear(self.input_dim if level_num == 0 else expert_dnn_hidden_units[-1], shared_gate_output_dim, - bias=False) for level_num in range(self.num_levels)]) + self.shared_gate_dnn_final_layer = nn.ModuleList( + [nn.Linear(gate_dnn_hidden_units[-1] if len(gate_dnn_hidden_units) > 0 else self.input_dim if level_num == 0 else expert_dnn_hidden_units[-1], shared_gate_output_dim, bias=False) + for level_num in range(self.num_levels)]) # 3. tower dnn (task-specific) if len(tower_dnn_hidden_units) > 0: @@ -131,14 +122,11 @@ def multi_module_list(num_level, num_tasks, expert_num, inputs_dim_level0, input [DNN(expert_dnn_hidden_units[-1], tower_dnn_hidden_units, activation=dnn_activation, l2_reg=l2_reg_dnn, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, init_std=init_std, device=device) for _ in range(self.num_tasks)]) - self.tower_dnn_final_layer = nn.ModuleList([nn.Linear(tower_dnn_hidden_units[-1], 1, bias=False) - for _ in range(self.num_tasks)]) self.add_regularization_weight( filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.tower_dnn.named_parameters()), l2=l2_reg_dnn) - else: - self.tower_dnn_final_layer = nn.ModuleList([nn.Linear(expert_dnn_hidden_units[-1], 1, bias=False) - for _ in range(self.num_tasks)]) + self.tower_dnn_final_layer = nn.ModuleList([nn.Linear(tower_dnn_hidden_units[-1] if len(tower_dnn_hidden_units) > 0 else expert_dnn_hidden_units[-1], 1, bias=False) + for _ in range(self.num_tasks)]) self.out = nn.ModuleList([PredictionLayer(task) for task in task_types]) diff --git a/deepctr_torch/models/multitask/sharedbottom.py b/deepctr_torch/models/multitask/sharedbottom.py index 86065a88..9a8f7de4 100644 --- a/deepctr_torch/models/multitask/sharedbottom.py +++ b/deepctr_torch/models/multitask/sharedbottom.py @@ -68,14 +68,12 @@ def __init__(self, dnn_feature_columns, bottom_dnn_hidden_units=(256, 128), towe [DNN(bottom_dnn_hidden_units[-1], tower_dnn_hidden_units, activation=dnn_activation, dropout_rate=dnn_dropout, use_bn=dnn_use_bn, init_std=init_std, device=device) for _ in range(self.num_tasks)]) - self.tower_dnn_final_layer = nn.ModuleList([nn.Linear(tower_dnn_hidden_units[-1], 1, bias=False) - for _ in range(self.num_tasks)]) self.add_regularization_weight( filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.tower_dnn.named_parameters()), l2=l2_reg_dnn) - else: - self.tower_dnn_final_layer = nn.ModuleList([nn.Linear(bottom_dnn_hidden_units[-1], 1, bias=False) - for _ in range(self.num_tasks)]) + self.tower_dnn_final_layer = nn.ModuleList([nn.Linear( + tower_dnn_hidden_units[-1] if len(self.tower_dnn_hidden_units) > 0 else bottom_dnn_hidden_units[-1], 1, + bias=False) for _ in range(self.num_tasks)]) self.out = nn.ModuleList([PredictionLayer(task) for task in task_types]) From 13de334c497d6091d3a680b39df092469a9d899b Mon Sep 17 00:00:00 2001 From: wuhen Date: Fri, 12 Aug 2022 17:25:00 +0800 Subject: [PATCH 44/47] format --- deepctr_torch/models/multitask/mmoe.py | 7 +++++-- deepctr_torch/models/multitask/ple.py | 21 +++++++++++++-------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/deepctr_torch/models/multitask/mmoe.py b/deepctr_torch/models/multitask/mmoe.py index 408c62e4..50fbaa7c 100644 --- a/deepctr_torch/models/multitask/mmoe.py +++ b/deepctr_torch/models/multitask/mmoe.py @@ -81,7 +81,8 @@ def __init__(self, dnn_feature_columns, num_experts=3, expert_dnn_hidden_units=( filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.gate_dnn.named_parameters()), l2=l2_reg_dnn) self.gate_dnn_final_layer = nn.ModuleList( - [nn.Linear(gate_dnn_hidden_units[-1] if len(gate_dnn_hidden_units) > 0 else self.input_dim, self.num_experts, bias=False) for _ in range(self.num_tasks)]) + [nn.Linear(gate_dnn_hidden_units[-1] if len(gate_dnn_hidden_units) > 0 else self.input_dim, + self.num_experts, bias=False) for _ in range(self.num_tasks)]) # tower dnn (task-specific) if len(tower_dnn_hidden_units) > 0: @@ -92,7 +93,9 @@ def __init__(self, dnn_feature_columns, num_experts=3, expert_dnn_hidden_units=( self.add_regularization_weight( filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.tower_dnn.named_parameters()), l2=l2_reg_dnn) - self.tower_dnn_final_layer = nn.ModuleList([nn.Linear(tower_dnn_hidden_units[-1] if len(tower_dnn_hidden_units) > 0 else expert_dnn_hidden_units[-1], 1, bias=False) + self.tower_dnn_final_layer = nn.ModuleList([nn.Linear( + tower_dnn_hidden_units[-1] if len(tower_dnn_hidden_units) > 0 else expert_dnn_hidden_units[-1], 1, + bias=False) for _ in range(self.num_tasks)]) self.out = nn.ModuleList([PredictionLayer(task) for task in task_types]) diff --git a/deepctr_torch/models/multitask/ple.py b/deepctr_torch/models/multitask/ple.py index af789685..74cbd36a 100644 --- a/deepctr_torch/models/multitask/ple.py +++ b/deepctr_torch/models/multitask/ple.py @@ -98,8 +98,10 @@ def multi_module_list(num_level, num_tasks, expert_num, inputs_dim_level0, input filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.specific_gate_dnn.named_parameters()), l2=l2_reg_dnn) self.specific_gate_dnn_final_layer = nn.ModuleList( - [nn.ModuleList([nn.Linear(gate_dnn_hidden_units[-1] if len(gate_dnn_hidden_units) > 0 else self.input_dim if level_num == 0 else expert_dnn_hidden_units[-1], specific_gate_output_dim, bias=False) - for _ in range(self.num_tasks)]) for level_num in range(self.num_levels)]) + [nn.ModuleList([nn.Linear( + gate_dnn_hidden_units[-1] if len(gate_dnn_hidden_units) > 0 else self.input_dim if level_num == 0 else + expert_dnn_hidden_units[-1], specific_gate_output_dim, bias=False) + for _ in range(self.num_tasks)]) for level_num in range(self.num_levels)]) # gates for shared experts shared_gate_output_dim = self.num_tasks * self.specific_expert_num + self.shared_expert_num @@ -113,8 +115,10 @@ def multi_module_list(num_level, num_tasks, expert_num, inputs_dim_level0, input filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.shared_gate_dnn.named_parameters()), l2=l2_reg_dnn) self.shared_gate_dnn_final_layer = nn.ModuleList( - [nn.Linear(gate_dnn_hidden_units[-1] if len(gate_dnn_hidden_units) > 0 else self.input_dim if level_num == 0 else expert_dnn_hidden_units[-1], shared_gate_output_dim, bias=False) - for level_num in range(self.num_levels)]) + [nn.Linear( + gate_dnn_hidden_units[-1] if len(gate_dnn_hidden_units) > 0 else self.input_dim if level_num == 0 else + expert_dnn_hidden_units[-1], shared_gate_output_dim, bias=False) + for level_num in range(self.num_levels)]) # 3. tower dnn (task-specific) if len(tower_dnn_hidden_units) > 0: @@ -125,8 +129,10 @@ def multi_module_list(num_level, num_tasks, expert_num, inputs_dim_level0, input self.add_regularization_weight( filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.tower_dnn.named_parameters()), l2=l2_reg_dnn) - self.tower_dnn_final_layer = nn.ModuleList([nn.Linear(tower_dnn_hidden_units[-1] if len(tower_dnn_hidden_units) > 0 else expert_dnn_hidden_units[-1], 1, bias=False) - for _ in range(self.num_tasks)]) + self.tower_dnn_final_layer = nn.ModuleList([nn.Linear( + tower_dnn_hidden_units[-1] if len(tower_dnn_hidden_units) > 0 else expert_dnn_hidden_units[-1], 1, + bias=False) + for _ in range(self.num_tasks)]) self.out = nn.ModuleList([PredictionLayer(task) for task in task_types]) @@ -161,8 +167,7 @@ def cgc_net(self, inputs, level_num): for i in range(self.num_tasks): # concat task-specific expert and task-shared expert cur_experts_outputs = specific_expert_outputs[ - i * self.specific_expert_num:( - i + 1) * self.specific_expert_num] + shared_expert_outputs + i * self.specific_expert_num:(i + 1) * self.specific_expert_num] + shared_expert_outputs cur_experts_outputs = torch.stack(cur_experts_outputs, 1) # gate dnn From cdbfb16c380aa09d7a24bf89ed31f7e27711b2d0 Mon Sep 17 00:00:00 2001 From: wuhen Date: Fri, 12 Aug 2022 17:33:53 +0800 Subject: [PATCH 45/47] format --- deepctr_torch/models/basemodel.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deepctr_torch/models/basemodel.py b/deepctr_torch/models/basemodel.py index fcc9a746..cd36340a 100644 --- a/deepctr_torch/models/basemodel.py +++ b/deepctr_torch/models/basemodel.py @@ -195,7 +195,7 @@ def fit(self, x=None, y=None, batch_size=None, epochs=1, verbose=1, initial_epoc train_tensor_data = Data.TensorDataset( torch.from_numpy( np.concatenate(x, axis=-1)), - torch.from_numpy(np.array(y))) + torch.from_numpy(y)) if batch_size is None: batch_size = 256 From 05f134c13eb7a27138d494f7950a736e18845005 Mon Sep 17 00:00:00 2001 From: wuhen Date: Fri, 12 Aug 2022 17:47:15 +0800 Subject: [PATCH 46/47] add_regularization_weight --- deepctr_torch/models/multitask/mmoe.py | 2 +- deepctr_torch/models/multitask/ple.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/deepctr_torch/models/multitask/mmoe.py b/deepctr_torch/models/multitask/mmoe.py index 50fbaa7c..c0401eb7 100644 --- a/deepctr_torch/models/multitask/mmoe.py +++ b/deepctr_torch/models/multitask/mmoe.py @@ -100,7 +100,7 @@ def __init__(self, dnn_feature_columns, num_experts=3, expert_dnn_hidden_units=( self.out = nn.ModuleList([PredictionLayer(task) for task in task_types]) - regularization_modules = [self.expert_dnn, self.gate_dnn, self.tower_dnn] + regularization_modules = [self.expert_dnn, self.gate_dnn_final_layer, self.tower_dnn_final_layer] for module in regularization_modules: self.add_regularization_weight( filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], module.named_parameters()), l2=l2_reg_dnn) diff --git a/deepctr_torch/models/multitask/ple.py b/deepctr_torch/models/multitask/ple.py index 74cbd36a..bc8a06fb 100644 --- a/deepctr_torch/models/multitask/ple.py +++ b/deepctr_torch/models/multitask/ple.py @@ -136,8 +136,8 @@ def multi_module_list(num_level, num_tasks, expert_num, inputs_dim_level0, input self.out = nn.ModuleList([PredictionLayer(task) for task in task_types]) - regularization_modules = [self.specific_experts, self.shared_experts, self.specific_gate_dnn, - self.shared_gate_dnn, self.tower_dnn] + regularization_modules = [self.specific_experts, self.shared_experts, self.specific_gate_dnn_final_layer, + self.shared_gate_dnn_final_layer, self.tower_dnn_final_layer] for module in regularization_modules: self.add_regularization_weight( filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], module.named_parameters()), l2=l2_reg_dnn) From 90cae062c8175b3221d834e78ed098f2fe5cf2e7 Mon Sep 17 00:00:00 2001 From: wuhen Date: Mon, 15 Aug 2022 19:49:52 +0800 Subject: [PATCH 47/47] add_regularization_weight dcnmix --- deepctr_torch/models/dcnmix.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/deepctr_torch/models/dcnmix.py b/deepctr_torch/models/dcnmix.py index 9b0e97d4..c819a42c 100644 --- a/deepctr_torch/models/dcnmix.py +++ b/deepctr_torch/models/dcnmix.py @@ -71,9 +71,10 @@ def __init__(self, linear_feature_columns, self.add_regularization_weight( filter(lambda x: 'weight' in x[0] and 'bn' not in x[0], self.dnn.named_parameters()), l2=l2_reg_dnn) self.add_regularization_weight(self.dnn_linear.weight, l2=l2_reg_linear) - self.add_regularization_weight(self.crossnet.U_list, l2=l2_reg_cross) - self.add_regularization_weight(self.crossnet.V_list, l2=l2_reg_cross) - self.add_regularization_weight(self.crossnet.C_list, l2=l2_reg_cross) + regularization_modules = [self.crossnet.U_list, self.crossnet.V_list, self.crossnet.C_list] + for module in regularization_modules: + self.add_regularization_weight(module, l2=l2_reg_cross) + self.to(device) def forward(self, X):