from sklearn.datasets import load_iris
from sklearn.ensemble import VotingClassifier
from sklearn.exceptions import ConvergenceWarning
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
import warnings

warnings.filterwarnings('ignore', category=ConvergenceWarning)


# Load the iris dataset
iris = load_iris()

# Define X and y
X = iris.data
y = iris.target

# Create a list of base models
base_models = [
    ('lr', LogisticRegression()),
    ('dt', DecisionTreeClassifier()),
    ('svm', SVC(probability=True))
]

# Create the voting classifier
voting = VotingClassifier(base_models)

# Define the hyperparameters to tune
params = {
    'lr__C': [0.1, 1.0, 10.0],
    'dt__max_depth': [None, 1, 2, 3],
    'svm__C': [0.1, 1.0, 10.0],
    'voting': ['hard', 'soft']
}

# Perform grid search with cross-validation
grid = GridSearchCV(voting, params, cv=5)
grid.fit(X, y)

# Print the best hyperparameters and the corresponding score
print(grid.best_params_)
print(grid.best_score_)