Kaggle competition: Google QUEST Q&A Labeling
<SOS> metric: MCSpearmanR Kaggle data source: google-quest-q&a-labeling<concatenate>

 pyLDAvis.enable_notebook()
warnings.filterwarnings('ignore' )
d = ['cp_type']
d.extend(train_targets.columns[1:])
 train1 = train[d]
ar = np.array(train1[train1['cp_type'] == 'ctl_vehicle'])[:, 1:] 
(ar != 0 ).sum()<concatenate>
sample = pd.read_csv('/kaggle/input/google-quest-challenge/sample_submission.csv')
 sample.head(3 )
d = ['cp_type']
d.extend(train_targets.columns[1:])
 train1 = train[d]
ar = np.array(train1[train1['cp_type'] == 'trt_cp'])[:, 1:] 
(ar != 0 ).sum() /(ar.shape[0] * ar.shape[1] )<concatenate>
train = pd.read_csv('/kaggle/input/google-quest-challenge/train.csv')
 train.head(3 )
d = ['cp_type', 'cp_time']
d.extend(train_targets.columns[1:])
 train1 = train[d]
ar = np.array(train1[(train1['cp_type'] == 'trt_cp')&(train1['cp_time'] == 24)])[:, 2:] 
(ar != 0 ).sum() /(ar.shape[0] * ar.shape[1] )<concatenate>
test = pd.read_csv('/kaggle/input/google-quest-challenge/test.csv')
 test.head(3 )
d = ['cp_type', 'cp_time']
d.extend(train_targets.columns[1:])
 train1 = train[d]
ar = np.array(train1[(train1['cp_type'] == 'trt_cp')&(train1['cp_time'] == 48)])[:, 2:] 
(ar != 0 ).sum() /(ar.shape[0] * ar.shape[1] )<concatenate>
targets = [
'question_asker_intent_understanding',
'question_body_critical',
'question_conversational',
'question_expect_short_answer',
'question_fact_seeking',
'question_has_commonly_accepted_answer',
'question_interestingness_others',
'question_interestingness_self',
'question_multi_intent',
'question_not_really_a_question',
'question_opinion_seeking',
'question_type_choice',
'question_type_compare',
'question_type_consequence',
'question_type_definition',
'question_type_entity',
'question_type_instructions',
'question_type_procedure',
'question_type_reason_explanation',
'question_type_spelling',
'question_well_written',
'answer_helpful',
'answer_level_of_information',
'answer_plausible',
'answer_relevance',
'answer_satisfaction',
'answer_type_instructions',
'answer_type_procedure',
'answer_type_reason_explanation',
'answer_well_written'
]
d = ['cp_type', 'cp_time']
d.extend(train_targets.columns[1:])
 train1 = train[d]
ar = np.array(train1[(train1['cp_type'] == 'trt_cp')&(train1['cp_time'] == 72)])[:, 2:] 
(ar != 0 ).sum() /(ar.shape[0] * ar.shape[1] )<concatenate>
stopwords=stopwords.words('english')
 train['que_stopwords']=train['question_body'].apply(lambda x : [x for x in x.split() if x in stopwords])
 train['ans_stopwords']=train['answer'].apply(lambda x: [x for x in x.split() if x in stopwords] )
d = ['cp_type', 'cp_dose']
d.extend(train_targets.columns[1:])
 train1 = train[d]
ar = np.array(train1[(train1['cp_type'] == 'trt_cp')&(train1['cp_dose'] == 'D1')])[:, 2:] 
(ar != 0 ).sum() /(ar.shape[0] * ar.shape[1] )<concatenate>
def common_ngrams(col,common=10):
corpus=[]
for question in train[col].values:
words=[str(x[0]+' '+x[1])for x in ngrams(question.split() ,2)]
corpus.append(words)
 flatten=[x for one in corpus for x in one]
counter=Counter(flatten)
 most_common=counter.most_common(common)
 string,value=zip(*(most_common))
return string,value
d = ['cp_type', 'cp_dose']
d.extend(train_targets.columns[1:])
 train1 = train[d]
ar = np.array(train1[(train1['cp_type'] == 'trt_cp')&(train1['cp_dose'] == 'D2')])[:, 2:] 
(ar != 0 ).sum() /(ar.shape[0] * ar.shape[1] )<concatenate>
np.set_printoptions(suppress=True )
d = ['cp_type', 'cp_time', 'cp_dose']
d.extend(train_targets.columns[1:])
 train1 = train[d]
