Δημιουργήστε μια εφαρμογή Data Science με Python σε 10 εύκολα βήματα


Μάθετε πώς να δημιουργείτε μια εφαρμογή επιστήμης δεδομένων με την Python, χρησιμοποιώντας το Scikit-Learn και το FastAPI, ένα βήμα τη φορά.

Θέλετε να βελτιώσετε τις δεξιότητές σας στην επιστήμη των δεδομένων; Η δημιουργία μιας εφαρμογής επιστήμης δεδομένων είναι ένας πολύ καλός τρόπος για να μάθετε περισσότερα.

Η δημιουργία μιας εφαρμογής επιστήμης δεδομένων περιλαμβάνει πολλαπλά βήματα—από τη συλλογή και την προεπεξεργασία δεδομένων έως την εκπαίδευση μοντέλων και την εξυπηρέτηση προβλέψεων μέσω ενός API. Αυτό το βήμα προς βήμα σεμινάριο θα σας καθοδηγήσει στη διαδικασία δημιουργίας μιας απλής εφαρμογής επιστήμης δεδομένων.

Θα χρησιμοποιήσουμε Python, scikit-learn και FastAPI για να εκπαιδεύσουμε ένα μοντέλο μηχανικής μάθησης και να δημιουργήσουμε ένα API για να εξυπηρετήσουμε τις προβλέψεις του. Για να κρατήσουμε τα πράγματα απλά, θα χρησιμοποιήσουμε το ενσωματωμένο σύνολο δεδομένων κρασιών από το scikit-learn. Ας ξεκινήσουμε!

▶️ Μπορείτε να βρείτε τον κωδικό στο GitHub.

Βήμα 1: Ρύθμιση του περιβάλλοντος

Θα πρέπει να έχετε εγκαταστήσει μια πρόσφατη έκδοση της Python. Στη συνέχεια, εγκαταστήστε τις απαραίτητες βιβλιοθήκες για τη δημιουργία του μοντέλου μηχανικής εκμάθησης και του API για την εξυπηρέτηση των προβλέψεων:

$ pip3 install fastapi uvicorn scikit-learn pandas

Σημείωση: Βεβαιωθείτε ότι έχετε εγκαταστήσει τις απαιτούμενες βιβλιοθήκες σε ένα εικονικό περιβάλλον για το έργο.

Βήμα 2: Φόρτωση του συνόλου δεδομένων

Θα χρησιμοποιήσουμε το σύνολο δεδομένων κρασιού του scikit-learn. Ας φορτώσουμε το σύνολο δεδομένων και ας το μετατρέψουμε σε πλαίσιο δεδομένων pandas για εύκολο χειρισμό:

# model_training.py
from sklearn.datasets import load_wine
import pandas as pd

def load_wine_data():
    wine_data = load_wine()
    df = pd.DataFrame(data=wine_data.data, columns=wine_data.feature_names)
    df['target'] = wine_data.target  # Adding the target (wine quality class)
    return df

Βήμα 3: Εξερεύνηση του συνόλου δεδομένων

Πριν προχωρήσουμε, είναι καλή πρακτική να εξερευνήσετε λίγο το σύνολο δεδομένων.

# model_training.py
if __name__ == "__main__":
    df = load_wine_data()
    print(df.head())
    print(df.describe())
    print(df['target'].value_counts())  # Distribution of wine quality classes

Εδώ, εκτελούμε μια προκαταρκτική εξερεύνηση του συνόλου δεδομένων εμφανίζοντας τις πρώτες λίγες σειρές, δημιουργώντας συνοπτικά στατιστικά στοιχεία και ελέγχοντας την κατανομή των κλάσεων εξόδου.

Βήμα 4: Προεπεξεργασία δεδομένων

Στη συνέχεια, θα προεπεξεργαζόμαστε το σύνολο δεδομένων. Διαχωρίζουμε το σύνολο δεδομένων σε σύνολα εκπαίδευσης και δοκιμών και κλιμακώνουμε τα χαρακτηριστικά.

Η συνάρτηση preprocess_data κάνει ακριβώς αυτό:

# model_training.py
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

