from EvoMSA import DenseBoW
from microtc.utils import tweet_iterator
from IngeoML import SelectFromModelCV
from sklearn.metrics import recall_score
from wordcloud import WordCloud
import numpy as np
import pandas as pd
import umap
import textwrap
from matplotlib import pylab as plt
import seaborn as sns
import plotly.express as px
9 Visualización
El objetivo de la unidad es
Paquetes usados
Video explicando la unidad
9.1 Introducción
El conjunto de datos se puede conseguir en la página de Delitos aunque en esta dirección es necesario poblar los textos dado que solamente se encuentra el identificador del Tweet.
Para leer los datos del conjunto de entrenamiento y prueba se utilizan las siguientes instrucciones. En la variable D
se tiene los datos que se utilizarán para entrenar el clasificador basado en la bolsa de palabras y en Dtest
los datos del conjunto de prueba, que son usados para medir el rendimiento del clasificador.
= 'delitos/delitos_ingeotec_Es_train.json'
fname = 'delitos/delitos_ingeotec_Es_test.json'
fname_test = list(tweet_iterator(fname))
D = list(tweet_iterator(fname_test)) Dtest
9.2 Representación
= DenseBoW(lang='es', dataset=False,
dense =True, keyword=True,
emoji=15,
voc_size_exponent=dict(dual='auto')) estimator_kwargs
= dict(estimator=dense.estimator_class(**dense.estimator_kwargs),
kwargs =lambda y, hy: recall_score(y, hy))
scoring= dense.select(D=D, feature_selection=SelectFromModelCV,
_ =kwargs)
feature_selection_kwargs= dense.transform(D) X_dense
9.3 Proyección con UMAP
= umap.UMAP(n_neighbors=5)
reducer = reducer.fit_transform(X_dense) low_dim
Código
= pd.DataFrame(low_dim, columns=['x', 'y'])
df 'Clase'] = ['P' if x['klass'] else 'N' for x in D]
df['text'] = [x['text'] for x in D]
df[= sns.relplot(df, kind='scatter', hue='Clase', x='x', y='y')
fig =False, top=False,
fig.tick_params(bottom=False, right=False,
left=False, labelleft=False)
labelbottomset(xlabel=None, ylabel=None) fig.
dense.fit(D)= dense.transform(Dtest) X_dense
= dense.decision_function(Dtest).flatten() df_dis
Código
= pd.DataFrame(reducer.transform(X_dense), columns=['x', 'y'])
df 'Distancia'] = df_dis
df[= np.r_[[x['klass'] for x in Dtest]] == np.where(df_dis >= 0, 1, 0)
acc 'Acierto'] = acc
df['text'] = ['<br>'.join(textwrap.wrap(x['text']))
df[for x in Dtest]
'Clase'] = ['P' if x['klass'] else 'N' for x in Dtest]
df[= px.scatter(df, x='x', y='y',
fig ='Distancia',
color=df)
custom_data=['circle' if x else 'x' for x in acc],
fig.update_traces(marker_symbol='Acierto: %{customdata[3]} <br>Clase: %{customdata[5]} <extra>%{customdata[4]}</extra>',
hovertemplate=dict(type='scatter'))
selector={'visible': True, 'showticklabels': False},
fig.update_layout(yaxis={'visible': True, 'showticklabels': False},
xaxis=None, yaxis_title=None)
xaxis_title fig.show()