Deployement Prostej Regresji Liniowej z Flask

W tej lekcji nauczysz się, jak wdrożyć prosty model regresji liniowej za pomocą frameworku Flask w języku Python. Dowiesz się, jak stworzyć API, które będzie przyjmować dane wejściowe, przetwarzać je za pomocą wytrenowanego modelu i zwracać przewidywane wyniki.

Learning Objectives

  • Zainstalujesz niezbędne biblioteki Pythona (Flask, scikit-learn).
  • Zbudujesz prosty model regresji liniowej i wytrenujesz go na danych.
  • Stworzysz podstawowy interfejs API w Flasku, który obsługuje żądania GET i POST.
  • Przetestujesz wdrożony model, aby upewnić się, że działa poprawnie.

Lesson Content

Wprowadzenie do Flask i API

Flask to lekki framework webowy dla języka Python, idealny do budowania prostych aplikacji webowych i API. API (Application Programming Interface) pozwala innym aplikacjom na komunikację z Twoim modelem, umożliwiając mu przewidywanie na podstawie danych wejściowych. Zanim przejdziemy dalej, upewnij się, że masz zainstalowany Python i pip (menadżer pakietów Pythona).

Instalacja: Uruchom w terminalu:

pip install flask scikit-learn

Budowa i Trening Modelu Regresji Liniowej

Zacznijmy od zbudowania i wytrenowania prostego modelu regresji liniowej. Użyjemy biblioteki scikit-learn.

import numpy as np
from sklearn.linear_model import LinearRegression

# Generowanie przykładowych danych (x i y)
x = np.array([1, 2, 3, 4, 5]).reshape((-1, 1))
y = np.array([2, 4, 5, 4, 5])

# Tworzenie i trenowanie modelu
model = LinearRegression()
model.fit(x, y)

# Zapisywanie modelu (opcjonalnie - do przyszłych lekcji)
# from joblib import dump
# dump(model, 'model.joblib')

print(f'Współczynnik: {model.coef_[0]}')
print(f'Wyraz wolny: {model.intercept_}')

Ten kod tworzy model regresji liniowej, trenuje go na przykładowych danych i wyświetla jego współczynniki. Pamiętaj, że w prawdziwym świecie będziesz używać bardziej zaawansowanych danych i modeli.

Tworzenie API w Flasku

Teraz stworzymy interfejs API w Flasku, który będzie przyjmował dane wejściowe, korzystał z wytrenowanego modelu i zwracał przewidywany wynik.

from flask import Flask, request, jsonify
import numpy as np
from sklearn.linear_model import LinearRegression

app = Flask(__name__)

# Używamy wytrenowanego modelu z poprzedniego kroku (lub załaduj z pliku)
model = LinearRegression()
x = np.array([1, 2, 3, 4, 5]).reshape((-1, 1))
y = np.array([2, 4, 5, 4, 5])
model.fit(x, y)

@app.route('/predict', methods=['POST'])
def predict():
    try:
        data = request.get_json()
        input_value = float(data['value'])
        prediction = model.predict([[input_value]])[0]
        return jsonify({'prediction': prediction})
    except Exception as e:
        return jsonify({'error': str(e)}), 400

if __name__ == '__main__':
    app.run(debug=True)

Ten kod tworzy aplikację Flask, definiuje endpoint /predict akceptujący żądania POST. Oczekuje on danych wejściowych w formacie JSON, przewiduje wynik za pomocą modelu i zwraca go w formacie JSON.

Testowanie API

Aby przetestować API, uruchom skrypt Pythona (np. python your_app.py) i wyślij żądanie POST do endpointu /predict. Możesz użyć narzędzia takiego jak curl lub Postman.

Przykład z curl:

curl -X POST -H "Content-Type: application/json" -d '{"value": 6}' http://127.0.0.1:5000/predict

Powinieneś otrzymać odpowiedź w formacie JSON zawierającą przewidywaną wartość.

Deep Dive

Explore advanced insights, examples, and bonus exercises to deepen understanding.