def preprocess_data(df):
    X = df.drop('target', axis=1)  # Features
    y = df['target']  # Target (wine quality)

    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=27)

    # Feature scaling
    scaler = StandardScaler()
    X_train_scaled = scaler.fit_transform(X_train)
    X_test_scaled = scaler.transform(X_test)
    
    return X_train_scaled, X_test_scaled, y_train, y_test

Η κλιμάκωση δυνατοτήτων χρησιμοποιώντας το StandardScaler διασφαλίζει ότι όλα τα χαρακτηριστικά συμβάλλουν εξίσου στην εκπαίδευση του μοντέλου.

Βήμα 5: Εκπαίδευση του Μοντέλου Logistic Regression

Ας εκπαιδεύσουμε τώρα ένα μοντέλο LogisticRegression στα προεπεξεργασμένα δεδομένα και ας αποθηκεύσουμε το μοντέλο σε ένα αρχείο pickle. Η ακόλουθη συνάρτηση train_model το κάνει αυτό:

# model_training.py
from sklearn.linear_model import LogisticRegression
import pickle

def train_model(X_train, y_train):
    model = LogisticRegression(random_state=42)
    model.fit(X_train, y_train)

    # Save the trained model using pickle
    with open('classifier.pkl', 'wb') as f:
        pickle.dump(model, f)

    return model

Βήμα 6: Αξιολόγηση του μοντέλου

Μόλις το μοντέλο εκπαιδευτεί, αξιολογούμε την απόδοσή του υπολογίζοντας την ακρίβεια στο σύνολο δοκιμής. Για να το κάνουμε αυτό, ας ορίσουμε τη συνάρτηση evaluate_model ως εξής:

# model_training.py
from sklearn.metrics import accuracy_score

def evaluate_model(model, X_test, y_test):
    y_pred = model.predict(X_test)
    accuracy = accuracy_score(y_test, y_pred)
    print(f"Accuracy: {accuracy:.2f}")

if __name__ == "__main__":
    df = load_wine_data()
    X_train_scaled, X_test_scaled, y_train, y_test = preprocess_data(df)
    model = train_model(X_train_scaled, y_train)
    evaluate_model(model, X_test_scaled, y_test)

Όταν εκτελείτε το σενάριο Python: τα δεδομένα φορτώνονται, υποβάλλονται σε προεπεξεργασία, το μοντέλο εκπαιδεύεται και αξιολογείται. Η εκτέλεση του σεναρίου τώρα δίνει:

Accuracy: 0.98

Βήμα 7: Ρύθμιση του FastAPI

Τώρα, θα δημιουργήσουμε μια βασική εφαρμογή FastAPI που θα εξυπηρετεί προβλέψεις χρησιμοποιώντας το εκπαιδευμένο μοντέλο μας.

# app.py
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"message": "A Simple Prediction API"}

Σε αυτό το βήμα, δημιουργήσαμε μια βασική εφαρμογή FastAPI και ορίσαμε ένα τελικό σημείο ρίζας. Αυτό δημιουργεί έναν απλό διακομιστή ιστού που μπορεί να ανταποκριθεί σε αιτήματα HTTP.

Μπορείτε να εκτελέσετε την εφαρμογή FastAPI με:

uvicorn app:app --reload

Μεταβείτε στη διεύθυνση http://127.0.0.1:8000 για να δείτε το μήνυμα.

Βήμα 8: Φόρτωση του μοντέλου στο FastAPI

Θα φορτώσουμε το προεκπαιδευμένο μοντέλο στο FastAPI για να κάνουμε προβλέψεις.

Ας προχωρήσουμε και ας ορίσουμε μια συνάρτηση για τη φόρτωση του προεκπαιδευμένου μοντέλου Logistic Regression στην εφαρμογή μας FastAPI.

# app.py
import pickle

def load_model():
    with open('model/classifier.pkl', 'rb') as f:
        model = pickle.load(f)
    return model

Αυτό σημαίνει ότι το μοντέλο μας είναι έτοιμο να κάνει προβλέψεις όταν ληφθούν αιτήματα.

Βήμα 9: Δημιουργία του Τελικού Σημείου Πρόβλεψης

Θα ορίσουμε ένα τελικό σημείο για να αποδεχθούμε τα χαρακτηριστικά του κρασιού ως είσοδο και θα επιστρέψουμε την προβλεπόμενη κατηγορία ποιότητας κρασιού.
 

