Ho iniziato la mia analisi ottenendo dati da HuggingFace. Il set di dati viene chiamato relazioni-finanziarie-sec (Questo set di dati ha la licenza Apache 2.0 e autorizzazioni per uso commerciale) e, secondo gli autori del set di dati, contiene i rapporti annuali delle società pubbliche statunitensi che depositano presso la SEC Sistema EDGAR dal 1993 al 2020. Ogni relazione annuale (archiviazione 10-K) è divisa in 20 sezioni.

Due attributi rilevanti di questi dati sono utili per l’attività corrente:

  • Frase: Estratti dai rapporti di deposito 10-K
  • Sezione: Etichette che indicano la sezione del deposito 10-K a cui appartiene la sentenza

Mi sono concentrato su tre sezioni:

  • Affari (voce 1): descrive l’attività dell’azienda, comprese le filiali, i mercati, gli eventi recenti, la concorrenza, le normative e il lavoro. Indicato con 0 nei dati.
  • Fattori di rischio (voce 1A): discute i rischi che potrebbero avere un impatto sulla società, come fattori esterni, potenziali fallimenti e altre informazioni per avvisare gli investitori. Indicato con 1.
  • Proprietà (voce 2): dettaglia i beni immobiliari fisici significativi. Non include beni intellettuali o immateriali. Indicato con 3.

Per ogni etichetta, ho campionato 10 esempi senza sostituzione. I dati sono strutturati come segue:

Una volta che i dati sono pronti, tutto quello che devo fare è creare una funzione di classificazione che prenda la frase dal dataframe e preveda l’etichetta.

Role = '''
You are expert in SEC 10-K forms.
You will be presented by a text and you need to classify the text into either 'Item 1', 'Item 1A' or 'Item 2'.
The text only belongs to one of the mentioned categories so only return one category.
'''
def sec_classifier(text):

response = openai.ChatCompletion.create(
model='gpt-4',
messages=(
{
"role": "system",
"content": Role},
{
"role": "user",
"content": text}),
temperature=0,
max_tokens=256,
top_p=1,
frequency_penalty=0,
presence_penalty=0)

return response('choices')(0)('message')('content')

Sto usando GPT-4 qui poiché finora è il modello più capace di OpenAI. Ho anche impostato la temperatura su 0 solo per assicurarmi che il modello non vada fuori traccia. La parte davvero divertente è il modo in cui definisco il ruolo: è lì che posso guidare il modello su ciò che voglio che faccia. Il ruolo gli dice di rimanere concentrato e di fornire il tipo di risultato che sto cercando. Definire un ruolo chiaro per il modello aiuta a generare risposte pertinenti e di alta qualità. La richiesta in questa funzione è:

Sei esperto nei moduli SEC 10-K.
Ti verrà presentato un testo e dovrai classificarlo in “Articolo 1”, “Articolo 1A” o “Articolo 2”.
Il testo appartiene solo a una delle categorie menzionate, quindi restituisci solo una categoria.

Dopo aver applicato la funzione di classificazione a tutte le righe di dati, ho generato un report di classificazione per valutare le prestazioni del modello. Il punteggio F1 medio macro era 0,62, indicando capacità predittive ragionevolmente forti per questo problema multiclasse. Poiché il numero di esempi era equilibrato in tutte e 3 le classi, le medie macro e ponderate convergevano allo stesso valore. Questo punteggio di base riflette la precisione predefinita del modello preaddestrato prima di qualsiasi ulteriore messa a punto o ottimizzazione.

               precision    recall  f1-score   support

Item 1 0.47 0.80 0.59 10
Item 1A 0.80 0.80 0.80 10
Item 2 1.00 0.30 0.46 10

accuracy 0.63 30
macro avg 0.76 0.63 0.62 30
weighted avg 0.76 0.63 0.62 30

Come accennato in precedenza, l’apprendimento a poche riprese consiste nel generalizzare il modello con alcuni buoni esempi. A tal fine, ho modificato la mia classe descrivendo cosa sono Item 1, Item 1A e Item2 (basato su Wikipedia):

