dannel-name2gender / modelo /modelo_prediccion_genero_ml_dt.py
Dannel's picture
Upload folder using huggingface_hub
51f2e05 verified
# -*- coding: utf-8 -*-
"""
Archivo Python adaptado desde el notebook de databricks dispuesto desde el servicio de Azure-Data Sandbox
Created on Mon Feb 15 22:14:16 2021
@author: Carlos Delgado
"""
## Configrurando el storage account key
storage_account_name = "Storage Account"
storage_account_key = "Storage Account Key"
container = "Storage Account Source Container"
container_raw = "Storage Account Source Container Raw"
dbutils.fs.ls("abfss://[email protected]/OTROS/SNR/JSON/")
dbutils.fs.ls("abfss://[email protected]/OTROS/SNR/nombres_entrenamiento_espanol_filtrados/")
# Algoritmo adaptado basado en https://nlpforhackers.io/introduction-machine-learning/ y adaptado del repositorio https://github.com/Jcharis/Python-Machine-Learning/tree/master/Gender%20Classification%20With%20%20Machine%20Learning
#importando librerias iniciales de administracion de datos
import pandas as pd
import numpy as np
#importando libreria y paquedes de ML desde Scikit-learn
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction import DictVectorizer
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from pyspark.sql.functions import *
from pyspark.sql.types import *
df_original = spark.read.csv("abfss://[email protected]/OTROS/SNR/nombres_entrenamiento_espanol_filtrados/nombres_entrenamiento_filtrados_v2.csv",header=True)
display(df_original)
#almacenando los nombres por genero a pandas dataframes
df_pd_nombres_mf_general = df_original.select("*").toPandas()
df_pd_nombres_mf_general.head()
# Limpieza de datos
# Verificando consistencia de columnnas
print(df_pd_nombres_mf_general.columns)
# Verificando tipos de datos
print(df_pd_nombres_mf_general.dtypes)
# Verificando valores nulos
print(df_pd_nombres_mf_general.isnull().isnull().sum())
# Numero de nombres femeninos
print("Numero de nombres femeninos: %s" %(len(df_pd_nombres_mf_general[df_pd_nombres_mf_general.SEXO == 'FEMENINO'])))
# Numero de nombres masculinos
print("Numero de nombres masculinos: %s" %(len(df_pd_nombres_mf_general[df_pd_nombres_mf_general.SEXO == 'MASCULINO'])))
df_names = df_pd_nombres_mf_general
# Remplazando con ceros y unos.
df_names.SEXO.replace({'FEMENINO':0,'MASCULINO':1},inplace=True)
df_names.SEXO.unique()
df_names.dtypes
Xfeatures = df_pd_nombres_mf_general['PRIMER_NOMBRE']
#Extraccion de las caracter铆sticas del df vectorizando
cv = CountVectorizer()
X = cv.fit_transform(Xfeatures.values.astype('U')) #Con el fin de no generar problemas en nombres con determinados carcateres
cv.get_feature_names()
# Conformando el diccionario con la extraccion de las primeras y ultimas letras de cada uno de los nombres
def features(name):
name = name.lower()
return {
'first-letter': name[0], # Primera letra
'first2-letters': name[0:2], # Primeras 2 letras
'first3-letters': name[0:3], # Primeras 3 letras
'last-letter': name[-1], # Ultima letra
'last2-letters': name[-2:], # Ultimas dos letras
'last3-letters': name[-3:], # Ultimas tres letras
}
# Vectorize the features function
features = np.vectorize(features)
#Ejemplo
print(features(["Anna", "Camilo", "Antonio","Margarita","Judith","Samuel"]))
#Extrayendo las caracter铆sticas para el conjunto de datos vectorizado
df_X = features(df_names['PRIMER_NOMBRE'].values.astype('U'))
df_y = df_names['SEXO']
#Ejemplo
arreglo = features(["Mike", "Julia"])
dv = DictVectorizer()
dv.fit(arreglo)
transformed = dv.transform(arreglo)
print(transformed)
dv.get_feature_names()
# Partiendo porcentaje de entrenamiento y testeo
dfX_train, dfX_test, dfy_train, dfy_test = train_test_split(df_X, df_y, test_size=0.2, random_state=42)
dfX_train
dv = DictVectorizer()
dv.fit_transform(dfX_train)
#Definicion del clasificador Decision Trees
dclf = DecisionTreeClassifier()
my_xfeatures = dv.transform(dfX_train)
dclf.fit(my_xfeatures, dfy_train)
#Creacion de la funcion para mayor facilidad
def prediccionGenero(a):
test_name1 = [a]
transform_dv =dv.transform(features(test_name1))
vector = transform_dv.toarray()
if dclf.predict(vector) == 0:
#print("Female")
return "FEMENINO"
else:
#print("Male")
return("MASCULINO")
#Calculando precisi贸n (Accuracy) del modelo teniendo en cuenta los datos de entrenamiento
print("Accuracy sobre los datos de entrenamiento: %s" %(dclf.score(dv.transform(dfX_train), dfy_train)))
#Calculando precisi贸n (Accuracy) del modelo teniendo en cuenta los datos testeo
print("Accuracy sobre los datos de testeo: %s" %(dclf.score(dv.transform(dfX_test), dfy_test)))
dbutils.fs.mount(
source = "wasbs://[email protected]",
mount_point = "/mnt/auxiliar_2",
extra_configs = {"fs.azure.account.key.stupramonitoreomercado.blob.core.windows.net":"GlhaYCap6LQYbAwFb8PF3nzT3iPsjbTV6DmMB8rG08ms4R4KPcBn2Y3Y0p4OAtLCTqk8NS80y2tfBe0Ga2El7w=="}
)
import pickle
from sklearn.externals import joblib
import tempfile
import os
from joblib import dump, load
s = pickle.dumps(dclf)
classifier2 = pickle.loads(s)
tmpFile = tempfile.NamedTemporaryFile(delete=False)
dump(dclf, tmpFile)
tmpFile.flush()
#print(clf2)
#copiando el modelo en pkl desde el punto de montaje al datalake
dump(classifier2, '/tmp/modelo_gender_pred_dt.pkl')
dbutils.fs.cp('file:/tmp/modelo_gender_pred_dt.pkl', '/mnt/auxiliar_2/OTROS/SNR/modelo_gender_pred_dt_dl.pkl')
dbutils.fs.cp('/mnt/auxiliar_2/OTROS/SNR/modelo_gender_pred_dt_dl.pkl', '/tmp/modelo_gender_pred_dt_saved.pkl', )
display(dbutils.fs.ls ("/tmp/"))
classifier_Final = joblib.load('/dbfs/tmp/modelo_gender_pred_dt_saved.pkl')
#leyendo el archivo desde el json del storage y alamcenandolo como pandas dataframe
dbutils.fs.ls("abfss://[email protected]/OTROS/SNR/")
#df_from_json = spark.read.json("abfss://[email protected]/OTROS/SNR/nombres_apellido_nombre.json")
#df_from_json = spark.read.json("abfss://[email protected]/OTROS/SNR/nombres_comunes_masculino_femenino.json")
df_from_json = spark.read.json("abfss://[email protected]/OTROS/SNR/intervinientes_clean_sexo_nombres_rurales_pendientes_modelo_similaridad.json")
display(df_from_json)
df_to_predict = df_from_json.select("*").toPandas()
df_to_predict.head()
#Prediccion de los nuevos nombres que se le presentan al modelo
final_gender = []
#for item in df_to_predict.NOMBRES:
for item in df_to_predict.PRIMER_NOMBRE:
#print("Nombre: %s ---- Genero: %s" %(item,clf.predict((item, ))))
if pd.isnull(item) == True or item == '':
final_gender.append("")
else:
final_gender.append(prediccionGenero(item))
#Campo donde se almacena la predicci贸n de los nombres
df_to_predict['PREDICCION'] = final_gender
display(df_to_predict)
df_final_Selection = df_to_predict[['id','PRIMER_NOMBRE','SEXO','PREDICCION', 'TIPO_CLASIFICACION']]
df_no_similarity = df_final_Selection[df_final_Selection['TIPO_CLASIFICACION'].isnull()]
df_no_similarity['TIPO_CLASIFICACION'] = 'MODELO_ML'
df_no_similarity.SEXO = np.where(df_no_similarity.SEXO.isnull(), df_no_similarity.PREDICCION, df_no_similarity.SEXO)
final_table_to_export = df_no_similarity[['id','PRIMER_NOMBRE','SEXO','TIPO_CLASIFICACION']]
display(df_final_Selection)
display(final_table_to_export)
print("Numero de nombres que fueron predecidos: %s" %(len(final_table_to_export)))
#Guardando los reusltados de la predicci贸n en CSV hacia el data lake
#df_to_predict.to_csv('/tmp/Prediccion_nombres_apellido_nombre.csv', index=False)
df_to_predict.to_csv('/tmp/prediccion_intervinientes_clean_sexo_nombres_rurales_pendientes_modelo_ml_v1.csv', index=False)
dbutils.fs.cp('file:/tmp/prediccion_intervinientes_clean_sexo_nombres_rurales_pendientes_modelo_ml_v1.csv', '/mnt/auxiliar_2/OTROS/SNR/prediccion_intervinientes_clean_sexo_nombres_rurales_pendientes_modelo_ml_v1.csv')