Ορισμός μοντέλου δεδομένων εισόδου

Θα θέλαμε να δημιουργήσουμε ένα τελικό σημείο πρόβλεψης που δέχεται δεδομένα χαρακτηριστικών κρασιού σε μορφή JSON. Το μοντέλο δεδομένων εισόδου—που ορίζεται με χρήση της Pydantic—επικυρώνει τα εισερχόμενα δεδομένα.

# app.py
from pydantic import BaseModel

class WineFeatures(BaseModel):
    alcohol: float
    malic_acid: float
    ash: float
    alcalinity_of_ash: float
    magnesium: float
    total_phenols: float
    flavanoids: float
    nonflavanoid_phenols: float
    proanthocyanins: float
    color_intensity: float
    hue: float
    od280_od315_of_diluted_wines: float
    proline: float

Τελικό σημείο πρόβλεψης

Όταν λαμβάνεται ένα αίτημα, το API χρησιμοποιεί το φορτωμένο μοντέλο για να προβλέψει την κατηγορία κρασιού με βάση τις παρεχόμενες δυνατότητες.

# app.py
@app.post("/predict")
def predict_wine(features: WineFeatures):
    model = load_model()
    input_data = [[
        features.alcohol, features.malic_acid, features.ash, features.alcalinity_of_ash,
        features.magnesium, features.total_phenols, features.flavanoids,
        features.nonflavanoid_phenols, features.proanthocyanins, features.color_intensity,
        features.hue, features.od280_od315_of_diluted_wines, features.proline
    ]]
    
    prediction = model.predict(input_data)
    return {"prediction": int(prediction[0])}

Βήμα 10: Δοκιμή της εφαρμογής τοπικά

Μπορείτε να εκτελέσετε ξανά την εφαρμογή εκτελώντας:

uvicorn app:app --reload

Για να δοκιμάσετε την εφαρμογή, στείλτε ένα αίτημα POST στο τελικό σημείο /predict με δεδομένα χαρακτηριστικών κρασιού:

curl -X POST "http://127.0.0.1:8000/predict" \
-H "Content-Type: application/json" \
-d '{
	"alcohol": 13.0,
	"malic_acid": 2.14,
	"ash": 2.35,
	"alcalinity_of_ash": 20.0,
	"magnesium": 120,
	"total_phenols": 3.1,
	"flavanoids": 2.6,
	"nonflavanoid_phenols": 0.29,
	"proanthocyanins": 2.29,
	"color_intensity": 5.64,
	"hue": 1.04,
	"od280_od315_of_diluted_wines": 3.92,
	"proline": 1065
}'

Η τοπική δοκιμή είναι σημαντική για να διασφαλιστεί ότι το API λειτουργεί όπως προβλέπεται πριν από οποιαδήποτε ανάπτυξη. Έτσι, δοκιμάζουμε την εφαρμογή στέλνοντας ένα αίτημα POST στο τελικό σημείο πρόβλεψης με δείγματα δεδομένων χαρακτηριστικών κρασιού και παίρνουμε την προβλεπόμενη κλάση.

{"prediction":0}

Αναδίπλωση

Έχουμε δημιουργήσει μια απλή αλλά λειτουργική εφαρμογή επιστήμης δεδομένων.

Μετά τη δημιουργία ενός μοντέλου μηχανικής εκμάθησης με το scikit-learn, χρησιμοποιήσαμε το FastAPI για να δημιουργήσουμε ένα API που δέχεται τα στοιχεία των χρηστών και επιστρέφει προβλέψεις. Μπορείτε να δοκιμάσετε να δημιουργήσετε πιο περίπλοκα μοντέλα, να προσθέσετε λειτουργίες και πολλά άλλα.

Ως επόμενο βήμα, μπορείτε να εξερευνήσετε διαφορετικά σύνολα δεδομένων, μοντέλα ή ακόμα και να αναπτύξετε την εφαρμογή στην παραγωγή. Διαβάστε έναν πρακτικό οδηγό για την ανάπτυξη μοντέλων μηχανικής εκμάθησης για να μάθετε περισσότερα.