Role_fewshot = '''
You are expert in SEC 10-K forms.
You will be presented by a text and you need to classify the text into either 'Item 1', 'Item 1A' or 'Item 2'.
The text only belongs to one of the mentioned categories so only return one category.
In your classification take the following definitions into account:

Item 1 (i.e. Business) describes the business of the company: who and what the company does, what subsidiaries it owns, and what markets it operates in.
It may also include recent events, competition, regulations, and labor issues. (Some industries are heavily regulated, have complex labor requirements, which have significant effects on the business.)
Other topics in this section may include special operating costs, seasonal factors, or insurance matters.

Item 1A (i.e. Risk Factors) is the section where the company lays anything that could go wrong, likely external effects, possible future failures to meet obligations, and other risks disclosed to adequately warn investors and potential investors.

Item 2 (i.e. Properties) is the section that lays out the significant properties, physical assets, of the company. This only includes physical types of property, not intellectual or intangible property.

Note: Only state the Item.
'''
def sec_classifier_fewshot(text):

response = openai.ChatCompletion.create(
model='gpt-4',
messages=(
{
"role": "system",
"content": Role_fewshot},
{
"role": "user",
"content": text}),
temperature=0,
max_tokens=256,
top_p=1,
frequency_penalty=0,
presence_penalty=0)

return response('choices')(0)('message')('content')

Il messaggio ora recita:

Sei esperto nei moduli SEC 10-K.
Ti verrà presentato un testo e dovrai classificarlo in “Articolo 1”, “Articolo 1A” o “Articolo 2”.
Il testo appartiene solo a una delle categorie menzionate, quindi restituisci solo una categoria.
Nella tua classificazione tieni conto delle seguenti definizioni:

L’articolo 1 (ovvero Business) descrive l’attività dell’azienda: chi e cosa fa l’azienda, quali filiali possiede e in quali mercati opera.
Può anche includere eventi recenti, concorrenza, normative e questioni lavorative. (Alcuni settori sono fortemente regolamentati, hanno requisiti di manodopera complessi, che hanno effetti significativi sul business.)
Altri argomenti in questa sezione possono includere costi operativi speciali, fattori stagionali o questioni assicurative.

La voce 1A (ovvero Fattori di rischio) è la sezione in cui la società espone tutto ciò che potrebbe andare storto, probabili effetti esterni, possibili futuri inadempimenti agli obblighi e altri rischi comunicati per avvisare adeguatamente gli investitori e i potenziali investitori.

L’articolo 2 (ovvero Proprietà) è la sezione che illustra le proprietà significative, i beni fisici, della società. Ciò include solo i tipi di proprietà fisica, non la proprietà intellettuale o immateriale.

Se lo eseguiamo sui testi otteniamo le seguenti prestazioni:

                precision    recall  f1-score   support

Item 1 0.70 0.70 0.70 10
Item 1A 0.78 0.70 0.74 10
Item 2 0.91 1.00 0.95 10

accuracy 0.80 30
macro avg 0.80 0.80 0.80 30
weighted avg 0.80 0.80 0.80 30

La media macro La F1 ora è a 0,80, ovvero al 29% miglioramento della nostra previsione, solo fornendo una buona descrizione di ciascuna classe.

Finalmente puoi vedere il set di dati completo:

In effetti, gli esempi che ho fornito forniscono al modello esempi concreti da cui imparare. Gli esempi consentono al modello di dedurre modelli e caratteristiche; esaminando più esempi, il modello può iniziare a notare punti in comune e differenze che caratterizzano il concetto generale appreso. Ciò aiuta il modello a formare una rappresentazione più solida. Inoltre, fornire esempi agisce essenzialmente come una forma debole di supervisione, guidando il modello verso il comportamento desiderato invece di grandi set di dati etichettati.

Nella funzione pochi scatti, esempi concreti aiutano a indirizzare il modello verso i tipi di informazioni e modelli a cui dovrebbe prestare attenzione. In sintesi, gli esempi concreti sono importanti per l’apprendimento “low-shot” in quanto forniscono punti di ancoraggio al modello per costruire una rappresentazione iniziale di un nuovo concetto, che può poi essere perfezionata sui pochi esempi forniti. L’apprendimento induttivo da istanze specifiche aiuta i modelli a sviluppare rappresentazioni sfumate di concetti astratti.

Se ti è piaciuto leggere questo articolo e vuoi restare in contatto, puoi trovarmi sul mio LinkedIn o tramite la mia pagina web: iliateimouri.com

Nota: tutte le immagini, se non diversamente specificato, sono dell’autore.

Fonte: towardsdatascience.com

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *