ABONAMENTE VIDEO REDACȚIA
RO
EN
×
▼ LISTĂ EDIȚII ▼
Numărul 99
Abonament PDF

Cum am folosit Machine Learning pentru a prezice legătura dintre obiceiurile noastre alimentare și COVID-19

Adrian Căliman
Solution Architect @ PitechPlus



Rareș Grozescu
Software Developer @ PitechPlus
PROGRAMARE

Artificial Intelligence, Machine Learning și Deep Learning sunt aceste "buzzwords" care ne uimesc cu aplicabilitatea lor largă: de la clasificări impresionante ale imaginilor ori progrese incredibile în traduceri, până la prezicerea celulelor canceroase.

Dacă veți citi despre istoria acestui nou domeniu, care nu este deloc nou, probabil că vă veți întreba de ce vedem acest hype doar recent. Acest lucru se datorează faptului că în ultimii ani, majoritatea elementelor de bază ale aplicațiilor AI au devenit foarte ușor accesibile:

În compania noastră, oricine își poate petrece timpul de self-learning pentru a învăța sau aprofunda cunoștințele software. Noi, după ce am înțeles teoria din spatele machine learning, am vrut să folosim acest timp pentru a rezolva probleme din lumea reală.

Una dintre preconcepțiile greșite pe care le-am avut despre partea de creare a unei aplicații ML a fost că dezvoltarea reală a modelului și instruirea acestuia reprezintă o parte semnificativă a întregului proces. În realitate, partea care durează cel mai mult este colectarea datelor și transformarea acestora într-o formă structurată.

Fig. 1 - Google Machine Learning Crash Course - Application steps proportions

Cum găsim cel mai adecvat set de date

Deși o mulțime de date sunt disponibile (chiar și gratuit), acestea sunt adesea nestructurate și conțin mult zgomot, iar datele sunt cel mai important factor într-un algoritm ML de succes. La prima vedere, după ce am observat că primul pas este unul atât de mare și important, dar nu neapărat potrivit pentru cineva mai tehnic, părea că avem un blocaj în a ne permite să avem rapid un model ML în funcțional. Ulterior, am descoperit o resursă extraordinară de informații pe kaggle.com. Kaggle are peste 50.000 de seturi de date publice puse la dispoziție de cercetători, specialiști sau oameni obișnuiți într-o mare varietate de domenii. Astfel, dacă am reuși să găsim un set interesant, care în mod ideal are nevoie doar de o cantitate decentă de formatare și procesare pentru a fi gata de utilizare, am putea reduce foarte mult timpul petrecut pentru colectarea datelor.

Alături de AI și ML, care este cel mai comun buzzword pe care îl auzim, din păcate, în această perioadă? COVID-19. Așadar, ni s-a părut oportun să ne exersăm noile abilități și să dăm o mână de ajutor pentru a înțelege mai bine impactul noii pandemii în întreaga lume.

Un set de date pe care l-am găsit și care a bifat cele mai importante criterii pe care le căutam a fost COVID-19 Healthy Diet Dataset. Acest set de date include obiceiurile de consum ale diferitelor tipuri de alimente din 170 de țări din întreaga lume sub formă de fișiere csv. De asemenea, conține populația totală a fiecărei țări și statistici COVID-19 - numărul de cazuri confirmate, decese și recuperări. Datele pentru grupurile alimentare, valorile nutriționale, obezitatea și procentele de subnutriție sunt obținute de pe site-ul Organizației pentru Alimentație și Agricultură a Organizației Națiunilor Unite FAO.

Taskul ridicat de cel care a încărcat setul de date este simplu: să descopere dacă și cum influențează obiceiurile alimentare statisticile COVID-19. Obiceiurile sănătoase de alimentație oferă într-adevăr țărilor un avantaj în lupta cu Coronavirus?

Singurul dezavantaj al acestui set de date este că este destul de mic în termeni ML. Probleme similare necesită pentru rezultate mai precise mii sau mai multe înregistrări. Cu toate acestea, deoarece nu există mii sau zeci de mii de țări la nivel mondial, acesta este un bun punct de plecare pentru a testa ipoteza generală că există o legătură între alimentație și Coronavirus.

Planul nostru a fost să răspundem dacă există caracteristici care influențează direct procentul de decese cauzate de COVID-19 pentru fiecare țară. Planul presupune două abordări diferite:

  1. Algoritm ML - Analiza datelor și identificarea caracteristicilor care arată corelația cu numărul de decese. Pe baza acestora, crearea și antrenarea în mod supervizat a unui model de machine learning care poate prezice procentul de decese pe baza acestor caracteristici. Dacă predicțiile sunt suficient de exacte, înseamnă că există o corelație între ele.

  2. Analiză date - Dacă confirmăm că există o corelație, vom sorta datele pe baza procentului de decese și vom analiza valorile coloanelor cheie identificate pentru țările cu cea mai mare și cele cu cea mai mică rată a mortalității pentru a vedea dacă putem trage și alte concluzii. Acest lucru este detaliat în lucrarea publicată pe platforma Kaggle, pe care o puteți găsi la sfârșitul acestui articol.

Abordarea modelului de Machine learning

Primul pas a fost explorarea setului de date și analiza datelor noastre. Python a fost prima noastră alegere de limbaj de programare, deoarece pachetele numpy și pandas oferă o mulțime de instrumente "out of the box" pentru vizualizarea și procesarea datelor.

După ce am analizat câte înregistrări există, care este valoarea minimă, maximă, valoarea medie și procentul cuantil, ne-am format o idee despre consistența datelor.

Fig. 2 - Result of "describe" dataframe method

Am identificat, totuși, câteva anomalii:

Apoi am trecut la generarea unei matrice care descrie corelația matematică directă între toate coloanele de caracteristici. Deși nu există o caracteristică puternic corelată, am identificat patru caracteristici care au o corelație directă cu coloana Deaths (o valoare de 1 înseamnă o corelație puternică):

Fig. 3 - Visualization of data distribution for Animal Products (ok) and Cereals Excluding Beer (nok)

Pentru aceste valori am proiectat o histogramă pentru a vizualiza distribuția datelor și a vedea dacă este normală sau înclinată. Animal Products, Obesity și Vegetal Products au o distribuție aproximativ normală, dar Cereals - Excluding Beer, pe de altă parte, prezintă o distribuție înclinată (Figura 3).

În continuare, am urmărit normalizarea datelor pentru a obține o distribuție normală și am tratat înregistrările cu valori lipsă. Am identificat nouă înregistrări care nu aveau informații complete în mai multe coloane, în special, nu aveau valori în coloana Deaths. Deoarece această coloană este esențială pentru cercetarea noastră, am decis să excludem înregistrările cu informații lipsă.

Pentru rezolvarea distribuției înclinate a Cereals Excluding Beer, vom aplica metodele de scalare Z-Score și Log scaling la crearea modelului. Vizualizând rezultatele operației de scalare, vedem că datele vor fi distribuite corect, îmbunătățind astfel eficiența modelului.

def zscore(mean, std, val):
epsilon = 0.000001

return (val - mean) / (epsilon + std)

z_score_scaled_feature_names = 
  ['animal_products', 'obesity', 'vegetal_products']

log_scaled_feature_names = ['cereals_excluding_beer']

training_df_copy = training_df.copy()
z_score_scaled_features = training_df_copy[
  z_score_scaled_feature_names].copy()

# Apply z-score on 'Animal Products', 'Obesity' and 
# 'Vegetal Products'
for feature_name in z_score_scaled_feature_names:
  mean = z_score_scaled_features[feature_name].mean()
  std = z_score_scaled_features[feature_name).std()
  z_score_scaled_features[feature_name) = 
    zscore(mean, std, 
    z_score_scaled_features[feature_namel)

  z_score_scaled_features.hist(column=feature_name)

log_scaled_features = training_df_copy[
  log_scaled_feature_names].copy()

for feature_name in log_scaled_feature_names:
# Apply log scaling for 'Cereals - Excluding Beer'
  log_scaled_features[feature_name) = 
    np.log(log_scaled_features[feature_name])

  log_scaled_features.hist(column=feature_name)

Fig. 4 - Results of Z-Score and Log scaling

În același timp, vom actualiza valorile coloanei Deaths pentru a o aduce într-un interval mai adecvat față de cele ale caracteristicilor.

După procesarea datelor am ajuns la caracteristici complete, normal distribuite pentru 160 de țări. Am continuat cu împărțirea datelor în 90% date de instruire și 10% date de testare, oferindu-ne 144 de înregistrări de instruire și 16 înregistrări pentru evaluarea acurateței modelului.

Am ales un model clasic de regresie liniar și l-am implementat folosind TensorFlow și Keras. RootMeanSquaredError a fost folosit ca principală valoare pentru evaluarea performanței modelului.

def create_model(my_learning_rate, input_layer):
"""Create and compile a simple linear regression model."""

model = tf.keras.models.Sequential() 

# Add the layer containing the feature columns 
# to the model. 
model.add(input_layer) 

# Add one linear layer to the model to yield a simple # linear regressor. 
model.add(tf.keras.layers.Dense(units=1, 
  input_shape=(1, )))

# Construct the layers into a model that TensorFlow 
# can execute. 
model.compile(
  optimizer=tf.keras.optimizers.RMSprop
    (lr=my_learning_rate), 
   loss='mean_squared_error', 
   metrics=[tf.keras.metrics.RootMeanSquaredError()],
)

return model

Am observat că 64 de epoci cu un lot de 12 elemente sunt suficiente pentru ca modelul să conveargă. Acum avem un model funcțional care folosește intrări pentru produse de origine animală, cereale cu excepția berii, procentul de obezitate și produse vegetale pentru a prezice rata deceselor cauzate de Coronavirus.

Fig.5 - RMSE progress during model training

Concluzia și următorii pași

Prima concluzie pe care o putem trage: există în mod clar o legătură între aceste caracteristici și rezultatul prezis - procentul de decese.

De asemenea, Cereals excluding beer și Vegetal products au o corelație negativă directă. Creșterea valorilor acestor caracteristici scade procentul de decese. Pe de altă parte, o creștere a produselor de origine animală care nu este însoțită de una în produsele vegetale are o corelație directă pozitivă care duce la un procent mai mare de decese.

În alte cuvinte, țările în care un procent mai mare din populație consumă cereale și produse vegetale tind să aibă un procent mai mic de decese cauzate de Coronavirus.

Cu toate că aceasta este o descoperire excepțională, aceasta trebuie îmbunătățită. Următorii pași vor fi inspectarea fiecărei subcategorii a acestor caracteristici principale și identificarea mai precisă a tipului de alimente care are cel mai mare impact. Provocarea va fi adunarea datelor la acel nivel de granularitate, modelul ML fiind gata de reutilizare cu aceiași pași principali descriși mai sus.

Puteți descoperi mai multe detalii privind codul utilizat pentru a ajunge la aceste concluzii.

LANSAREA NUMĂRULUI 100

Prezentări articole și Panel:
AI & Fintech

Joi, 29 Octombrie, ora 18:00

Înregistrează-te

Facebook Meetup StreamEvent.ro

Conferință

VIDEO: NUMĂRULUI 99

Sponsori

  • comply advantage
  • ntt data
  • Betfair
  • Accenture
  • Siemens
  • Bosch
  • FlowTraders
  • MHP
  • Connatix
  • Cognizant Softvision
  • BoatyardX
  • Colors in projects