ar = np.array(train1[(train1['cp_type'] == 'trt_cp')&(train1['cp_time'] == 72)&(train1['cp_dose'] == 'D2')])[:, 3:] 
(ar != 0 ).sum() /(ar.shape[0] * ar.shape[1] )<concatenate>
PATH = '.. /input/google-quest-challenge/'
BERT_PATH = '.. /input/bert-base-from-tfhub/bert_en_uncased_L-12_H-768_A-12'
tokenizer = FullTokenizer(BERT_PATH+'/assets/vocab.txt', True)
 MAX_SEQUENCE_LENGTH = 512
df_train = pd.read_csv(PATH+'train.csv')
 df_test = pd.read_csv(PATH+'test.csv')
 df_sub = pd.read_csv(PATH+'sample_submission.csv')
 print('train shape =', df_train.shape)
 print('test shape =', df_test.shape)
 output_categories = list(df_train.columns[11:])
 input_categories = list(df_train.columns[[1,2,5]])
 print('
output categories:
\t', output_categories)
 print('
input categories:
\t', input_categories )
d = ['cp_type', 'cp_time']
d.extend(train_targets.columns[1:])
 train1 = train[d]
ar = np.array(train1[(train1['cp_type'] == 'trt_cp')])[:, 2:] 
(ar != 0 ).sum() /(ar.shape[0] * ar.shape[1] )<concatenate>
def _get_masks(tokens, max_seq_length):

 if len(tokens)>max_seq_length:
raise IndexError("Token length more than max seq length!")
 return [1]*len(tokens)+ [0] *(max_seq_length - len(tokens))
def _get_segments(tokens, max_seq_length):

 if len(tokens)>max_seq_length:
raise IndexError("Token length more than max seq length!")
 segments = []
first_sep = True
current_segment_id = 0
for token in tokens:
segments.append(current_segment_id)
 if token == "[SEP]":
if first_sep:
first_sep = False
else:
current_segment_id = 1
return segments + [0] *(max_seq_length - len(tokens))
def _get_ids(tokens, tokenizer, max_seq_length):

 token_ids = tokenizer.convert_tokens_to_ids(tokens)
 input_ids = token_ids + [0] *(max_seq_length-len(token_ids))
return input_ids
def _trim_input(title, question, answer, max_sequence_length,
t_max_len=30, q_max_len=239, a_max_len=239):
t = tokenizer.tokenize(title)
 q = tokenizer.tokenize(question)
 a = tokenizer.tokenize(answer)
 t_len = len(t)
 q_len = len(q)
 a_len = len(a)
 if(t_len+q_len+a_len+4)> max_sequence_length:
if t_max_len > t_len:
t_new_len = t_len
a_max_len = a_max_len + floor(( t_max_len - t_len)/2)
 q_max_len = q_max_len + ceil(( t_max_len - t_len)/2)
 else:
t_new_len = t_max_len
if a_max_len > a_len:
a_new_len = a_len
q_new_len = q_max_len +(a_max_len - a_len)
 elif q_max_len > q_len:
a_new_len = a_max_len +(q_max_len - q_len)
 q_new_len = q_len
else:
a_new_len = a_max_len
q_new_len = q_max_len
if t_new_len+a_new_len+q_new_len+4 != max_sequence_length:
raise ValueError("New sequence length should be %d, but is %d"
%(max_sequence_length,(t_new_len+a_new_len+q_new_len+4)))
 t = t[:t_new_len]
q = q[:q_new_len]
a = a[:a_new_len]
return t, q, a
def _convert_to_bert_inputs(title, question, answer, tokenizer, max_sequence_length):

 stoken = ["[CLS]"] + title + ["[SEP]"] + question + ["[SEP]"] + answer + ["[SEP]"]
input_ids = _get_ids(stoken, tokenizer, max_sequence_length)
 input_masks = _get_masks(stoken, max_sequence_length)
 input_segments = _get_segments(stoken, max_sequence_length)
 return [input_ids, input_masks, input_segments]
def compute_input_arays(df, columns, tokenizer, max_sequence_length):
input_ids, input_masks, input_segments = [], [], []
for _, instance in tqdm(df[columns].iterrows()):
t, q, a = instance.question_title, instance.question_body, instance.answer
t, q, a = _trim_input(t, q, a, max_sequence_length)
 ids, masks, segments = _convert_to_bert_inputs(t, q, a, tokenizer, max_sequence_length)
 input_ids.append(ids)
 input_masks.append(masks)
 input_segments.append(segments)
 return [np.asarray(input_ids, dtype=np.int32),
np.asarray(input_masks, dtype=np.int32),
np.asarray(input_segments, dtype=np.int32)]
def compute_output_arrays(df, columns):
return np.asarray(df[columns] )
d = ['cp_type', 'cp_time']
d.extend(train_targets.columns[1:])
 train1 = train[d]
ar = np.array(train1[(train1['cp_type'] == 'trt_cp')])[:, 2:] 
(ar != 1 ).sum() /(ar.shape[0] * ar.shape[1] )<define_variables>
def compute_spearmanr(trues, preds):
rhos = []
for col_trues, col_pred in zip(trues.T, preds.T):
rhos.append(
 spearmanr(col_trues, col_pred + np.random.normal(0, 1e-7, col_pred.shape[0])).correlation)
 return np.nanmean(rhos)
 class CustomCallback(tf.keras.callbacks.Callback):
def __init__(self, valid_data, test_data, batch_size=16, fold=None):
self.valid_inputs = valid_data[0]
self.valid_outputs = valid_data[1]
self.test_inputs = test_data
self.batch_size = batch_size
self.fold = fold
def on_train_begin(self, logs={}):
self.valid_predictions = []
self.test_predictions = []
def on_epoch_end(self, epoch, logs={}):
self.valid_predictions.append(
 self.model.predict(self.valid_inputs, batch_size=self.batch_size))
rho_val = compute_spearmanr(
 self.valid_outputs, np.average(self.valid_predictions, axis=0))
print("
validation rho: %.4f" % rho_val)
 if self.fold is not None:
self.model.save_weights(f'bert-base-{fold}-{epoch}.h5py')
 self.test_predictions.append(
 self.model.predict(self.test_inputs, batch_size=self.batch_size)
)
 def bert_model() :
input_word_ids = tf.keras.layers.Input(
(MAX_SEQUENCE_LENGTH,), dtype=tf.int32, name='input_word_ids')
 input_masks = tf.keras.layers.Input(
(MAX_SEQUENCE_LENGTH,), dtype=tf.int32, name='input_masks')
 input_segments = tf.keras.layers.Input(
(MAX_SEQUENCE_LENGTH,), dtype=tf.int32, name='input_segments')
 bert_layer = hub.KerasLayer(BERT_PATH, trainable=True)
 _, sequence_output = bert_layer([input_word_ids, input_masks, input_segments])
 x = tf.keras.layers.GlobalAveragePooling1D()(sequence_output)
 x = tf.keras.layers.Dropout(0.2 )(x)
 out = tf.keras.layers.Dense(30, activation="sigmoid", name="dense_output" )(x)
 model = tf.keras.models.Model(
 inputs=[input_word_ids, input_masks, input_segments], outputs=out)
 return model
def train_and_predict(model, train_data, valid_data, test_data,
learning_rate, epochs, batch_size, loss_function, fold):
custom_callback = CustomCallback(
 valid_data=(valid_data[0], valid_data[1]),
test_data=test_data,
batch_size=batch_size,
fold=None)
 optimizer = tf.keras.optimizers.Adam(learning_rate=learning_rate)
 model.compile(loss=loss_function, optimizer=optimizer)
 model.fit(train_data[0], train_data[1], epochs=epochs,
batch_size=batch_size, callbacks=[custom_callback])
 return custom_callback
features_g = ['g-' + str(i)for i in range(772)]
features_c = ['c-' + str(i)for i in range(100)]<feature_engineering>
gkf = GroupKFold(n_splits=10 ).split(X=df_train.question_body, groups=df_train.question_body)
 test_inputs = compute_input_arays(df_test, input_categories, tokenizer, MAX_SEQUENCE_LENGTH )
for df in train_features, test_features:
df['g_sum'] = df[features_g].sum(axis = 1)
 df['g_mean'] = df[features_g].mean(axis = 1)
 df['g_median'] = df[features_g].median(axis = 1)
 df['g_std'] = df[features_g].std(axis = 1)
 df['g_kurt'] = df[features_g].kurtosis(axis = 1)
 df['g_skew'] = df[features_g].skew(axis = 1)
 df['c_sum'] = df[features_c].sum(axis = 1)
 df['c_mean'] = df[features_c].mean(axis = 1)
 df['c_std'] = df[features_c].std(axis = 1)
 df['c_median'] = df[features_c].median(axis = 1)
 df['c_kurt'] = df[features_c].kurtosis(axis = 1)
 df['c_skew'] = df[features_c].skew(axis = 1)
 df['gc_sum'] = df[features_g + features_c].sum(axis = 1)
 df['gc_mean'] = df[features_g + features_c].mean(axis = 1)
 df['gc_std'] = df[features_g + features_c].std(axis = 1)
 df['gc_kurt'] = df[features_g + features_c].kurtosis(axis = 1)
 df['gc_skew'] = df[features_g + features_c].skew(axis = 1)
 df['gc_median'] = df[features_g + features_c].median(axis = 1)
<drop_column>
models = []
for i in range(5):
model_path = f'.. /input/bertuned-f{i}/bertuned_f{i}.h5'
model = bert_model()
model.load_weights(model_path)
 models.append(model)
train_targets = train_targets[train_features['cp_type'] == 'trt_cp']
train_features = train_features[train_features['cp_type'] == 'trt_cp']
train_features = train_features.drop(columns = ['sig_id', 'cp_type'])
 test1_features = test_features.copy()
test_features = test_features.drop(columns = ['sig_id', 'cp_type'])
 cat_columns = ['cp_time', 'cp_dose']
cat_train_features = train_features[cat_columns]
cat_test_features = test_features[cat_columns]
train_features = train_features.drop(columns = cat_columns)
 test_features = test_features.drop(columns = cat_columns)
 train = np.array(train_features)
 test = np.array(test_features)
 targets = train_targets.columns
train_targets = np.array(train_targets[train_targets.columns[1:]] )<define_variables>
model_path = f'.. /input/bertf1e15/Full-0.h5'
model = bert_model()
model.load_weights(model_path)
 models.append(model )
batch_size = 128
val_batch_size = batch_size * 4<categorify>
for i in range(2):
model_path = f'.. /input/bertmodelpretrained/bert-{i}.h5'
model = bert_model()
model.load_weights(model_path)
 models.append(model )
one_hot = OneHotEncoder()
X2_train = one_hot.fit_transform(cat_train_features)
 X2_test = one_hot.transform(cat_test_features )<concatenate>
for i in range(7):
model_path = f'.. /input/pretrained-bert/bert-{i}.h5'
model = bert_model()
model.load_weights(model_path)
 models.append(model )
train = np.concatenate(( X2_train.toarray() , train), 1)
 test = np.concatenate(( X2_test.toarray() , test), 1 )<define_variables>
for i in range(7):
model_path = f'.. /input/bert-base-tf2-0-training/bert-{i}.h5'
model = bert_model()
model.load_weights(model_path)
 models.append(model )
n_folds = 7
n_starts = 1
n_epochs = 70
n_targets = train_targets.shape[1]<choose_model_class>
test_predictions = []
criterion = nn.BCELoss()
kfold = MultilabelStratifiedKFold(n_splits = 7, random_state = 42, shuffle = True )<choose_model_class>
for model in models:
test_predictions.append(model.predict(test_inputs, batch_size=8))
class SimpleNet(nn.Module):
def __init__(self, num_columns):
super(SimpleNet, self ).__init__()
self.batch_norm1 = nn.BatchNorm1d(num_columns)
 self.dropout1 = nn.Dropout(0.4)
 self.dense1 = nn.utils.weight_norm(nn.Linear(num_columns, 1024))
self.batch_norm2 = nn.BatchNorm1d(1024)
 self.dropout2 = nn.Dropout(0.4)
 self.dense2 = nn.utils.weight_norm(nn.Linear(1024, 1024))
self.batch_norm3 = nn.BatchNorm1d(1024)
 self.dropout3 = nn.Dropout(0.4)
 self.dense3 = nn.utils.weight_norm(nn.Linear(1024, 206))
def forward(self, x):
x = self.batch_norm1(x)
 x = self.dropout1(x)
 x = F.relu(self.dense1(x))
x = self.batch_norm2(x)
 x = self.dropout2(x)
 x = F.relu(self.dense2(x))
x = self.batch_norm3(x)
 x = self.dropout3(x)
 x = F.sigmoid(self.dense3(x))
return x<prepare_x_and_y>
final_predictions = np.mean(test_predictions, axis=0 )
class Dataset1(Dataset):
def __init__(self, df, targets, mode='train'):
self.mode = mode
self.df = df
if mode == 'train':
self.targets = targets
def __len__(self):
return len(self.df)
 def __getitem__(self, index):
if self.mode == 'train':
return torch.FloatTensor(self.df[index]), torch.FloatTensor(self.targets[index])
 elif self.mode == 'test':
return torch.FloatTensor(self.df[index]), 0<set_options>
n=df_test['url'].apply(lambda x:(( 'ell.stackexchange.com' in x)or('english.stackexchange.com' in x)) ).tolist()
spelling=[]
for x in n:
if x:
spelling.append(0.5)
 else:
spelling.append(0.)
if torch.cuda.is_available() :
device = 'cuda'
device<load_from_csv>
df_sub['question_type_spelling']=spelling
df_sub.iloc[:, 1:] = final_predictions
df_sub.to_csv('submission.csv', index=False )