Rozszerzona Treść Lekcji: Wdrażanie i Monitorowanie Modeli (Dzień 5)

Gratulacje! Zbudowałeś już podstawowy model regresji liniowej i wdrożyłeś go za pomocą Flask. W tej rozszerzonej lekcji zgłębimy temat wdrażania i monitorowania modeli, eksplorując bardziej zaawansowane aspekty, alternatywne perspektywy i praktyczne zastosowania. Zaczynamy!

Deep Dive Section: Optymalizacja API i Obsługa Błędów

Twoje podstawowe API działa, ale co dalej? W realnym świecie, musimy zadbać o wydajność i niezawodność. Oto kilka kluczowych aspektów:

  • Walidacja Danych Wejściowych: Zanim dane trafią do modelu, upewnij się, że są w odpowiednim formacie i zakresie. Użyj bibliotek takich jak `marshmallow` lub `pydantic` do walidacji. Zapobiegnie to błędom w przetwarzaniu i zwiększy odporność API.
  • Obsługa Błędów: Implementuj mechanizmy obsługi błędów (try-except bloków) w Flasku. Zwracaj czytelne komunikaty o błędach (np. statusy HTTP 400 dla błędów walidacji, 500 dla błędów serwera) zamiast surowych tracebacków.
  • Skalowalność: Rozważ użycie serwera aplikacji WSGI, takiego jak Gunicorn, aby obsłużyć więcej równoczesnych żądań. Flask w trybie debugowania jest dobry do testowania, ale nie do produkcji.
  • Logowanie: Dodaj logowanie (np. za pomocą biblioteki `logging`) do swojego API. Rejestruj żądania, błędy i informacje diagnostyczne. Ułatwi to rozwiązywanie problemów i monitorowanie wydajności.

Przykład walidacji danych za pomocą pydantic:


from flask import Flask, request, jsonify
from pydantic import BaseModel, ValidationError
from sklearn.linear_model import LinearRegression
import joblib

app = Flask(__name__)

# Załaduj wytrenowany model
model = joblib.load('model.pkl')

# Definicja schematu danych wejściowych
class InputData(BaseModel):
    feature1: float
    feature2: float

@app.route('/predict', methods=['POST'])
def predict():
    try:
        data = InputData(**request.get_json())  # Walidacja danych
        # Konwersja na listę i przewidywanie
        prediction = model.predict([[data.feature1, data.feature2]])[0]
        return jsonify({'prediction': prediction})
    except ValidationError as e:
        return jsonify({'error': str(e)}), 400 # Zwróć błąd walidacji
    except Exception as e:
        return jsonify({'error': 'Wystąpił błąd serwera'}), 500 # Zwróć błąd serwera

if __name__ == '__main__':
    app.run(debug=False)  # Uruchom w trybie produkcyjnym
        

Bonus Exercises

Spróbuj wykonać poniższe ćwiczenia, aby utrwalić zdobytą wiedzę:

  1. Walidacja Danych: Zmodyfikuj swoje API, aby używało `marshmallow` lub `pydantic` do walidacji danych wejściowych. Upewnij się, że API zwraca odpowiednie kody błędów (400 Bad Request) w przypadku nieprawidłowych danych.
  2. Obsługa Błędów: Dodaj blok `try-except` do swojego endpointu `/predict`. Przechwytuj potencjalne błędy (np. brak pliku modelu) i zwracaj przyjazne komunikaty o błędach (kod 500 Internal Server Error).
  3. (Challenge) Logowanie: Zaimplementuj podstawowe logowanie w swoim API. Zapisuj żądania i ewentualne błędy do pliku. Możesz użyć biblioteki `logging`.

Real-World Connections: Zastosowania w Praktyce

