16 KiB
Bir ML Modelini Kullanmak için Bir Web Uygulaması Oluşturun
Bu derste, NUFORC'un veritabanından alınan son yüzyıldaki UFO gözlemleri verileri üzerinde bir ML modeli eğiteceksiniz.
Öğrenecekleriniz:
- Eğitilmiş bir modeli 'pickle'lama
- Bu modeli bir Flask uygulamasında kullanma
Verileri temizlemek ve modelimizi eğitmek için defterleri kullanmaya devam edeceğiz, ancak süreci bir adım öteye taşıyarak modeli bir web uygulamasında kullanmayı keşfedebilirsiniz.
Bunu yapmak için Flask kullanarak bir web uygulaması oluşturmanız gerekecek.
Ders Öncesi Test
Bir Uygulama Oluşturma
Makine öğrenimi modellerini tüketmek için web uygulamaları oluşturmanın birkaç yolu vardır. Web mimariniz, modelinizin nasıl eğitildiğini etkileyebilir. Bir işletmede çalıştığınızı ve veri bilimi ekibinin bir model eğittiğini ve bu modeli bir uygulamada kullanmanızı istediğini hayal edin.
Dikkate Alınması Gerekenler
Sormanız gereken birçok soru var:
- Bu bir web uygulaması mı yoksa mobil uygulama mı? Eğer bir mobil uygulama geliştiriyorsanız veya modeli bir IoT bağlamında kullanmanız gerekiyorsa, TensorFlow Lite kullanabilir ve modeli bir Android veya iOS uygulamasında kullanabilirsiniz.
- Model nerede barındırılacak? Bulutta mı yoksa yerel olarak mı?
- Çevrimdışı destek. Uygulama çevrimdışı çalışmak zorunda mı?
- Modeli eğitmek için hangi teknoloji kullanıldı? Seçilen teknoloji, kullanmanız gereken araçları etkileyebilir.
- TensorFlow kullanımı. Örneğin, TensorFlow kullanarak bir model eğitiyorsanız, bu ekosistem, bir web uygulamasında kullanılmak üzere bir TensorFlow modelini TensorFlow.js kullanarak dönüştürme yeteneği sağlar.
- PyTorch kullanımı. Eğer PyTorch gibi bir kütüphane kullanarak bir model oluşturuyorsanız, modeli ONNX (Open Neural Network Exchange) formatında dışa aktarma seçeneğiniz vardır. Bu format, Onnx Runtime kullanabilen JavaScript web uygulamalarında kullanılabilir. Bu seçenek, Scikit-learn ile eğitilmiş bir model için ilerideki bir derste keşfedilecektir.
- Lobe.ai veya Azure Custom Vision kullanımı. Eğer bir ML SaaS (Hizmet Olarak Yazılım) sistemi olan Lobe.ai veya Azure Custom Vision kullanarak bir model eğitiyorsanız, bu tür yazılımlar, modeli birçok platform için dışa aktarma yolları sağlar. Buna, çevrimiçi uygulamanız tarafından bulutta sorgulanabilecek özel bir API oluşturma da dahildir.
Ayrıca, bir web tarayıcısında modeli kendisi eğitebilecek bir Flask web uygulaması oluşturma fırsatınız da var. Bu, JavaScript bağlamında TensorFlow.js kullanılarak da yapılabilir.
Bizim amacımız için, Python tabanlı defterlerle çalıştığımızdan, eğitilmiş bir modeli böyle bir defterden Python ile oluşturulmuş bir web uygulaması tarafından okunabilir bir formata dışa aktarmak için gereken adımları inceleyelim.
Araçlar
Bu görev için iki araca ihtiyacınız var: Flask ve Pickle, her ikisi de Python üzerinde çalışır.
✅ Flask nedir? Yaratıcıları tarafından bir 'mikro-çerçeve' olarak tanımlanan Flask, Python kullanarak web çerçevelerinin temel özelliklerini ve web sayfaları oluşturmak için bir şablon motoru sağlar. Flask ile uygulama geliştirmeyi pratik etmek için bu Öğrenme modülüne göz atın.
✅ Pickle nedir? Pickle 🥒, bir Python nesne yapısını serileştiren ve serileştirmeyi kaldıran bir Python modülüdür. Bir modeli 'pickle'ladığınızda, yapısını webde kullanım için serileştirir veya düzleştirirsiniz. Dikkatli olun: pickle doğası gereği güvenli değildir, bu yüzden bir dosyayı 'un-pickle'lamanız istendiğinde dikkatli olun. Picklelanmış bir dosya .pkl
uzantısına sahiptir.
Alıştırma - Verilerinizi Temizleyin
Bu derste, NUFORC (Ulusal UFO Raporlama Merkezi) tarafından toplanan 80.000 UFO gözlemi verilerini kullanacaksınız. Bu verilerde UFO gözlemlerine dair ilginç açıklamalar bulunuyor, örneğin:
- Uzun örnek açıklama. "Gece bir çimenlik alana ışık huzmesiyle inen bir adam, Texas Instruments otoparkına doğru koşuyor."
- Kısa örnek açıklama. "Işıklar bizi kovaladı."
ufos.csv elektronik tablosu, gözlemin gerçekleştiği şehir
, eyalet
ve ülke
, nesnenin şekli
ve enlem
ile boylam
bilgilerini içeren sütunlar içerir.
Bu derste yer alan boş notebook dosyasında:
-
Daha önceki derslerde olduğu gibi
pandas
,matplotlib
venumpy
modüllerini içe aktarın ve UFO elektronik tablosunu yükleyin. Örnek bir veri setine göz atabilirsiniz:import pandas as pd import numpy as np ufos = pd.read_csv('./data/ufos.csv') ufos.head()
-
UFO verilerini yeni başlıklarla küçük bir veri çerçevesine dönüştürün.
Country
alanındaki benzersiz değerleri kontrol edin.ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']}) ufos.Country.unique()
-
Şimdi, ele almamız gereken veri miktarını azaltmak için boş değerleri düşürerek ve yalnızca 1-60 saniye arasındaki gözlemleri içe aktararak verileri azaltabilirsiniz:
ufos.dropna(inplace=True) ufos = ufos[(ufos['Seconds'] >= 1) & (ufos['Seconds'] <= 60)] ufos.info()
-
Ülkeler için metin değerlerini bir sayıya dönüştürmek için Scikit-learn'ün
LabelEncoder
kütüphanesini içe aktarın:✅ LabelEncoder verileri alfabetik olarak kodlar
from sklearn.preprocessing import LabelEncoder ufos['Country'] = LabelEncoder().fit_transform(ufos['Country']) ufos.head()
Verileriniz şu şekilde görünmelidir:
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
Alıştırma - Modelinizi Oluşturun
Şimdi, verileri eğitim ve test gruplarına ayırarak bir model eğitmeye hazır olabilirsiniz.
-
X vektörünüz olarak eğitmek istediğiniz üç özelliği seçin ve y vektörü
Country
olacaktır.Seconds
,Latitude
veLongitude
girdilerini alıp bir ülke kimliği döndürmek istiyorsunuz.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)
-
Modelinizi lojistik regresyon kullanarak eğitin:
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))
Doğruluk oranı fena değil (%95 civarında), şaşırtıcı değil, çünkü Country
ve Latitude/Longitude
arasında bir ilişki var.
Oluşturduğunuz model çok devrimsel değil, çünkü bir ülkeyi Latitude
ve Longitude
değerlerinden çıkarabilmelisiniz, ancak bu, temizlediğiniz ham verilerden bir model eğitme, dışa aktarma ve ardından bu modeli bir web uygulamasında kullanma alıştırması yapmak için iyi bir egzersizdir.
Alıştırma - Modelinizi 'Pickle'layın
Şimdi, modelinizi _pickle_lama zamanı! Bunu birkaç satır kodla yapabilirsiniz. Model _pickle_landıktan sonra, picklelanmış modeli yükleyin ve saniye, enlem ve boylam değerlerini içeren bir örnek veri dizisine karşı test edin.
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 '3' döndürüyor, bu da Birleşik Krallık'ın ülke kodu. Harika! 👽
Alıştırma - Bir Flask Uygulaması Oluşturun
Şimdi, modelinizi çağırıp benzer sonuçları daha görsel olarak hoş bir şekilde döndüren bir Flask uygulaması oluşturabilirsiniz.
-
notebook.ipynb dosyasının yanına web-app adlı bir klasör oluşturun ve ufo-model.pkl dosyanız burada bulunsun.
-
Bu klasörde üç klasör daha oluşturun: static (içinde bir css klasörü ile) ve templates. Şimdi aşağıdaki dosya ve dizinlere sahip olmalısınız:
web-app/ static/ css/ templates/ notebook.ipynb ufo-model.pkl
✅ Bitmiş uygulamanın görünümünü görmek için çözüm klasörüne bakın
-
web-app klasöründe oluşturulacak ilk dosya requirements.txt dosyasıdır. Bir JavaScript uygulamasındaki package.json gibi, bu dosya uygulama tarafından gereken bağımlılıkları listeler. requirements.txt dosyasına şu satırları ekleyin:
scikit-learn pandas numpy flask
-
Şimdi, bu dosyayı çalıştırmak için web-app dizinine gidin:
cd web-app
-
Terminalinizde
pip install
yazarak requirements.txt dosyasında listelenen kütüphaneleri yükleyin:pip install -r requirements.txt
-
Şimdi, uygulamayı tamamlamak için üç dosya daha oluşturabilirsiniz:
- Kök dizinde app.py oluşturun.
- templates dizininde index.html oluşturun.
- static/css dizininde styles.css oluşturun.
-
styles.css dosyasını birkaç stil ile oluşturun:
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; }
-
Ardından, index.html dosyasını oluşturun:
<!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>
Bu dosyadaki şablonlamaya bir göz atın. Uygulama tarafından sağlanacak değişkenlerin etrafındaki 'bıyık' sözdizimine dikkat edin, örneğin tahmin metni:
{{}}
. Ayrıca,/predict
rotasına bir tahmin gönderen bir form da var.Son olarak, modeli tüketen ve tahminlerin görüntülenmesini sağlayan Python dosyasını oluşturabilirsiniz:
-
app.py
dosyasına şunları ekleyin: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)
💡 İpucu: Flask kullanarak web uygulamasını çalıştırırken
debug=True
eklediğinizde, uygulamanızda yaptığınız değişiklikler sunucuyu yeniden başlatmaya gerek kalmadan hemen yansıtılır. Dikkat! Bu modu bir üretim uygulamasında etkinleştirmeyin.
python app.py
veya python3 app.py
çalıştırırsanız - yerel olarak web sunucunuz başlar ve UFO'ların nerede görüldüğüne dair merak ettiğiniz soruya cevap almak için kısa bir form doldurabilirsiniz!
Bunu yapmadan önce, app.py
dosyasının bölümlerine bir göz atın:
- İlk olarak, bağımlılıklar yüklenir ve uygulama başlar.
- Daha sonra, model içe aktarılır.
- Ardından, ana rotada index.html işlenir.
/predict
rotasında, form gönderildiğinde birkaç şey olur:
- Form değişkenleri toplanır ve bir numpy dizisine dönüştürülür. Daha sonra modele gönderilir ve bir tahmin döndürülür.
- Görüntülenmesini istediğimiz ülkeler, tahmin edilen ülke kodundan okunabilir metin olarak yeniden işlenir ve bu değer index.html'e şablonda işlenmek üzere geri gönderilir.
Bir modeli bu şekilde, Flask ve picklelanmış bir model ile kullanmak oldukça basittir. En zor şey, modele bir tahmin almak için gönderilmesi gereken verilerin şeklini anlamaktır. Bu tamamen modelin nasıl eğitildiğine bağlıdır. Bu model, bir tahmin almak için üç veri noktası girişi gerektirir.
Profesyonel bir ortamda, modeli eğiten kişiler ile bunu bir web veya mobil uygulamada tüketen kişiler arasında iyi iletişimin ne kadar önemli olduğunu görebilirsiniz. Bizim durumumuzda, bu sadece bir kişi, yani sizsiniz!
🚀 Zorluk
Bir defterde çalışmak ve modeli Flask uygulamasına aktarmak yerine, modeli doğrudan Flask uygulamasında eğitebilirsiniz! Python kodunuzu defterdeki veriler temizlendikten sonra uygulama içinde bir train
rotasında modeli eğitmek için dönüştürmeyi deneyin. Bu yöntemi takip etmenin artıları ve eksileri nelerdir?
Ders Sonrası Test
İnceleme ve Kendi Kendine Çalışma
ML modellerini tüketmek için bir web uygulaması oluşturmanın birçok yolu vardır. Makine öğrenimini kullanmak için JavaScript veya Python ile bir web uygulaması oluşturmanın yollarını listeleyin. Mimarileri düşünün: Model uygulamada mı kalmalı yoksa bulutta mı barındırılmalı? Eğer bulutta barındırılacaksa, ona nasıl erişirsiniz? Uygulamalı bir ML web çözümü için bir mimari model çizin.
Ödev
Feragatname:
Bu belge, AI çeviri hizmeti Co-op Translator kullanılarak çevrilmiştir. Doğruluk için çaba göstersek de, otomatik çevirilerin hata veya yanlışlık içerebileceğini lütfen unutmayın. Belgenin orijinal dili, yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel insan çevirisi önerilir. Bu çevirinin kullanımından kaynaklanan yanlış anlamalar veya yanlış yorumlamalar için sorumluluk kabul etmiyoruz.