En otro artículo realizamos un ejercicio de análisis de sentimientos en NLP y, en este caso, realizaremos el entrenamiento de dicho ejercicio.
Entrenamiento de ejercicio de análisis de sentimientos
Ya que tenemos nuestras palabras preprocesadas y con el TfIdf, vamos a hacer el entrenamiento de las mismas.
Vamos a establecer un hiperparámetro para realizar la regularización del algoritmo en nuestro entrenamiento de ejercicio de análisis de sentimientos.
Lo que haremos, entonces, es realizar diferentes iteraciones, entrenar y obtener la precisión.
#Entrenamiento de ejercicio de análisis de sentimientos
c_params = [0.01, 0.05, 0.25, 0.5, 1, 10, 100, 1000, 10000]
train_acc = list ()
test_acc = list ()
for c in c_params:
lr = LogisticRegression (C = c, solver = 'lbfgs', max_iter = 500)
lr.fit (X_train_, y_train)
train_predict = lr.predict (X_train_)
test_predict = lr.predict (X_test_)
print ("Accuracy for C = {}: {}".format (c, accuracy_score (y_test, test_predict)))
train_acc.append (accuracy_score (y_train, train_predict))
test_acc.append (accuracy_score (y_test, test_predict))
Accuracy for C = 0.01: 0.6579738144329897
Accuracy for C = 0.05: 0.6579938144329897
Accuracy for C = 0.25: 0.688659793814433
Accuracy for C = 0.5: 0.7391752577319588
Accuracy for C = 1: 0.7680412371134021
Accuracy for C = 10: 0.77319587628866
Accuracy for C = 100: 0.7628865979381443
Accuracy for C = 1000: 0.7649484536082474
Accuracy for C = 10000: 0.7618556701030927
Aquí podríamos probar otro algoritmo, si quisiéramos.
Algunas métricas
Para cada uno de los algoritmos que hemos entrenado, vamos a ver las medias que obtenemos:
#Entrenamiento de ejercicio de análisis de sentimientos
print ('Confussion matrix: \n{}'.format (confusion_matrix (y_test, test_predict)))
print ('\nClassification report: \n{}'.format (classification_report (y_test, test_predict)))
print ('Accuracy score_ {}'.format (accuracy_score (y_test, test_predict)))
Confussion matrix:
[[198 132]
[ 99 541]]
Classification report:
precision | recall | f1 – score | support | |
0 | 0.67 | 0.60 | 0.63 | 330 |
1 | 0.80 | 0.85 | 0.82 | 640 |
accuracy | 0.76 | 970 | ||
macro avg | 0.74 | 0.72 | 0.73 | 970 |
weighted avg | 0.76 | 0.76 | 0.76 | 970 |
Accuracy score: 0.7618556701030927
Podemos inferir de la tabla anterior que el algoritmo es bastante flojo cuando se trata de reviews negativas, ya que la precisión es bastante baja.
#Entrenamiento de ejercicio de análisis de sentimientos
plt.figure (figsize = (12, 8))
plt.plot (train_acc, label = 'train')
plt.plot (test_acc, label = 'test')
plt.axvline (np.argmax (test_acc), c = 'g', ls = ' - - ', alpha = 0.8)
plt.title ('Accuracy evolution for different C values')
plt.xlabel ('C')
plt.ylabel ('Accuracy')
plt.legend ()
plt.grid ()
plt.xticks (list (range (len (c_params))), c_params)
plt.tight_layout ()
plt.show ()
Aquí vemos cómo evoluciona el performance en función del parámetro que hemos propuesto inicialmente. Vemos, por ejemplo, que en el punto 10 es cuando más se estabiliza; este podría considerarse el valor óptimo.
Predict
Ahora haremos la predicción:
#Entrenamiento de ejercicio de análisis de sentimientos
def predic_review_sentiment (review_index, model):
print ('Actual sentiment: {}'.format (df.iloc [review_index] ['sentiment_label']))
r = df.iloc [review_index] ['review']
print ('Prediction: {}'.format (lr.predict (cv.transform ([r]))))
#Entrenamiento de ejercicio de análisis de sentimientos
for i in random.sample (range (0, len (df)), 5):
print ('\nReview no. {}'.format (i))
predict_review_sentiment (i, lr)
Review no. 1402
Actual sentiment: 0
Prediction: [0]
Review no. 96
Actual sentiment: 1
Prediction: [0]
Review no. 2720
Actual sentiment: 1
Prediction: [1]
Review no. 1518
Actual sentiment: 1
Prediction: [1]
Review no. 1493
Actual sentiment: 1
Prediction: [1]
Con estos resultados vemos que en algunos casos se ha hecho una predicción acertada, mientras que en otros se ha equivocado. Lo importante es evaluar correctamente el modelo para obtener no los resultados que queremos, sino resultados reales.
En este caso se podría usar también un GridSearch para hacer la optimización de parámetros. En nuestro caso, por poner algo sencillo, hicimos la optimización en el entrenamiento lo más sencilla posible.
De hecho, GridSearch tiene más sentido cuando, más que un parámetro, son varios. Además de esto, tiene la capacidad de hacer la evaluación él solo.
Así pues, hemos terminado nuestro ejercicio de análisis de sentimientos. Vemos cómo aplicando tfidf se simplifica muchísimo a la hora de entrenar. Con este método hemos abreviado el proceso, dado que en computación no ha tardado prácticamente nada y los resultados son bastante buenos. Esto demuestra que este método es mucho más eficiente que si pasamos el texto como tal, cosa que en este caso no podríamos hacer.
Tras este entrenamiento de ejercicio de análisis de sentimientos, si quieres seguir aprendiendo y acceder a las opciones laborales del Big Data, uno de los mercados con mayor demanda y mejores sueldos, tenemos para ti el Big Data, Inteligencia Artificial & Machine Learning Full Stack Bootcamp. Con la guía de esta formación intensiva adquirirás los conocimientos tanto teóricos como prácticos imprescindibles para abrirte paso en el mundillo IT en pocos meses. ¡Atrévete a dar el paso que transformará tu futuro y entra ya para solicitar más información!