시스템 안내 |
머신러닝 작업에 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 블록을 사용하여 데이터베이스 연결, 데이터 로드, 모델 학습 중에 잠재적 오류를 포착합니다. 유용한 오류 메시지를 제공합니다.
- 입력 유효성 검사:
limit 및 train_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 |
|