import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
import matplotlib.pyplot as plt
import seaborn as sns

# Load a dataset (e.g., the Iris dataset)
from sklearn.datasets import load_iris
data = load_iris()
X = data.data
y = data.target

# Split the dataset into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# Initialize the Random Forest Classifier
rf = RandomForestClassifier(n_estimators=100, random_state=42)

# Train the classifier
rf.fit(X_train, y_train)

# Make predictions
y_pred = rf.predict(X_test)

# Evaluate the classifier
accuracy = accuracy_score(y_test, y_pred)
report = classification_report(y_test, y_pred)
matrix = confusion_matrix(y_test, y_pred)

print(f'Accuracy: {accuracy}')
print('Classification Report:')
print(report)
print('Confusion Matrix:')
print(matrix)

# Visualization

# Confusion Matrix Heatmap
plt.figure(figsize=(8, 6))
sns.heatmap(matrix, annot=True, fmt='d', cmap='Blues', xticklabels=data.target_names, yticklabels=data.target_names)
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.title('Confusion Matrix Heatmap')
plt.show()

# Feature Importance
feature_importances = rf.feature_importances_
features = data.feature_names

plt.figure(figsize=(10, 6))
sns.barplot(x=feature_importances, y=features)
plt.xlabel('Importance')
plt.ylabel('Feature')
plt.title('Feature Importance')
plt.show()

# Pairplot with Predictions
X_test_df = pd.DataFrame(X_test, columns=data.feature_names)
X_test_df['Actual'] = y_test
X_test_df['Predicted'] = y_pred

sns.pairplot(X_test_df, hue='Actual', palette='Set1', markers=["o", "s", "D"], diag_kind='kde')
plt.suptitle('Pairplot of Actual Classes')
plt.show()

sns.pairplot(X_test_df, hue='Predicted', palette='Set2', markers=["o", "s", "D"], diag_kind='kde')
plt.suptitle('Pairplot of Predicted Classes')
plt.show()
