Commit 0399f688 authored by Nishtha Jain's avatar Nishtha Jain
Browse files

ipnb cleaned

parent 65a259ba
......@@ -482,7 +482,39 @@
![](data:image/png;base64,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vSzwFhcX06ZNGwAefvhhhgwZQv/+/enduzebN29m4MCBZGdnk5+fz4oVKwAoLCxk+PDh9OzZk5YtW/LAAw8AifDao0cPrrjiCtq2bQvAwIED6dChA+eeey73339/WX0vvvgi7du3Jycnh169elFcXMzkyZO56667yM3N5bXXXmPt2rX06tWL7OxsevXqxbp164DEXeybbrqJHj16MH78+ONzQCWpEuk1XYAkSdKX1cqVK7ntttuYP38+TZo0YfPmzdx000188MEHzJs3j1WrVnHppZdWONx5wYIFrFixgsaNG3PDDTfQrl07pk+fzmkF1lcAACAASURBVKxZsxgxYgTLly8HYMWKFSxcuJBPPvmEdu3a0bdvXwAWLVrEm2++SYsWLQB46KGHaNy4MTt37qRjx45cfvnllJaWcs011zB37lxatGjB5s2bady4MWPGjCEzM5OxY8cC0L9/f0aMGMHIkSN56KGHuPHGG5k+fToAb7/9NjNnziQtLe14HFJJqpR3fiVJko6XHTvg5pshKwtq1WJW584MPu00mtStC0Djxo2BxF3YWrVq0bp1az788MMKV3XRRReV9Z83b17ZXeOePXvy0UcfsW3bNgAGDBhAvXr1aNKkCT169GDRokUAdOrUqSz4AkyaNImcnBzy8/NZv34977zzDgsXLqRbt25l/fZub38LFizgiiuuAGD48OHMmzevrG3IkCEGX0lfCN75lSRJOh527ID8fEreWUP6Z7sBiJ98Qnx9AeTnw8KFkJkJQJ06dcoWizFWuLqTTjrpoH1CCPv8d//55ZefPXs2M2fOZMGCBdSvX5+CggJ27dpFjPGA5aui/DLltyNJNck7v5IkScfDxIn7BF+AXsC00j18+PY7MHEimzdvPqJVd+vWjccffxxIBNkmTZpw8sknAzBjxgx27drFRx99xOzZs+nYseMBy2/bto1GjRpRv359Vq1axcKFCwE477zzmDNnDu+++y5AWX0NGjRg+/btZct36dKFJ598EoDHH3+c888//4j2Q5Kqk3d+JUmSjod7790n+AKcC/wU6PX5Z6Tddhvt1q49olUXFhYyatQosrOzqV+/Pr///e/L2jp16kTfvn1Zt24dP/vZz2jatClvv/32Psv36dOHyZMnk52dTatWrcjPzwcgKyuL+++/n8suu4zS0lJOO+00XnnlFfr378/g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zc3lrrvuYvbs2fTr1w+AOXPmkJubS25uLu3atWP79u0H9K9JxcXFnH322YwcOZLs7GwGDx7Mp59+CsDdd99N+/btadu2LatWraK0tJSWLVuyceNGIPEPyTe/+U02bdrEH//4R9q0aUNOTg7dunUD2Oc47Nixg1GjRtG2bVuys7N5+umngX2vYg8cOJAOHTpw7rnncv/995fVmJmZyU9/+lNycnLIz8/nww8/PG7HRzqUiv4Nueqqq8r+fSgqKqJ79+506NCBiy++mA8++IBp06axZMkShg0bRm5uLkAIIcwOIeSFEO4A6oUQlocQHk827kj+NzOE8GoIYWkI4c8hhAHJ+c1DCG+FEB4IIawMIbwcQqhXA4dDOiY8N3tulvZXXFzMOeecwzXXXMO5555L79692blzJwUFBSxZsgSATZs20bx5c2677TZOP/10vvKVr/DAAw9w//338y//8i+cc8455Obm8o1vfIPc3Fw6dOhAXl4eHTp0oEWLFsybN4+hQ4fW7Lk5xviFmzp06BB14luyZEls06ZN/OSTT+K2bdviN77xjThx4sTYs2fP+Pbbb8cYY1y4cGHs0aNHjDHGkSNHxsGDB8c9e/bElStXxm984xsxxhj/+7//O/bt27dsveW/9+vXL86bNy/GGOP27dv///buPEyK+s7j+PvLDBAGFUZADiFI4hVAwIAIIRsnUReVjciVmIgRJPF64qImeOwTXTY+EfaZTTQGI2tcTcwqbEzwWk00iiYqh9MIATQgx7gwo8BwXwNz8N0/uhiaYYap0emprp7P63nqebq6ftX96Zqu+tavqrrGKysrj2nfrPbscb/nHvfOnd3NvDg/3wF/65VX3N198uTJXlhY6L179/YHH3zQ3d0feughnzJliru7T58+3e+//353d3/55Zd97Nix7u7ev39/LykpcXf3HTt2uPvRy+H222/3qVOn1sTYvn27u7v37t3by8rK3N1927Zt7u6+f/9+79evn2/dutXd3QF//vnn3d192rRpfu+996ZjyYiEk7IOJcD75+T4vrvu8l2lpTXbkGuuucaffvppr6io8OHDh/uWLVvc3X3u3Lk+efJkd3e/4IILvKioyN3dgQTwBjAkOcpeT6k5h8eBXOCk4HFnYC1gwGlAFTAomPY7YKKnsQ5m4qDaHFO16lKiY0fvf8opvm/z5pZTm2sp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)
%% Cell type:code id: tags:
``` python
from joblib import load
df = load('predicted_datasets/pred_sv_cv_med_bal_0.2_r.joblib')
df
```
%%%% Output: execute_result
raw title \
88291 Dr. Early studied medicine at the University ... physician
103769 He is currently associated with shri hariram ... dentist
38044 She graduated with honors in 1998. Having mor... psychologist
10623 He also performs face lift, eyelid surgery, t... surgeon
82458 His average patient rating is 4.0 stars out o... physician
... ... ...
96664 Dr. Bui is compassionate, understanding, and ... dentist
57196 In his practice, Dr. Karur focuses on cancer ... physician
74801 Before setting up his current practice he wor... psychologist
109001 He is currently the medical team leader for M... nurse
4635 She has taught pharmacology, lab chemistry, h... physician
predicted gender
88291 physician F
103769 dentist M
38044 psychologist F
10623 surgeon M
82458 physician M
... ... ...
96664 dentist F
57196 physician M
74801 psychologist M
109001 physician M
4635 physician F
[22493 rows x 4 columns]
......
......@@ -9,123 +9,123 @@ from joblib import dump, load
def main(load_data_from_saved, embedding_train, model_train, predict, evaluate, class_group, sampling, embedding, model, test_size, masking):
print({'load_data_from_saved':load_data_from_saved, 'embedding_train':embedding_train, 'model_train':model_train, 'predict':predict, 'evaluate':evaluate, 'class_group':class_group, 'sampling':sampling, 'embedding':embedding, 'model':model, 'test_size':test_size, 'masking':masking})
print("processing train.main ...")
data = pd.DataFrame(load_data(class_group=class_group, from_saved=load_data_from_saved))
print({'load_data_from_saved':load_data_from_saved, 'embedding_train':embedding_train, 'model_train':model_train, 'predict':predict, 'evaluate':evaluate, 'class_group':class_group, 'sampling':sampling, 'embedding':embedding, 'model':model, 'test_size':test_size, 'masking':masking})
print("processing train.main ...")
data = pd.DataFrame(load_data(class_group=class_group, from_saved=load_data_from_saved))
train_set,test_set = data_selection(data, class_group, sampling, test_size)
train_set,test_set = data_selection(data, class_group, sampling, test_size)
# TO-DO:
# no-model_train but embedding_train true
# training
if model_train:
if embedding_train:
X_train = embedding_fit_transform(train_set[MASKED[masking]], embedding, class_group, sampling, test_size, masking)
else:
print("processing preprocessing.embedding_transform ...")
X_train = embedding_transform(train_set[MASKED[masking]], embedding, class_group, sampling, test_size, masking)
# TO-DO:
# no-model_train but embedding_train true
# training
if model_train:
if embedding_train:
X_train = embedding_fit_transform(train_set[MASKED[masking]], embedding, class_group, sampling, test_size, masking)
else:
print("processing preprocessing.embedding_transform ...")
X_train = embedding_transform(train_set[MASKED[masking]], embedding, class_group, sampling, test_size, masking)
Y_train = train_set[TITLE]
model_training(X_train, Y_train, model, embedding, class_group, sampling, test_size, masking)
Y_train = train_set[TITLE]
model_training(X_train, Y_train, model, embedding, class_group, sampling, test_size, masking)
# prediction
if predict:
X_test = embedding_transform(test_set[MASKED[masking]], embedding, class_group, sampling, test_size, masking)
Y_test = test_set[TITLE]
# prediction
if predict:
X_test = embedding_transform(test_set[MASKED[masking]], embedding, class_group, sampling, test_size, masking)
Y_test = test_set[TITLE]
print("processing model.model_prediction ...")
pred, acc = model_prediction(X_test, Y_test, model, embedding, class_group, sampling, test_size, masking)
predicted_dataset = pd.DataFrame({MASKED[masking]:test_set[MASKED[masking]], TITLE:test_set[TITLE], 'predicted':pred, 'gender': test_set['gender']})
print("processing model.model_prediction ...")
pred, acc = model_prediction(X_test, Y_test, model, embedding, class_group, sampling, test_size, masking)
predicted_dataset = pd.DataFrame({MASKED[masking]:test_set[MASKED[masking]], TITLE:test_set[TITLE], 'predicted':pred, 'gender': test_set['gender']})
print("\t saving file :",PREDICTED_DATASET[model, embedding, class_group, sampling, test_size, MASKED[masking]])
dump(predicted_dataset, PREDICTED_DATASET[model, embedding, class_group, sampling, test_size, MASKED[masking]] + '.joblib')
print("\t saving file :",PREDICTED_DATASET[model, embedding, class_group, sampling, test_size, MASKED[masking]])
dump(predicted_dataset, PREDICTED_DATASET[model, embedding, class_group, sampling, test_size, MASKED[masking]] + '.joblib')
print("Model accuracy:", acc)
# evaluation
# TO-DO:
# combine the prediction in evaluation to the saved prediction
print("Model accuracy:", acc)
# evaluation
# TO-DO:
# combine the prediction in evaluation to the saved prediction
if evaluate:
if evaluate:
scores = tpr_fpr(test_set, model, embedding, class_group, sampling, test_size, masking)
# scores,x_males,y_males,x_females,y_females = tpr_gender_gap(None,test_set, model, embedding, class_group, sampling, test_size, masking)
print("\t saving file :",EVALUATION_SCORES[model, embedding, class_group, sampling, test_size, MASKED[masking]])
dump(scores,EVALUATION_SCORES[model, embedding, class_group, sampling, test_size, MASKED[masking]] + '.joblib')
print(scores)
# scores,x_males,y_males,x_females,y_females = tpr_gender_gap(None,test_set, model, embedding, class_group, sampling, test_size, masking)
print("\t saving file :",EVALUATION_SCORES[model, embedding, class_group, sampling, test_size, MASKED[masking]])
dump(scores,EVALUATION_SCORES[model, embedding, class_group, sampling, test_size, MASKED[masking]] + '.joblib')
print(scores)
'''
load_data_from_saved -> True if saved data to be used and False if new data to be taken
embedding_train -> True to train new embedding and False to use the saved one
model_train -> True to train new model and False to use the saved one
predict -> True to perform predictions on the test set and False otherwise
evaluate -> True to perform bias evaluations on the test set and False otherwise
class_group -> choice of domain of occupations ('trial','medical')
sampling -> choice of sampling ('random', 'balanced')
embedding -> choice of embeddings to be used ('cv': count_vectorize(self-trained), 'w2v': word2vec_embedding(pre-trained), 'self_w2v':w2v(self-trained))
model -> choice of models to be trained ('svm', 'rf', 'nn')
test_size -> proportion of data to be used for tesing
masking -> True for 'bio' data and False for 'raw' data
load_data_from_saved -> True if saved data to be used and False if new data to be taken
embedding_train -> True to train new embedding and False to use the saved one
model_train -> True to train new model and False to use the saved one
predict -> True to perform predictions on the test set and False otherwise
evaluate -> True to perform bias evaluations on the test set and False otherwise
class_group -> choice of domain of occupations ('trial','medical')
sampling -> choice of sampling ('random', 'balanced')
embedding -> choice of embeddings to be used ('cv': count_vectorize(self-trained), 'w2v': word2vec_embedding(pre-trained), 'self_w2v':w2v(self-trained))
model -> choice of models to be trained ('svm', 'rf', 'nn')
test_size -> proportion of data to be used for tesing
masking -> True for 'bio' data and False for 'raw' data
'''
if __name__ == "__main__":
import time
start_time = time.time()
import argparse
# Initialize parser
parser = argparse.ArgumentParser()
# Adding optional argument
parser.add_argument('--feature', dest='feature', action='store_true')
parser.add_argument('--no-feature', dest='feature', action='store_false')
parser.set_defaults(feature=True)
parser.add_argument("--load_data_from_saved", dest = 'load_data_from_saved',action='store_true', help = "if saved data to be used ")
parser.add_argument("--no-load_data_from_saved", dest = 'load_data_from_saved',action='store_false', help = "if new data to be taken")
parser.set_defaults(load_data_from_saved=False)
parser.add_argument("--embedding_train", dest='embedding_train',action='store_true',help = "to train new embedding")
parser.add_argument("--no-embedding_train", dest='embedding_train',action='store_false', help = "to use the saved embedding")
parser.set_defaults(embedding_train=True)
parser.add_argument("--model_train", dest='model_train',action='store_true', help = "to train new model")
parser.add_argument("--no-model_train", dest='model_train',action='store_false', help = "to use the saved model")
parser.set_defaults(model_train=True)
parser.add_argument("--predict", dest='predict',action='store_true', help = "to perform predictions on the test set")
parser.add_argument("--no-predict", dest='predict',action='store_false', help = "otherwise")
parser.set_defaults(predict=True)
parser.add_argument("--evaluate", dest='evaluate',action='store_true', help = "to perform bias evaluations on the test set")
parser.add_argument("--no-evaluate", dest='evaluate',action='store_false', help = "otherwise")
parser.set_defaults(evaluate=True)
parser.add_argument("--masking", dest='masking',action='store_true', help = "for 'bio' data")
parser.add_argument("--no-masking", dest='masking',action='store_false', help = "for 'raw' data")
parser.add_argument("--class_group", default='medical', required=True, help = "choice of domain of occupations ('trial','medical')")
parser.add_argument("--sampling", required=True, help = "choice of sampling ('random', 'balanced')")
parser.add_argument("--embedding", required=True, help = "choice of embeddings to be used ('cv': count_vectorize(self-trained), 'w2v': word2vec_embedding(pre-trained), 'self_w2v':w2v(self-trained), 'elmo':elmo(pre-trained))")
parser.add_argument("--model", default= 'svm', required=True, help = "choice of models to be trained ('svm', 'rf', 'nn')")
parser.add_argument("--test_size", default = 0.2, required=True, help = "proportion of data to be used for tesing")
# Read arguments from command line
args = parser.parse_args()
if args.load_data_from_saved:
print("Displaying load_data_from_saved as: % s" % args.load_data_from_saved)
import time
start_time = time.time()
import argparse
# Initialize parser
parser = argparse.ArgumentParser()
# Adding optional argument
parser.add_argument('--feature', dest='feature', action='store_true')
parser.add_argument('--no-feature', dest='feature', action='store_false')
parser.set_defaults(feature=True)
parser.add_argument("--load_data_from_saved", dest = 'load_data_from_saved',action='store_true', help = "if saved data to be used ")
parser.add_argument("--no-load_data_from_saved", dest = 'load_data_from_saved',action='store_false', help = "if new data to be taken")
parser.set_defaults(load_data_from_saved=False)
parser.add_argument("--embedding_train", dest='embedding_train',action='store_true',help = "to train new embedding")
parser.add_argument("--no-embedding_train", dest='embedding_train',action='store_false', help = "to use the saved embedding")
parser.set_defaults(embedding_train=True)
parser.add_argument("--model_train", dest='model_train',action='store_true', help = "to train new model")
parser.add_argument("--no-model_train", dest='model_train',action='store_false', help = "to use the saved model")
parser.set_defaults(model_train=True)
parser.add_argument("--predict", dest='predict',action='store_true', help = "to perform predictions on the test set")
parser.add_argument("--no-predict", dest='predict',action='store_false', help = "otherwise")
parser.set_defaults(predict=True)
parser.add_argument("--evaluate", dest='evaluate',action='store_true', help = "to perform bias evaluations on the test set")
parser.add_argument("--no-evaluate", dest='evaluate',action='store_false', help = "otherwise")
parser.set_defaults(evaluate=True)
parser.add_argument("--masking", dest='masking',action='store_true', help = "for 'bio' data")
parser.add_argument("--no-masking", dest='masking',action='store_false', help = "for 'raw' data")
parser.add_argument("--class_group", default='medical', required=True, help = "choice of domain of occupations ('trial','medical')")
parser.add_argument("--sampling", required=True, help = "choice of sampling ('random', 'balanced')")
parser.add_argument("--embedding", required=True, help = "choice of embeddings to be used ('cv': count_vectorize(self-trained), 'w2v': word2vec_embedding(pre-trained), 'self_w2v':w2v(self-trained), 'elmo':elmo(pre-trained))")
parser.add_argument("--model", default= 'svm', required=True, help = "choice of models to be trained ('svm', 'rf', 'nn')")
parser.add_argument("--test_size", default = 0.2, required=True, help = "proportion of data to be used for tesing")
# Read arguments from command line
args = parser.parse_args()
if args.load_data_from_saved:
print("Displaying load_data_from_saved as: % s" % args.load_data_from_saved)
main(load_data_from_saved = args.load_data_from_saved,
embedding_train = args.embedding_train,
model_train = args.model_train,
predict = args.predict,
evaluate = args.evaluate,
class_group = args.class_group,
sampling = args.sampling,
embedding = args.embedding,
model = args.model,
test_size = float(args.test_size),
masking = args.masking)
print("\n--- %s seconds ---" % (time.time() - start_time))
main(load_data_from_saved = args.load_data_from_saved,
embedding_train = args.embedding_train,
model_train = args.model_train,
predict = args.predict,
evaluate = args.evaluate,
class_group = args.class_group,
sampling = args.sampling,
embedding = args.embedding,
model = args.model,
test_size = float(args.test_size),
masking = args.masking)
print("\n--- %s seconds ---" % (time.time() - start_time))
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment