# Membina Aplikasi Web untuk Menggunakan Model ML Dalam pelajaran ini, anda akan melatih model ML menggunakan set data yang luar biasa: _Penampakan UFO sepanjang abad yang lalu_, yang diperoleh daripada pangkalan data NUFORC. Anda akan belajar: - Cara 'pickle' model yang telah dilatih - Cara menggunakan model tersebut dalam aplikasi Flask Kita akan terus menggunakan notebook untuk membersihkan data dan melatih model, tetapi anda boleh melangkah lebih jauh dengan meneroka penggunaan model 'di dunia nyata', iaitu dalam aplikasi web. Untuk melakukannya, anda perlu membina aplikasi web menggunakan Flask. ## [Kuiz sebelum kuliah](https://ff-quizzes.netlify.app/en/ml/) ## Membina aplikasi Terdapat beberapa cara untuk membina aplikasi web yang menggunakan model pembelajaran mesin. Seni bina web anda mungkin mempengaruhi cara model anda dilatih. Bayangkan anda bekerja dalam perniagaan di mana kumpulan sains data telah melatih model yang mereka mahu anda gunakan dalam aplikasi. ### Pertimbangan Terdapat banyak soalan yang perlu anda tanya: - **Adakah ia aplikasi web atau aplikasi mudah alih?** Jika anda membina aplikasi mudah alih atau perlu menggunakan model dalam konteks IoT, anda boleh menggunakan [TensorFlow Lite](https://www.tensorflow.org/lite/) dan menggunakan model tersebut dalam aplikasi Android atau iOS. - **Di mana model akan berada?** Di awan atau secara tempatan? - **Sokongan luar talian.** Adakah aplikasi perlu berfungsi secara luar talian? - **Teknologi apa yang digunakan untuk melatih model?** Teknologi yang dipilih mungkin mempengaruhi alat yang perlu anda gunakan. - **Menggunakan TensorFlow.** Jika anda melatih model menggunakan TensorFlow, contohnya, ekosistem tersebut menyediakan keupayaan untuk menukar model TensorFlow untuk digunakan dalam aplikasi web dengan menggunakan [TensorFlow.js](https://www.tensorflow.org/js/). - **Menggunakan PyTorch.** Jika anda membina model menggunakan pustaka seperti [PyTorch](https://pytorch.org/), anda mempunyai pilihan untuk mengeksportnya dalam format [ONNX](https://onnx.ai/) (Open Neural Network Exchange) untuk digunakan dalam aplikasi web JavaScript yang boleh menggunakan [Onnx Runtime](https://www.onnxruntime.ai/). Pilihan ini akan diteroka dalam pelajaran akan datang untuk model yang dilatih menggunakan Scikit-learn. - **Menggunakan Lobe.ai atau Azure Custom Vision.** Jika anda menggunakan sistem ML SaaS (Perisian sebagai Perkhidmatan) seperti [Lobe.ai](https://lobe.ai/) atau [Azure Custom Vision](https://azure.microsoft.com/services/cognitive-services/custom-vision-service/?WT.mc_id=academic-77952-leestott) untuk melatih model, jenis perisian ini menyediakan cara untuk mengeksport model untuk pelbagai platform, termasuk membina API tersuai untuk ditanya di awan oleh aplikasi dalam talian anda. Anda juga berpeluang untuk membina keseluruhan aplikasi web Flask yang boleh melatih model itu sendiri dalam pelayar web. Ini juga boleh dilakukan menggunakan TensorFlow.js dalam konteks JavaScript. Untuk tujuan kita, memandangkan kita telah bekerja dengan notebook berasaskan Python, mari kita teroka langkah-langkah yang perlu diambil untuk mengeksport model yang telah dilatih daripada notebook tersebut ke format yang boleh dibaca oleh aplikasi web yang dibina menggunakan Python. ## Alat Untuk tugas ini, anda memerlukan dua alat: Flask dan Pickle, kedua-duanya berjalan pada Python. ✅ Apa itu [Flask](https://palletsprojects.com/p/flask/)? Didefinisikan sebagai 'micro-framework' oleh penciptanya, Flask menyediakan ciri asas rangka kerja web menggunakan Python dan enjin templat untuk membina halaman web. Lihat [modul pembelajaran ini](https://docs.microsoft.com/learn/modules/python-flask-build-ai-web-app?WT.mc_id=academic-77952-leestott) untuk berlatih membina dengan Flask. ✅ Apa itu [Pickle](https://docs.python.org/3/library/pickle.html)? Pickle 🥒 ialah modul Python yang menyusun dan menyahsusun struktur objek Python. Apabila anda 'pickle' model, anda menyusun atau meratakan strukturnya untuk digunakan di web. Berhati-hati: pickle tidak secara intrinsik selamat, jadi berhati-hati jika diminta untuk 'un-pickle' fail. Fail yang telah dipickle mempunyai akhiran `.pkl`. ## Latihan - membersihkan data anda Dalam pelajaran ini, anda akan menggunakan data daripada 80,000 penampakan UFO, yang dikumpulkan oleh [NUFORC](https://nuforc.org) (Pusat Pelaporan UFO Kebangsaan). Data ini mempunyai beberapa deskripsi menarik tentang penampakan UFO, contohnya: - **Deskripsi contoh panjang.** "Seorang lelaki muncul dari pancaran cahaya yang bersinar di padang rumput pada waktu malam dan dia berlari ke arah tempat letak kereta Texas Instruments". - **Deskripsi contoh pendek.** "lampu mengejar kami". Spreadsheet [ufos.csv](../../../../3-Web-App/1-Web-App/data/ufos.csv) termasuk lajur tentang `city`, `state` dan `country` di mana penampakan berlaku, `shape` objek dan `latitude` serta `longitude`nya. Dalam [notebook](../../../../3-Web-App/1-Web-App/notebook.ipynb) kosong yang disertakan dalam pelajaran ini: 1. import `pandas`, `matplotlib`, dan `numpy` seperti yang anda lakukan dalam pelajaran sebelumnya dan import spreadsheet ufos. Anda boleh melihat sampel set data: ```python import pandas as pd import numpy as np ufos = pd.read_csv('./data/ufos.csv') ufos.head() ``` 1. Tukarkan data ufos kepada dataframe kecil dengan tajuk baru. Periksa nilai unik dalam medan `Country`. ```python ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']}) ufos.Country.unique() ``` 1. Kini, anda boleh mengurangkan jumlah data yang perlu kita uruskan dengan membuang nilai null dan hanya mengimport penampakan antara 1-60 saat: ```python ufos.dropna(inplace=True) ufos = ufos[(ufos['Seconds'] >= 1) & (ufos['Seconds'] <= 60)] ufos.info() ``` 1. Import pustaka `LabelEncoder` dari Scikit-learn untuk menukar nilai teks bagi negara kepada nombor: ✅ LabelEncoder menyandikan data mengikut abjad ```python from sklearn.preprocessing import LabelEncoder ufos['Country'] = LabelEncoder().fit_transform(ufos['Country']) ufos.head() ``` Data anda sepatutnya kelihatan seperti ini: ```output 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 ``` ## Latihan - membina model anda Kini anda boleh bersedia untuk melatih model dengan membahagikan data kepada kumpulan latihan dan ujian. 1. Pilih tiga ciri yang ingin anda latih sebagai vektor X anda, dan vektor y akan menjadi `Country`. Anda ingin dapat memasukkan `Seconds`, `Latitude` dan `Longitude` dan mendapatkan id negara untuk dikembalikan. ```python 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) ``` 1. Latih model anda menggunakan regresi logistik: ```python 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)) ``` Ketepatannya tidak buruk **(sekitar 95%)**, tidak mengejutkan, kerana `Country` dan `Latitude/Longitude` berkorelasi. Model yang anda cipta tidak begitu revolusioner kerana anda sepatutnya dapat menyimpulkan `Country` daripada `Latitude` dan `Longitude`nya, tetapi ia adalah latihan yang baik untuk mencuba melatih daripada data mentah yang anda bersihkan, eksport, dan kemudian menggunakan model ini dalam aplikasi web. ## Latihan - 'pickle' model anda Kini, tiba masanya untuk _pickle_ model anda! Anda boleh melakukannya dalam beberapa baris kod. Setelah ia _dipickle_, muatkan model yang dipickle dan uji terhadap array data sampel yang mengandungi nilai untuk seconds, latitude dan longitude, ```python 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]])) ``` Model mengembalikan **'3'**, yang merupakan kod negara untuk UK. Hebat! 👽 ## Latihan - membina aplikasi Flask Kini anda boleh membina aplikasi Flask untuk memanggil model anda dan mengembalikan hasil yang serupa, tetapi dengan cara yang lebih menarik secara visual. 1. Mulakan dengan mencipta folder bernama **web-app** di sebelah fail _notebook.ipynb_ di mana fail _ufo-model.pkl_ anda berada. 1. Dalam folder itu, cipta tiga lagi folder: **static**, dengan folder **css** di dalamnya, dan **templates**. Anda sepatutnya kini mempunyai fail dan direktori berikut: ```output web-app/ static/ css/ templates/ notebook.ipynb ufo-model.pkl ``` ✅ Rujuk folder penyelesaian untuk melihat aplikasi yang telah siap 1. Fail pertama yang perlu dicipta dalam folder _web-app_ ialah fail **requirements.txt**. Seperti _package.json_ dalam aplikasi JavaScript, fail ini menyenaraikan kebergantungan yang diperlukan oleh aplikasi. Dalam **requirements.txt** tambahkan baris: ```text scikit-learn pandas numpy flask ``` 1. Kini, jalankan fail ini dengan menavigasi ke _web-app_: ```bash cd web-app ``` 1. Dalam terminal anda taip `pip install`, untuk memasang pustaka yang disenaraikan dalam _requirements.txt_: ```bash pip install -r requirements.txt ``` 1. Kini, anda bersedia untuk mencipta tiga lagi fail untuk melengkapkan aplikasi: 1. Cipta **app.py** di root. 2. Cipta **index.html** dalam direktori _templates_. 3. Cipta **styles.css** dalam direktori _static/css_. 1. Bina fail _styles.css_ dengan beberapa gaya: ```css 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; } ``` 1. Seterusnya, bina fail _index.html_: ```html
According to the number of seconds, latitude and longitude, which country is likely to have reported seeing a UFO?
{{ prediction_text }}