Vikasbenal2506's picture
Hyperparameter tuning
d3b6432
Raw
History Blame Contribute Delete
4.17 kB
import os
import sys
from dataclasses import dataclass
from catboost import CatBoostRegressor
from sklearn.ensemble import (
AdaBoostRegressor,
GradientBoostingRegressor,
RandomForestRegressor
)
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score
from sklearn.neighbors import KNeighborsRegressor
from sklearn.tree import DecisionTreeRegressor
from xgboost import XGBRegressor
from src.exception import CustomException
from src.logger import logging
from src.utils import save_object, evaluate_models
@dataclass
class ModelTrainerConfig:
trained_model_file_path = os.path.join('artifacts', "model.pkl")
class ModelTrainer:
def __init__(self):
self.model_trainer_config = ModelTrainerConfig()
def initiate_model_trainer(self, train_array, test_array):
try:
logging.info("Splitting training and test input data")
X_train, y_train, X_test, y_test = (
train_array[:, :-1],
train_array[:, -1],
test_array[:, :-1],
test_array[:, -1]
)
models = {
"Random Forest": RandomForestRegressor(),
"Decision Tree": DecisionTreeRegressor(),
"Gradient Boosting": GradientBoostingRegressor(),
"Linear Regression": LinearRegression(),
"XGBRegressor": XGBRegressor(),
"CatBoosting Regressor": CatBoostRegressor(verbose=False),
"AdaBoost Regressor": AdaBoostRegressor()
}
params = {
"Decision Tree": {
'criterion': ['squared_error', 'friedman_mse', 'absolute_error', 'poisson'],
# 'splitter': ['best','random'],
# 'max_features': ['sqrt','log2'],
},
"Random Forest": {
# 'criterion': ['squared_error', 'friedman_mse', 'absolute_error', 'poisson'],
# 'max_features': ['sqrt','log2',None],
'n_estimators': [8,16,32,64,128,256]
},
"Gradient Boosting": {
# 'loss': ['squared_error', 'huber', 'absolute_error', 'quantile'],
'learning_rate': [.1,.01,.05,.001],
'subsample': [0.6,0.7,0.75,0.8,0.85,0.9],
# 'criterion': ['squared_error', 'friedman_mse'],
# 'max_features': ['auto','sqrt','log2'],
'n_estimators': [8,16,32,64,128,256]
},
"Linear Regression": {},
"XGBRegressor": {
'learning_rate': [.1,.01,.05,.001],
'n_estimators': [8,16,32,64,128,256]
},
"CatBoosting Regressor": {
'depth': [6,8,10],
'learning_rate': [0.01, 0.05, 0.1],
'iterations': [30, 50, 100]
},
"AdaBoost Regressor": {
'learning_rate': [.1,.01,0.5,.001],
# 'loss': ['linear','square','exponential'],
'n_estimators': [8,16,32,64,128,256]
}
}
model_report:dict = evaluate_models(X_train=X_train, y_train=y_train, X_test=X_test, y_test=y_test, models=models, param=params)
best_model_score = max(sorted(model_report.values()))
best_model_name = list(model_report.keys())[list(model_report.values()).index(best_model_score)]
best_model = models[best_model_name]
if best_model_score < 0.6:
raise CustomException("No best model found")
logging.info("Best found model on both training and testing dataset")
save_object(
file_path = self.model_trainer_config.trained_model_file_path,
obj = best_model
)
predicted = best_model.predict(X_test)
r2Score = r2_score(y_test, predicted)
return r2Score
except Exception as e:
raise CustomException(e, sys)