Selles tunnis treenid ML-mudelit andmekogumiga, mis on täiesti teistsugune: UFO-vaatlused viimase sajandi jooksul, pärinedes NUFORC-i andmebaasist.
Sa õpid:
- Kuidas 'marineerida' treenitud mudelit
- Kuidas kasutada seda mudelit Flaski rakenduses
Jätkame sülearvutite kasutamist andmete puhastamiseks ja mudeli treenimiseks, kuid võid protsessi viia sammu võrra kaugemale, uurides mudeli kasutamist "metsikus looduses", nii öelda: veebirakenduses.
Selleks pead ehitama veebirakenduse, kasutades Flaski.
Masinõppe mudelite tarbimiseks veebirakenduste loomiseks on mitmeid viise. Sinu veebiarhitektuur võib mõjutada mudeli treenimise viisi. Kujuta ette, et töötad ettevõttes, kus andmeteaduse meeskond on treeninud mudeli, mida nad soovivad rakenduses kasutada.
On mitmeid küsimusi, mida pead endalt küsima:
- Kas see on veebirakendus või mobiilirakendus? Kui ehitad mobiilirakendust või vajad mudelit IoT kontekstis, võid kasutada TensorFlow Lite ja kasutada mudelit Androidi või iOS-i rakenduses.
- Kus mudel asub? Pilves või kohapeal?
- Võimalus töötada võrguühenduseta. Kas rakendus peab töötama võrguühenduseta?
- Millist tehnoloogiat kasutati mudeli treenimiseks? Valitud tehnoloogia võib mõjutada vajalikke tööriistu.
- TensorFlow kasutamine. Kui treenid mudelit TensorFlow abil, pakub see ökosüsteem võimalust konverteerida TensorFlow mudel veebirakenduses kasutamiseks, kasutades TensorFlow.js.
- PyTorch kasutamine. Kui ehitad mudelit, kasutades sellist teeki nagu PyTorch, on sul võimalus eksportida see ONNX (Open Neural Network Exchange) formaadis JavaScripti veebirakenduste jaoks, mis saavad kasutada Onnx Runtime. Seda võimalust uuritakse tulevases tunnis Scikit-learniga treenitud mudeli jaoks.
- Lobe.ai või Azure Custom Vision kasutamine. Kui kasutad ML SaaS (tarkvara teenusena) süsteemi, nagu Lobe.ai või Azure Custom Vision mudeli treenimiseks, pakub selline tarkvara viise mudeli eksportimiseks mitmetele platvormidele, sealhulgas kohandatud API loomist, mida saab pilves päringuteks kasutada.
Sul on ka võimalus ehitada terve Flaski veebirakendus, mis suudab ise mudelit veebibrauseris treenida. Seda saab teha ka JavaScripti kontekstis, kasutades TensorFlow.js-i.
Meie eesmärkide jaoks, kuna oleme töötanud Pythonil põhinevate sülearvutitega, uurime samme, mida pead tegema, et eksportida treenitud mudel sellisest sülearvutist Pythonil ehitatud veebirakenduse jaoks loetavasse formaati.
Selle ülesande jaoks vajad kahte tööriista: Flaski ja Pickle'it, mis mõlemad töötavad Pythonis.
✅ Mis on Flask? Selle loojate poolt defineeritud kui 'mikro-raamistik', pakub Flask veebiraamistike põhifunktsioone, kasutades Pythonit ja mallimootorit veebilehtede loomiseks. Vaata seda õppe moodulit, et harjutada Flaskiga ehitamist.
✅ Mis on Pickle? Pickle 🥒 on Pythoni moodul, mis serialiseerib ja deserialiseerib Pythoni objektistruktuuri. Kui 'marineerid' mudelit, serialiseerid või lamedad selle struktuuri veebis kasutamiseks. Ole ettevaatlik: Pickle ei ole olemuselt turvaline, seega ole ettevaatlik, kui sind kutsutakse faili 'lahti marineerima'. Marineeritud failil on järelliide .pkl.
Selles tunnis kasutad andmeid 80 000 UFO-vaatlusest, mis on kogutud NUFORC (Riiklik UFO-raportite keskus) poolt. Need andmed sisaldavad huvitavaid kirjeldusi UFO-vaatlustest, näiteks:
- Pikk näite kirjeldus. "Mees ilmub valguskiirest, mis paistab öösel rohtunud väljal, ja jookseb Texas Instrumentsi parklat suunas."
- Lühike näite kirjeldus. "tuled jälitasid meid."
ufos.csv tabel sisaldab veerge city, state ja country, kus vaatlus toimus, objekti shape ning selle latitude ja longitude.
Kaasaolevas tühjas sülearvutis:
-
impordi
pandas,matplotlibjanumpy, nagu tegid eelnevates tundides, ning impordi ufode tabel. Võid vaadata näidisandmekogumit:import pandas as pd import numpy as np ufos = pd.read_csv('./data/ufos.csv') ufos.head()
-
Konverteeri ufode andmed väiksemaks andmeraamiks värskete pealkirjadega. Kontrolli unikaalseid väärtusi
Countryväljal.ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']}) ufos.Country.unique()
-
Nüüd saad vähendada andmete hulka, millega pead tegelema, eemaldades kõik nullväärtused ja importides ainult vaatlused, mis kestavad 1-60 sekundit:
ufos.dropna(inplace=True) ufos = ufos[(ufos['Seconds'] >= 1) & (ufos['Seconds'] <= 60)] ufos.info()
-
Impordi Scikit-learn'i
LabelEncoderteek, et konverteerida riikide tekstiväärtused numbriteks:✅ LabelEncoder kodeerib andmeid tähestikulises järjekorras
from sklearn.preprocessing import LabelEncoder ufos['Country'] = LabelEncoder().fit_transform(ufos['Country']) ufos.head()
Sinu andmed peaksid välja nägema sellised:
Seconds Country Latitude Longitude 2 20.0 3 53.200000 -2.916667 3 20.0 4 28.978333 -96.645833 14 30.0 4 35.823889 -80.253611 23 60.0 4 45.582778 -122.352222 24 3.0 3 51.783333 -0.783333
Nüüd saad valmistuda mudeli treenimiseks, jagades andmed treening- ja testimisgruppi.
-
Vali kolm funktsiooni, mille põhjal soovid mudelit treenida, kui oma X vektor, ja y vektoriks saab
Country. Soovid sisestadaSeconds,LatitudejaLongitudening saada riigi ID-d tagastamiseks.from sklearn.model_selection import train_test_split Selected_features = ['Seconds','Latitude','Longitude'] X = ufos[Selected_features] y = ufos['Country'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
-
Treeni oma mudel logistilise regressiooni abil:
from sklearn.metrics import accuracy_score, classification_report from sklearn.linear_model import LogisticRegression model = LogisticRegression() model.fit(X_train, y_train) predictions = model.predict(X_test) print(classification_report(y_test, predictions)) print('Predicted labels: ', predictions) print('Accuracy: ', accuracy_score(y_test, predictions))
Täpsus pole halb (umbes 95%), mis pole üllatav, kuna Country ja Latitude/Longitude korreleeruvad.
Loodud mudel pole väga revolutsiooniline, kuna peaksid suutma Country tuletada selle Latitude ja Longitude põhjal, kuid see on hea harjutus, et proovida treenida toorandmetest, mida oled puhastanud, eksportinud ja seejärel kasutada seda mudelit veebirakenduses.
Nüüd on aeg oma mudel marineerida! Seda saad teha mõne koodirea abil. Kui see on marineeritud, laadi oma marineeritud mudel ja testi seda näidisandmete massiivi vastu, mis sisaldab väärtusi sekundite, laius- ja pikkuskraadi kohta.
import pickle
model_filename = 'ufo-model.pkl'
pickle.dump(model, open(model_filename,'wb'))
model = pickle.load(open('ufo-model.pkl','rb'))
print(model.predict([[50,44,-12]]))Mudel tagastab '3', mis on Ühendkuningriigi riigikood. Hämmastav! 👽
Nüüd saad ehitada Flaski rakenduse, et kutsuda oma mudelit ja tagastada sarnaseid tulemusi, kuid visuaalselt meeldivamal viisil.
-
Alusta kausta web-app loomisega notebook.ipynb faili kõrvale, kus asub sinu ufo-model.pkl fail.
-
Loo sellesse kausta veel kolm kausta: static, mille sees on kaust css, ja templates. Sul peaks nüüd olema järgmised failid ja kataloogid:
web-app/ static/ css/ templates/ notebook.ipynb ufo-model.pkl✅ Vaata lahenduse kausta, et näha valmis rakenduse vaadet
-
Esimene fail, mida web-app kaustas luua, on requirements.txt fail. Nagu package.json JavaScripti rakenduses, loetleb see fail rakenduse jaoks vajalikud sõltuvused. Lisa requirements.txt faili read:
scikit-learn pandas numpy flask -
Nüüd käivita see fail, liikudes web-app kausta:
cd web-app -
Oma terminalis kirjuta
pip install, et installida requirements.txt failis loetletud teegid:pip install -r requirements.txt
-
Nüüd oled valmis looma veel kolm faili, et rakendus lõpetada:
- Loo app.py juurkausta.
- Loo index.html templates kataloogi.
- Loo styles.css static/css kataloogi.
-
Täienda styles.css faili mõne stiiliga:
body { width: 100%; height: 100%; font-family: 'Helvetica'; background: black; color: #fff; text-align: center; letter-spacing: 1.4px; font-size: 30px; } input { min-width: 150px; } .grid { width: 300px; border: 1px solid #2d2d2d; display: grid; justify-content: center; margin: 20px auto; } .box { color: #fff; background: #2d2d2d; padding: 12px; display: inline-block; }
-
Järgmisena täienda index.html faili:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>🛸 UFO Appearance Prediction! 👽</title> <link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}"> </head> <body> <div class="grid"> <div class="box"> <p>According to the number of seconds, latitude and longitude, which country is likely to have reported seeing a UFO?</p> <form action="{{ url_for('predict')}}" method="post"> <input type="number" name="seconds" placeholder="Seconds" required="required" min="0" max="60" /> <input type="text" name="latitude" placeholder="Latitude" required="required" /> <input type="text" name="longitude" placeholder="Longitude" required="required" /> <button type="submit" class="btn">Predict country where the UFO is seen</button> </form> <p>{{ prediction_text }}</p> </div> </div> </body> </html>
Vaata selle faili mallindust. Pane tähele 'vuntside' süntaksit ümber muutujate, mille rakendus esitab, nagu ennustuse tekst:
{{}}. Seal on ka vorm, mis postitab ennustuse/predictmarsruudile.Lõpuks oled valmis ehitama Python-faili, mis juhib mudeli tarbimist ja ennustuste kuvamist:
-
Lisa
app.pyfaili:import numpy as np from flask import Flask, request, render_template import pickle app = Flask(__name__) model = pickle.load(open("./ufo-model.pkl", "rb")) @app.route("/") def home(): return render_template("index.html") @app.route("/predict", methods=["POST"]) def predict(): int_features = [int(x) for x in request.form.values()] final_features = [np.array(int_features)] prediction = model.predict(final_features) output = prediction[0] countries = ["Australia", "Canada", "Germany", "UK", "US"] return render_template( "index.html", prediction_text="Likely country: {}".format(countries[output]) ) if __name__ == "__main__": app.run(debug=True)
💡 Näpunäide: kui lisad
debug=TrueFlaski veebirakenduse käivitamisel, kajastuvad kõik muudatused, mida teed oma rakenduses, kohe, ilma et peaksid serverit taaskäivitama. Ole ettevaatlik! Ära luba seda režiimi tootmisrakenduses.
Kui käivitad python app.py või python3 app.py - sinu veebiserver käivitub kohapeal ja saad täita lühikese vormi, et saada vastus oma põletavale küsimusele UFO-vaatluste kohta!
Enne seda vaata app.py osi:
- Kõigepealt laaditakse sõltuvused ja rakendus käivitub.
- Seejärel imporditakse mudel.
- Seejärel renderdatakse index.html kodumarsruudil.
/predict marsruudil juhtub mitu asja, kui vorm postitatakse:
- Vormimuutujad kogutakse ja konverteeritakse numpy massiiviks. Seejärel saadetakse need mudelile ja tagastatakse ennustus.
- Riigid, mida soovime kuvada, renderdatakse uuesti loetava tekstina nende ennustatud riigikoodist, ja see väärtus saadetakse tagasi index.html-le, et see mallis renderdada.
Mudeli kasutamine sel viisil, Flaski ja marineeritud mudeliga, on suhteliselt lihtne. Kõige raskem on mõista, millises vormis peavad andmed olema, et neid mudelile saata ja ennustust saada. See kõik sõltub sellest, kuidas mudel treeniti. Sellel mudelil on kolm andmepunkti, mida tuleb sisestada, et saada ennustus.
Professionaalses keskkonnas näed, kui oluline on hea kommunikatsioon nende inimeste vahel, kes mudelit treenivad, ja nende vahel, kes seda veebis või mobiilirakenduses tarbivad. Meie puhul on see ainult üks inimene, sina!
Selle asemel, et töötada sülearvutis ja importida mudel Flaski rakendusse, võiksid treenida mudeli otse Flaski rakenduses! Proovi konverteerida oma Python-koodi sülearvutis, võib-olla pärast andmete puhastamist, et treenida mudelit otse rakenduses marsruudil train. Millised on selle meetodi plussid ja miinused?
Veebirakenduse loomiseks ML-mudelite tarbimiseks on mitmeid viise. Koosta nimekiri viisidest, kuidas saaksid kasutada JavaScripti või Pythonit veebirakenduse loomiseks, et kasutada masinõpet. Mõtle arhitektuurile: kas mudel peaks jääma rakendusse või elama pilves? Kui viimane, siis kuidas sellele ligi pääseda? Joonista arhitektuurimudel rakendatud ML-veebilahenduse jaoks.
Lahtiütlus:
See dokument on tõlgitud AI tõlketeenuse Co-op Translator abil. Kuigi püüame tagada täpsust, palume arvestada, et automaatsed tõlked võivad sisaldada vigu või ebatäpsusi. Algne dokument selle algses keeles tuleks pidada autoriteetseks allikaks. Olulise teabe puhul soovitame kasutada professionaalset inimtõlget. Me ei vastuta selle tõlke kasutamisest tulenevate arusaamatuste või valesti tõlgenduste eest.