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()
aW1wb3J0IG51bXB5IGFzIG5wCmltcG9ydCBwYW5kYXMgYXMgcGQKZnJvbSBza2xlYXJuLm1vZGVsX3NlbGVjdGlvbiBpbXBvcnQgdHJhaW5fdGVzdF9zcGxpdApmcm9tIHNrbGVhcm4uZW5zZW1ibGUgaW1wb3J0IFJhbmRvbUZvcmVzdENsYXNzaWZpZXIKZnJvbSBza2xlYXJuLm1ldHJpY3MgaW1wb3J0IGFjY3VyYWN5X3Njb3JlLCBjbGFzc2lmaWNhdGlvbl9yZXBvcnQsIGNvbmZ1c2lvbl9tYXRyaXgKaW1wb3J0IG1hdHBsb3RsaWIucHlwbG90IGFzIHBsdAppbXBvcnQgc2VhYm9ybiBhcyBzbnMKCiMgTG9hZCBhIGRhdGFzZXQgKGUuZy4sIHRoZSBJcmlzIGRhdGFzZXQpCmZyb20gc2tsZWFybi5kYXRhc2V0cyBpbXBvcnQgbG9hZF9pcmlzCmRhdGEgPSBsb2FkX2lyaXMoKQpYID0gZGF0YS5kYXRhCnkgPSBkYXRhLnRhcmdldAoKIyBTcGxpdCB0aGUgZGF0YXNldCBpbnRvIHRyYWluaW5nIGFuZCB0ZXN0aW5nIHNldHMKWF90cmFpbiwgWF90ZXN0LCB5X3RyYWluLCB5X3Rlc3QgPSB0cmFpbl90ZXN0X3NwbGl0KFgsIHksIHRlc3Rfc2l6ZT0wLjMsIHJhbmRvbV9zdGF0ZT00MikKCiMgSW5pdGlhbGl6ZSB0aGUgUmFuZG9tIEZvcmVzdCBDbGFzc2lmaWVyCnJmID0gUmFuZG9tRm9yZXN0Q2xhc3NpZmllcihuX2VzdGltYXRvcnM9MTAwLCByYW5kb21fc3RhdGU9NDIpCgojIFRyYWluIHRoZSBjbGFzc2lmaWVyCnJmLmZpdChYX3RyYWluLCB5X3RyYWluKQoKIyBNYWtlIHByZWRpY3Rpb25zCnlfcHJlZCA9IHJmLnByZWRpY3QoWF90ZXN0KQoKIyBFdmFsdWF0ZSB0aGUgY2xhc3NpZmllcgphY2N1cmFjeSA9IGFjY3VyYWN5X3Njb3JlKHlfdGVzdCwgeV9wcmVkKQpyZXBvcnQgPSBjbGFzc2lmaWNhdGlvbl9yZXBvcnQoeV90ZXN0LCB5X3ByZWQpCm1hdHJpeCA9IGNvbmZ1c2lvbl9tYXRyaXgoeV90ZXN0LCB5X3ByZWQpCgpwcmludChmJ0FjY3VyYWN5OiB7YWNjdXJhY3l9JykKcHJpbnQoJ0NsYXNzaWZpY2F0aW9uIFJlcG9ydDonKQpwcmludChyZXBvcnQpCnByaW50KCdDb25mdXNpb24gTWF0cml4OicpCnByaW50KG1hdHJpeCkKCiMgVmlzdWFsaXphdGlvbgoKIyBDb25mdXNpb24gTWF0cml4IEhlYXRtYXAKcGx0LmZpZ3VyZShmaWdzaXplPSg4LCA2KSkKc25zLmhlYXRtYXAobWF0cml4LCBhbm5vdD1UcnVlLCBmbXQ9J2QnLCBjbWFwPSdCbHVlcycsIHh0aWNrbGFiZWxzPWRhdGEudGFyZ2V0X25hbWVzLCB5dGlja2xhYmVscz1kYXRhLnRhcmdldF9uYW1lcykKcGx0LnhsYWJlbCgnUHJlZGljdGVkJykKcGx0LnlsYWJlbCgnQWN0dWFsJykKcGx0LnRpdGxlKCdDb25mdXNpb24gTWF0cml4IEhlYXRtYXAnKQpwbHQuc2hvdygpCgojIEZlYXR1cmUgSW1wb3J0YW5jZQpmZWF0dXJlX2ltcG9ydGFuY2VzID0gcmYuZmVhdHVyZV9pbXBvcnRhbmNlc18KZmVhdHVyZXMgPSBkYXRhLmZlYXR1cmVfbmFtZXMKCnBsdC5maWd1cmUoZmlnc2l6ZT0oMTAsIDYpKQpzbnMuYmFycGxvdCh4PWZlYXR1cmVfaW1wb3J0YW5jZXMsIHk9ZmVhdHVyZXMpCnBsdC54bGFiZWwoJ0ltcG9ydGFuY2UnKQpwbHQueWxhYmVsKCdGZWF0dXJlJykKcGx0LnRpdGxlKCdGZWF0dXJlIEltcG9ydGFuY2UnKQpwbHQuc2hvdygpCgojIFBhaXJwbG90IHdpdGggUHJlZGljdGlvbnMKWF90ZXN0X2RmID0gcGQuRGF0YUZyYW1lKFhfdGVzdCwgY29sdW1ucz1kYXRhLmZlYXR1cmVfbmFtZXMpClhfdGVzdF9kZlsnQWN0dWFsJ10gPSB5X3Rlc3QKWF90ZXN0X2RmWydQcmVkaWN0ZWQnXSA9IHlfcHJlZAoKc25zLnBhaXJwbG90KFhfdGVzdF9kZiwgaHVlPSdBY3R1YWwnLCBwYWxldHRlPSdTZXQxJywgbWFya2Vycz1bIm8iLCAicyIsICJEIl0sIGRpYWdfa2luZD0na2RlJykKcGx0LnN1cHRpdGxlKCdQYWlycGxvdCBvZiBBY3R1YWwgQ2xhc3NlcycpCnBsdC5zaG93KCkKCnNucy5wYWlycGxvdChYX3Rlc3RfZGYsIGh1ZT0nUHJlZGljdGVkJywgcGFsZXR0ZT0nU2V0MicsIG1hcmtlcnM9WyJvIiwgInMiLCAiRCJdLCBkaWFnX2tpbmQ9J2tkZScpCnBsdC5zdXB0aXRsZSgnUGFpcnBsb3Qgb2YgUHJlZGljdGVkIENsYXNzZXMnKQpwbHQuc2hvdygpCg==