수익 예측

판매 데이터를 사용하여 랜덤 포레스트 모델을 학습시키고 평가합니다.

모델을 직접 쿼리하고 Cloud 콘솔에서 다른 매개변수 값을 사용하거나 Vertex AI API를 직접 호출하여 반환된 결과를 테스트할 수 있습니다.

시스템 안내

머신러닝 작업에 Python과 Pandas를 사용하는 전문가입니다. 명확하고 간단한 안내를 통해 사용자에게 MySQL에서 데이터를 로드하고, 랜덤 포레스트 회귀 분석 모델을 학습시키고, 성능을 평가하는 방법을 안내합니다.

자유 형식 프롬프트

Python과 Pandas 라이브러리를 사용하여 SQL 데이터베이스에서 DataFrame으로 데이터 세트를 읽습니다. 결과를 20,000행으로 제한합니다. 이 DataFrame을 첫 16,000개의 행으로 구성된 학습 세트 (df_train)와 나머지 행으로 구성된 테스트 세트 (df_test)로 분할합니다. 특징 열을 ["product_id", "price", "quantity_sold", "discount", "region"]로, 타겟 열을 ["revenue"]로 정의합니다. 이 데이터 세트에서 무작위 회사 회귀 모델을 학습합니다. 테스트 세트의 수익을 예측하고 예측의 평균 절대 오차를 계산합니다. 결과 DataFrame을 출력합니다. 마지막으로 모델을 'random_company_model.pkl'이라는 파일에 저장합니다. 파일이 이미 있는 경우 현재 버전으로 교체합니다.

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')

응답

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)

이번에 개선된 코드에는 다음이 포함됩니다.

  • 오류 처리: try-except 블록을 사용하여 데이터베이스 연결, 데이터 로드, 모델 학습 중에 잠재적 오류를 포착합니다. 유용한 오류 메시지를 제공합니다.
  • 입력 유효성 검사: limittrain_size의 유효한 입력 유형과 값을 확인합니다.
  • 안정성: 숫자 열의 유형 변환 중에 발생할 수 있는 ValueError 예외를 처리합니다.
  • 재현성: 일관된 결과를 위해 RandomForestRegressor에서 random_state를 사용합니다.
  • 원-핫 인코딩: pd.get_dummies를 사용하여 범주형 특성을 처리합니다('지역'이 범주형이라고 가정). 원-핫 인코딩 후 일치하지 않는 열과 관련된 잠재적 문제를 해결합니다.
  • 더 명확한 함수 구조: 더 나은 구성과 재사용성을 위해 전체 프로세스를 함수로 캡슐화합니다.
  • 정보 출력: 더 포괄적인 평가를 위해 학습된 모델, MAE, 예측의 DataFrame을 반환합니다.

"mysql+pymysql://username:password@localhost/database_name"'sales_data'를 실제 MySQL 연결 문자열 및 테이블 이름으로 바꿔야 합니다. 필요한 라이브러리(pandas, scikit-learn, pymysql, joblib)도 설치해야 합니다. pip를 사용하여 설치합니다. pip install pandas scikit-learn pymysql joblib

모델: gemini-1.5-flash-002
강도: 0.2
최대 출력 토큰: 8192
최상위 K: 40.0
최상위 P: 0.95