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