Følgende blogpost er en fortsættelse af Opgør mellem Kunstig Neurale Netværk og Support Vector Machines hvor vi validerede kvaliteten af rødvin med neurale netværk og support vector machine. Denne gang vil vi vise, hvad der skal til for at gøre en support vector machine model produktions klar!

Tavle med teksten test

I den forrige blogpost viste support vector machine en bedre forudsigelse og testnøjagtighed end neurale netværk. Derfor fortsætter vi med denne model og viser nu, hvordan den kan implementeres i en reel produktions setting, hvor vi viser, hvordan en bruger kan teste to rødvin med vores model.

Hvem er slutbrugeren?

Lad os først diskutere kvaliteten af vores model, som den var, da vi forlod den i den sidste blogpost. Ved hjælp af følgende 11 funktioner forsøger vores model at forudsige kvaliteten af rødvin:

0 - Fast syreindhold 6 - Samlet svovldioxid
1 - Flygtig syreindhold 7 - Massefylde
2 - Citronsyre 8 - pH
3 - Rest sukker 9 - Sulfater
4 - Klorid 10 - Alkohol
5 - Fi svolvldioxid

Gennem de tilgængelige features fik vores model følgende score:
Træn nøjagtighed 91.53 %
Test nøjagtighed 90.33 %
ROC AUC score 79.00 %

Når du udarbejder en model til produktion, skal du overveje, hvem der vil bruge denne model? De færreste mennesker har oplysninger om en rødvins syremængde, pH-værdi, densitet eller mængden af klorid. Hvis modellen er målrettet mod slutbrugere, ville de da bruge en model, der kræver så meget information, før de får et resultat? **Sikkert ikke.**

For at gøre en model brugerinteraktiv, der er brugervenlig, kan vi kun bruge mængden af alkohol og måske i nogle tilfælde mængden af resterende sukker. Heldig for os synes alkohol (10) ifølge datasættet at være den vigtigste funktion til at bestemme kvaliteten af rødvin. Restsukker (3) er af lav betydning, men alligevel stadig signifikant.

Feature importance diagram

Feature importance

Lad os starte med at teste, hvor godt en model klarer sig, hvis den eneste feature for kvalitet er alkohol:

svm-model
1
2
3
model = SVC(C, gamma = "scale")
model_fitted = model.fit(X_train, y_train)
test = model.predict(X_train)

Output:

Train accuracy 74.34 %
Test accuracy 71.56 %
ROC AUC score 71.34 %

Dette er godt! Ved kun at bruge alkohol til at forudsige kvaliteten af rødvin, kan vi forudsige korrekt i næsten 3 ud af 4 tilfælde. Imidlertid indikerer loss mellem træn og test, at modellen muligvis er overfitting. Hvad sker der, hvis vi bruger alkohol og restsukker som input features?

Når du bruger alkohol og restsukker til at forudsige kvaliteten af rødvin, opnåes følgende nøjagtighed:

Train accuracy 74.83 %
Test accuracy 74.92 %
ROC AUC score 76.63 %

Modellen forbedrede sig lidt med en stigning i træningsnøjagtighed på 0,49 procentpoint, en testnøjagtighed på 3,36 procentpoint og en AUC-score på 5,29 procentpoint, hvilket indikerer, at modellen er mere stabil, da der er næsten ingen forskel mellem trænings- og test dataen såvel som at have en model, der diskriminere mindre, visualiseret ved den forbedrede AUC-score. Vi kan nu gemme denne model og bruge den til at forudsige kvaliteten af rødvin i produktionen.
Gemme modellen
1
2
3
from joblib import dump

model = dump(model, "svmmodel.joblib")

Test af modellen

Der findes en højere sandsynlighed for, at vores model vil diskriminere rødvin af høj kvalitet i forhold til rødvin af lav kvalitet på grund af det ubalanceret datasæt. Inden vi brugte oversampling, havde vores model en nøjagtighed på 98% i både trænings- og test datasættet, men en ROC AUC-score på 50% visualiseret ved at have en model, der lærte at forudsige en lav kvalitet af rødvin i alle tilfælde (output = 0).

