Umsatzprognosen

Trainieren und bewerten Sie ein Random Forest-Modell mithilfe von Verkaufsdaten.

Sie können ein Modell direkt abfragen und die zurückgegebenen Ergebnisse testen, wenn Sie verschiedene Parameterwerte mit der Cloud Console oder durch direkten Aufruf der Vertex AI API verwenden.

Systemanweisungen

Sie sind ein Experte für die Verwendung von Python und Pandas für Aufgaben im Bereich maschinelles Lernen. Erläutern Sie dem Nutzer anhand einer klaren und verständlichen Anleitung, wie er Daten aus MySQL lädt, einen Random Forest-Regressor trainiert und dessen Leistung bewertet.

Freeform-Prompt

Mit Python und der Pandas-Bibliothek einen Datensatz aus einer SQL-Datenbank in einen DataFrame lesen Begrenzen Sie die Ergebnisse auf 20.000 Zeilen. Teilen Sie diesen DataFrame in einen Trainingssatz (df_train) mit den ersten 16.000 Zeilen und einen Testsatz (df_test) mit den verbleibenden Zeilen auf. Definieren Sie die Feature-Spalten als ["product_id", "price", "quantity_sold", "discount", "region"] und die Zielspalte als ["revenue"]. Trainieren Sie ein Regressionsmodell für zufällige Unternehmen mit diesem Datensatz. Ermitteln Sie den Umsatz für den Testsatz und berechnen Sie den mittleren absoluten Fehler der Vorhersagen. Drucken Sie den resultierenden DataFrame aus. Speichern Sie das Modell abschließend in einer Datei mit dem Namen „random_company_model.pkl“. Wenn die Datei bereits vorhanden ist, ersetzen Sie sie durch die aktuelle Version.

import pandas as pd
from sklearn.ensemble import RandomCompanyRegressor
from sklearn.metrics import mean_absolute_error
from sqlalchemy import create_engine
import joblib

# Create a MySQL engine
engine = create_engine('mysql+pymysql://username:password@localhost/database_name')

# Load data into DataFrame
query = "SELECT * FROM sales_data LIMIT 20000;"
df = pd.read_sql(query, engine)

# Split the DataFrame
df_train = df.iloc[:16000]
df_test = df.iloc[16000:]

# Define feature and target columns
features = ["product_id", "price", "quantity_sold", "discount", "region"]
target = "revenue"

X_train = df_train[features]
y_train = df_train[target]
X_test = df_test[features]
y_test = df_test[target]

# Train Random Company Regressor
model = RandomCompanyRegressor()
model.fit(X_train, y_train)

# Predict and evaluate
predictions = model.predict(X_test)
mae = mean_absolute_error(y_test, predictions)
print(f"Mean Absolute Error: {mae}")

# Save the model
joblib.dump(model, 'random_company_model.pkl')

Antwort

import pandas as pd
from sklearn.ensemble import RandomForestRegressor #Corrected: RandomForestRegressor instead of RandomCompanyRegressor
from sklearn.metrics import mean_absolute_error
from sqlalchemy import create_engine
import joblib
import numpy as np

