수익 예측

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

모델을 직접 쿼리하고 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