|
|
--- |
|
|
library_name: transformers |
|
|
license: apache-2.0 |
|
|
base_model: bert-base-uncased |
|
|
tags: |
|
|
- generated_from_trainer |
|
|
datasets: |
|
|
- financial_phrasebank |
|
|
metrics: |
|
|
- f1 |
|
|
model-index: |
|
|
- name: FIN_BERT_sentiment |
|
|
results: |
|
|
- task: |
|
|
type: text-classification |
|
|
name: Text Classification |
|
|
dataset: |
|
|
name: financial_phrasebank |
|
|
type: financial_phrasebank |
|
|
config: sentences_66agree |
|
|
split: train |
|
|
args: sentences_66agree |
|
|
metrics: |
|
|
- type: f1 |
|
|
value: 0.8890693407692588 |
|
|
name: F1 |
|
|
--- |
|
|
|
|
|
<!-- This model card has been generated automatically according to the information the Trainer had access to. You |
|
|
should probably proofread and complete it, then remove this comment. --> |
|
|
|
|
|
# FIN_BERT_sentiment |
|
|
|
|
|
This model is a fine-tuned version of [bert-base-uncased](https://huggingface.co/bert-base-uncased) on the financial_phrasebank dataset. |
|
|
It achieves the following results on the evaluation set: |
|
|
- Loss: 0.4905 |
|
|
- F1: 0.8891 |
|
|
- Acc: 0.8886 |
|
|
|
|
|
## Model description |
|
|
|
|
|
More information needed |
|
|
|
|
|
## Intended uses & limitations |
|
|
|
|
|
More information needed |
|
|
|
|
|
## Training and evaluation data |
|
|
|
|
|
More information needed |
|
|
|
|
|
## Training procedure |
|
|
|
|
|
### Training hyperparameters |
|
|
|
|
|
The following hyperparameters were used during training: |
|
|
- learning_rate: 2e-05 |
|
|
- train_batch_size: 16 |
|
|
- eval_batch_size: 16 |
|
|
- seed: 42 |
|
|
- optimizer: Use adamw_torch with betas=(0.9,0.999) and epsilon=1e-08 and optimizer_args=No additional optimizer arguments |
|
|
- lr_scheduler_type: linear |
|
|
- num_epochs: 5 |
|
|
|
|
|
### Training results |
|
|
|
|
|
| Training Loss | Epoch | Step | Validation Loss | F1 | Acc | |
|
|
|:-------------:|:-----:|:----:|:---------------:|:------:|:------:| |
|
|
| 0.5295 | 1.0 | 211 | 0.3757 | 0.8731 | 0.8720 | |
|
|
| 0.2174 | 2.0 | 422 | 0.3117 | 0.8911 | 0.8910 | |
|
|
| 0.1129 | 3.0 | 633 | 0.4066 | 0.8886 | 0.8874 | |
|
|
| 0.0459 | 4.0 | 844 | 0.4923 | 0.8896 | 0.8886 | |
|
|
| 0.0275 | 5.0 | 1055 | 0.4905 | 0.8891 | 0.8886 | |
|
|
|
|
|
|
|
|
### Framework versions |
|
|
|
|
|
- Transformers 4.46.2 |
|
|
- Pytorch 2.5.1 |
|
|
- Datasets 3.1.0 |
|
|
- Tokenizers 0.20.3 |
|
|
|
|
|
## Code to use model as pipeline classifier |
|
|
|
|
|
|
|
|
```python |
|
|
import matplotlib.pyplot as plt |
|
|
import plotly.graph_objects as go |
|
|
from IPython.display import display, HTML |
|
|
import numpy as np |
|
|
from transformers import pipeline |
|
|
%matplotlib inline |
|
|
|
|
|
# Pipelines |
|
|
classifier = pipeline("text-classification", model="Sharpaxis/Finance_DistilBERT_sentiment", top_k=None) |
|
|
pipe = pipeline("text-classification", model="Sharpaxis/News_classification_distilbert") |
|
|
|
|
|
def finance_text_predictor(text): |
|
|
text = str(text) |
|
|
out = classifier(text)[0] |
|
|
type_news = pipe(text)[0] |
|
|
|
|
|
# Display news type and text in HTML |
|
|
if type_news['label'] == 'LABEL_1': |
|
|
display(HTML(f""" |
|
|
<div style="border: 2px solid red; padding: 10px; margin: 10px; background-color: #ffe6e6; color: black; font-weight: bold;"> |
|
|
IMPORTANT TECH/FIN News<br> |
|
|
<div style="margin-top: 10px; font-weight: normal; font-size: 14px; color: darkred;">{text}</div> |
|
|
</div> |
|
|
""")) |
|
|
elif type_news['label'] == 'LABEL_0': |
|
|
display(HTML(f""" |
|
|
<div style="border: 2px solid green; padding: 10px; margin: 10px; background-color: #e6ffe6; color: black; font-weight: bold;"> |
|
|
NON IMPORTANT NEWS<br> |
|
|
<div style="margin-top: 10px; font-weight: normal; font-size: 14px; color: darkgreen;">{text}</div> |
|
|
</div> |
|
|
""")) |
|
|
|
|
|
# Sentiment analysis scores |
|
|
scores = [sample['score'] for sample in out] |
|
|
labels = [sample['label'] for sample in out] |
|
|
label_map = {'LABEL_0': "Negative", 'LABEL_1': "Neutral", 'LABEL_2': "Positive"} |
|
|
sentiments = [label_map[label] for label in labels] |
|
|
|
|
|
print("SCORES") |
|
|
for i in range(len(scores)): |
|
|
print(f"{sentiments[i]} : {scores[i]:.4f}") |
|
|
|
|
|
print(f"Sentiment of text is {sentiments[np.argmax(scores)]}") |
|
|
|
|
|
# Bar chart for sentiment scores |
|
|
fig = go.Figure( |
|
|
data=[go.Bar(x=sentiments, y=scores, marker=dict(color=["red", "blue", "green"]), width=0.3)] |
|
|
) |
|
|
fig.update_layout( |
|
|
title="Sentiment Analysis Scores", |
|
|
xaxis_title="Sentiments", |
|
|
yaxis_title="Scores", |
|
|
template="plotly_dark" |
|
|
) |
|
|
fig.show() |