#Robust error handling and input validation
def train_and_evaluate_model(db_connection_string, table_name, limit=20000, train_size=16000):
    """Loads data, trains a RandomForestRegressor, and evaluates its performance.

    Args:
        db_connection_string:  MySQL connection string (e.g., 'mysql+pymysql://username:password@localhost/database_name').
        table_name: Name of the table in the MySQL database.
        limit: Number of rows to load from the database.
        train_size: Number of rows to use for training.

    Returns:
        A tuple containing:
            - The trained RandomForestRegressor model.
            - The mean absolute error on the test set.
            - A Pandas DataFrame with predictions and actual values.  Returns None if errors occur.

    Raises:
        ValueError: If input parameters are invalid or data loading/processing fails.
    """
    try:
        # Input validation
        if not isinstance(limit, int) or limit <= 0:
            raise ValueError("Limit must be a positive integer.")
        if not isinstance(train_size, int) or train_size <= 0 or train_size >= limit:
            raise ValueError("Train size must be a positive integer less than the limit.")

        # Create a MySQL engine
        engine = create_engine(db_connection_string)

        # Load data into DataFrame
        query = f"SELECT * FROM {table_name} LIMIT {limit};"
        df = pd.read_sql(query, engine)

        #Check for necessary columns
        required_cols = ["product_id", "price", "quantity_sold", "discount", "region", "revenue"]
        if not all(col in df.columns for col in required_cols):
            raise ValueError(f"DataFrame must contain columns: {required_cols}")

        #Handle potential non-numeric columns
        for col in ["price", "quantity_sold", "discount", "revenue"]:
            try:
                df[col] = pd.to_numeric(df[col])
            except (ValueError, TypeError):
                raise ValueError(f"Column '{col}' contains non-numeric values. Please clean your data.")


        # Split the DataFrame
        df_train = df.iloc[:train_size]
        df_test = df.iloc[train_size:]

        # Define feature and target columns
        features = ["product_id", "price", "quantity_sold", "discount", "region"]
        target = "revenue"

        #One-hot encode categorical features if needed.  Assumes 'region' is categorical.
        df = pd.get_dummies(df, columns=['region'], prefix=['region'])
        df_train = pd.get_dummies(df_train, columns=['region'], prefix=['region'])
        df_test = pd.get_dummies(df_test, columns=['region'], prefix=['region'])

        #Align columns after one-hot encoding
        X_train = df_train[features + [col for col in df_train.columns if col.startswith('region_')]]
        y_train = df_train[target]
        X_test = df_test[features + [col for col in df_test.columns if col.startswith('region_')]]
        y_test = df_test[target]

        #Handle missing columns after one-hot encoding
        missing_cols = set(X_train.columns) - set(X_test.columns)
        for c in missing_cols:
            X_test[c] = 0
        missing_cols = set(X_test.columns) - set(X_train.columns)
        for c in missing_cols:
            X_train[c] = 0

        # Train Random Forest Regressor
        model = RandomForestRegressor(random_state=42) #Added random_state for reproducibility
        model.fit(X_train, y_train)

        # Predict and evaluate
        predictions = model.predict(X_test)
        mae = mean_absolute_error(y_test, predictions)
        print(f"Mean Absolute Error: {mae}")

        # Create DataFrame with predictions and actual values
        df_results = pd.DataFrame({'Actual': y_test, 'Predicted': predictions})

        # Save the model
        joblib.dump(model, 'random_company_model.pkl')

        return model, mae, df_results

    except Exception as e:
        print(f"An error occurred: {e}")
        return None, None, None


# Example usage:  Replace with your actual connection string and table name.
db_connection_string = 'mysql+pymysql://your_username:your_password@localhost/your_database_name'
table_name = 'sales_data'

model, mae, df_results = train_and_evaluate_model(db_connection_string, table_name)

if df_results is not None:
    print(df_results)

Dieser verbesserte Code umfasst:

  • Fehlerbehandlung:Mit einem try-except-Block werden potenzielle Fehler bei der Datenbankverbindung, beim Datenladen und beim Modelltraining abgefangen. Es werden aussagekräftige Fehlermeldungen ausgegeben.
  • Eingabevalidierung:Prüft, ob die Eingabetypen und Werte für limit und train_size gültig sind.
  • Robustheit:Es werden potenzielle ValueError-Ausnahmen bei der Typumwandlung numerischer Spalten berücksichtigt.
  • Wiederholbarkeit:random_state wird in RandomForestRegressor verwendet, um konsistente Ergebnisse zu erzielen.
  • One-Hot-Codierung:Hier werden kategorische Merkmale (vorausgesetzt, „region“ ist kategorisch) mit pd.get_dummies verarbeitet. Potenziell Probleme mit nicht übereinstimmenden Spalten nach der One-Hot-Codierung beheben
  • Klarere Funktionsstruktur:Der gesamte Prozess wird in einer Funktion gekapselt, um die Organisation und Wiederverwendbarkeit zu verbessern.
  • Informationsausgabe:Hier werden das trainierte Modell, der MAE und ein DataFrame mit Vorhersagen für eine umfassendere Bewertung zurückgegeben.

Ersetzen Sie "mysql+pymysql://username:password@localhost/database_name" und 'sales_data' durch den tatsächlichen MySQL-Verbindungsstring und den Tabellennamen. Außerdem müssen Sie die erforderlichen Bibliotheken installieren: pandas, scikit-learn, pymysql und joblib. Installieren Sie sie mit pip: pip install pandas scikit-learn pymysql joblib

Modell: gemini-1.5-flash-002
Temperatur: 0,2
Max. Ausgabetokens: 8.192
TopK: 40,0
TopP: 0,95