ABONAMENTE VIDEO REDACȚIA
RO
EN
NOU
Numărul 148
Numărul 147 Numărul 146 Numărul 145 Numărul 144 Numărul 143 Numărul 142 Numărul 141 Numărul 140 Numărul 139 Numărul 138 Numărul 137 Numărul 136 Numărul 135 Numărul 134 Numărul 133 Numărul 132 Numărul 131 Numărul 130 Numărul 129 Numărul 128 Numărul 127 Numărul 126 Numărul 125 Numărul 124 Numărul 123 Numărul 122 Numărul 121 Numărul 120 Numărul 119 Numărul 118 Numărul 117 Numărul 116 Numărul 115 Numărul 114 Numărul 113 Numărul 112 Numărul 111 Numărul 110 Numărul 109 Numărul 108 Numărul 107 Numărul 106 Numărul 105 Numărul 104 Numărul 103 Numărul 102 Numărul 101 Numărul 100 Numărul 99 Numărul 98 Numărul 97 Numărul 96 Numărul 95 Numărul 94 Numărul 93 Numărul 92 Numărul 91 Numărul 90 Numărul 89 Numărul 88 Numărul 87 Numărul 86 Numărul 85 Numărul 84 Numărul 83 Numărul 82 Numărul 81 Numărul 80 Numărul 79 Numărul 78 Numărul 77 Numărul 76 Numărul 75 Numărul 74 Numărul 73 Numărul 72 Numărul 71 Numărul 70 Numărul 69 Numărul 68 Numărul 67 Numărul 66 Numărul 65 Numărul 64 Numărul 63 Numărul 62 Numărul 61 Numărul 60 Numărul 59 Numărul 58 Numărul 57 Numărul 56 Numărul 55 Numărul 54 Numărul 53 Numărul 52 Numărul 51 Numărul 50 Numărul 49 Numărul 48 Numărul 47 Numărul 46 Numărul 45 Numărul 44 Numărul 43 Numărul 42 Numărul 41 Numărul 40 Numărul 39 Numărul 38 Numărul 37 Numărul 36 Numărul 35 Numărul 34 Numărul 33 Numărul 32 Numărul 31 Numărul 30 Numărul 29 Numărul 28 Numărul 27 Numărul 26 Numărul 25 Numărul 24 Numărul 23 Numărul 22 Numărul 21 Numărul 20 Numărul 19 Numărul 18 Numărul 17 Numărul 16 Numărul 15 Numărul 14 Numărul 13 Numărul 12 Numărul 11 Numărul 10 Numărul 9 Numărul 8 Numărul 7 Numărul 6 Numărul 5 Numărul 4 Numărul 3 Numărul 2 Numărul 1
×
▼ 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 148

Agile Craftsmanship

joi, 24 Octombrie, ora 18:30

Colors in Projects (București)

Facebook Meetup StreamEvent YouTube

Agile Leadership &
Ways of Working

miercuri, 30 Octombrie, ora 18:00

ING Hubs Romania (Cluj)

Facebook Meetup StreamEvent YouTube

Conferință TSM

NUMĂRUL 147 - Automotive

Sponsori

  • Accenture
  • BT Code Crafters
  • Accesa
  • Bosch
  • Betfair
  • MHP
  • BoatyardX
  • .msg systems
  • P3 group
  • Ing Hubs
  • Cognizant Softvision
  • Colors in projects