Wdrażanie modeli i API ma szerokie zastosowanie w wielu branżach i aspektach życia:

  • E-commerce: Rekomendacje produktów, dynamiczne ceny, wykrywanie oszustw. Wyobraź sobie Allegro, które przewiduje, jaki produkt Ci się spodoba.
  • Finanse: Oszacowanie ryzyka kredytowego, automatyzacja decyzji kredytowych. Bank, który błyskawicznie ocenia Twoją zdolność kredytową.
  • Medycyna: Diagnoza chorób na podstawie obrazów medycznych, personalizowane plany leczenia. Algorytmy, które pomagają lekarzom w stawianiu diagnoz.
  • Automatyzacja procesów: Automatyzacja odpowiedzi na zapytania klientów, analiza sentymentu.
  • Przemysł: Optymalizacja produkcji, predykcyjne utrzymanie maszyn. Przewidywanie awarii maszyn w fabryce.

Challenge Yourself: Zaawansowane Zadania

Chcesz się sprawdzić i pójść o krok dalej? Spróbuj poniższych zadań:

  • Implementacja Monitoringu: Zbuduj prosty dashboard monitorujący wydajność Twojego API. Użyj biblioteki `psutil` do monitorowania zużycia procesora i pamięci. Możesz użyć biblioteki `matplotlib` do wizualizacji danych.
  • Automatyczne Ponowne Wdrażanie: Zintegruj swoje API z systemem ciągłej integracji/ciągłego wdrażania (CI/CD) (np. GitHub Actions). Zdefiniuj proces automatycznego wdrażania po każdej zmianie w kodzie.

Further Learning: Kierunki Dalszej Eksploracji

Rozwój w tej dziedzinie jest dynamiczny. Oto kilka tematów do dalszego studiowania:

  • Systemy Monitorowania: Prometheus, Grafana, Datadog.
  • Kubernetes i Docker: Skalowalność i wdrażanie w kontenerach.
  • MLOps: Kompleksowe podejście do wdrażania i zarządzania modelami.
  • Serverless Computing: Bezserwerowe wdrażanie modeli, np. AWS Lambda, Google Cloud Functions.
  • A/B Testing i Canary Releases: Metody testowania nowych modeli w środowisku produkcyjnym.

Pamiętaj, że nauka to proces ciągły. Z każdym projektem i wyzwaniem nabierzesz nowego doświadczenia. Powodzenia!

Interactive Exercises

Modyfikacja model.py

Zmodyfikuj kod z sekcji 'Budowa i Trening Modelu Regresji Liniowej' tak, aby używał innej wartości w 'x' (np. dodaj więcej wartości).

Uruchom aplikację Flask i testuj

Uruchom aplikację Flask i spróbuj wysłać różne dane wejściowe do punktu końcowego /predict i sprawdź wynik. Użyj curl lub Postmana. Spróbuj wysłać błędne dane (np. tekst zamiast liczby) i sprawdź, co się stanie.

Debugowanie w Pythonie

Dodaj w kodzie `print()` i zobacz jakie wartości przyjmują poszczególne zmienne. Spróbuj znaleźć ewentualne błędy i spróbuj je naprawić.

Refleksja

Przemyśl, dlaczego użycie Flasku jest dobrym rozwiązaniem w kontekście wdrożenia modelu ML. Jakie inne możliwości wdrożenia modeli znasz?

Knowledge Check

Question 1: Do czego służy biblioteka Flask?

Question 2: Jakie jest zadanie metody `fit()` w scikit-learn?

Question 3: Jaki typ żądania używamy do wysyłania danych do API `/predict`?

Question 4: Jak nazywa się format danych, który jest często używany do wymiany danych w API?

Question 5: Co robi linia kodu `app.run(debug=True)`?

Practical Application

Wyobraź sobie, że pracujesz dla firmy, która zajmuje się prognozowaniem cen nieruchomości. Wykorzystując poznane umiejętności, stwórz API, które przyjmuje jako dane wejściowe cechy nieruchomości (np. powierzchnia, lokalizacja) i zwraca przewidywaną cenę.

Key Takeaways

Next Steps

Przygotuj się do poznania metod monitorowania wdrożonych modeli, aby móc śledzić ich wydajność i reagować na potencjalne problemy.

Your Progress is Being Saved!

We're automatically tracking your progress. Sign up for free to keep your learning paths forever and unlock advanced features like detailed analytics and personalized recommendations.

Next Lesson (Day 6)