Den rødvin, som vores model er baseret på, stammer fra en meget specifik provins i Portugal, hvor den opdyrkede vin er kendt som Vinho Verde. Alkoholprocenten af Vinho Verde er lavere end den alkohol, vi normalt kender her i Danmark, og skal også drikkes inden for de første år efter fremstillingen. Hvis vi ser på alkoholprocenten i vores datasæt, varierer det fra 8,4 - 14,9%, hvor det meste af rødvin, vi finder her i butikkerne, har en alkoholprocent på 13 - 16%. Det forventes derfor ikke, at den givne model fungerer på andre typer rødvin end Vinho Verde, hvilket reducerer generaliserbarheden til de mest almindelige rødvin her i Danmark.

Lad os dog teste vores model på to Vinho Verde-rødvin, vi har fundet:

Vinho Verde rødvinen Terra Verde, Lot Series Pinot Noir, 2017 har en score på 88 ud af 100. Det har en alkoholprocent på 13,5 og indeholder 0,2 g restsukker. Det forventes, at vores model giver den nævnte rødvin en score på 1 (høj kvalitet)

Forudsig kvaliteten af Kaiken Reserva Malbec, 2015
1
2
3
4
from joblib import load

model = load(model_fitted, "svmmodel.joblib")
print(model.predict([[0.2, 13.5]])

Output: [ 1 ]

En anden vinho verde rødvin Casa da Tojeira MFS red, 2017 indeholder 9,5 % alkohol og 1,8 g restsukker. Der findes ingen vurdering af denne rødvin, men på grund af den lave alkoholprocent forventer vi at få et output svarende til 0.

Forudsig kvaliteten af Cheval des Andes, 2014
1
2
model = load(model_fitted, "svmmodel.joblib")
print(model.predict([[1.8, 9.5]])

Output: [ 0 ]

Succes!

Vi har udarbejdet en stabil model ved kun at have to input features: (1) Alkohol og (2) Mængde af resterende sukker i håb om at gøre modellen brugervenlig for slutbrugeren. Ved kun at bruge alkohol som en prediktor for kvaliteten af rødvin, fik vi en ustabil model og valgte at tilføje restsukker, hvilket giver en stabil model, vi kan bruge i produktion. Vores prototype kan ikke kun forudsige korrekt i 3 ud af 4 gange, den diskriminerer heller ikke eller overfitter!

Vi kan se, at vores model vurdere som vineksperter, hvilket giver mening, da datasættet leveres af fem vineksperter. Da målet med denne model er at bestemme kvaliteten af rødvin, skal vi dog huske, at folk smager ting forskelligt takket være vores smagsløg. Modellen hjælper dig derfor ikke med at finde den vin, du kan lide, men gennem nogle fysiokemiske egenskaber i rødvin, bestemmer den, om kvaliteten af den givne vin er høj eller lav.

Vores model er stabil, spørg kun brugeren om to inputværdier for at skabe et output, men alligevel er kun mængden af alkohol synligt angivet på en rødvinsflaske. Yderligere undersøgelse er nødvendig for at finde mængden af resterende sukker, og det meste af tiden er det faktisk umuligt for forbrugerne at finde.

I dette givne tilfælde kan generaliserbarheden for andre rødvin end Vinho Verde være begrænset på grund af den lave alkoholprocent og begrænset eller ingen aldring inden servering.

Afsluttende bemærkninger

Dette datasæt er interessant, fordi det giver dig mange tanker om datavalidering, udvalg af maskinlæringsmodel, generaliserbarhed og brugervenlighed.

Vi har behandlet outlier detektion, manglende værdier i den forudsagte variable og korrelationstest. Vi har undersøgt to maskinlæringsalgoritmer og bestemt det bedste resultat og har nu drøftet generaliserbarheden og anvendeligheden af den oprettede model. Når man håndterer maskinlærings problemer, er det første trin altid at forstå og definere det givne problem, der skal løses (defineret som et output), og derefter bestemme, hvilke data der kan være relevante for at løse dette (defineret som input eller funktioner).

Ikke desto mindre er det mindst lige så vigtigt at forstå, hvem slutbrugerne er, og hvilke oplysninger de har til rådighed, samt hvor meget tid de vil bruge på at søge efter disse oplysninger.

For at sætte den model, vi har oprettet, i produktion er der flere overvejelser at tage omkring, hvordan man tjener modellen i produktion, og hvordan man skaber observerbarhed af modellen for at se, at den faktisk svarer på brugerens anmodninger. Dernæst er det fordelagtigt at overveje, om de data, som brugeren sender til modellen, skal gemmes for at udvide det aktuelle datasæt og senere bruges i gentræning af modellen for at forbedre den.

// Maria Hvid, Machine Learning Engineer @ neurospace