Asadkhanseu/cccc
0
1import pandas as pd
2import numpy as np
3from sklearn.model_selection import train_test_split
4from sklearn.preprocessing import StandardScaler
5from sklearn.ensemble import RandomForestRegressor
6from sklearn.metrics import mean_squared_error, r2_score
7import matplotlib.pyplot as plt
8import joblib
9
10# Load dataset
11df = pd.read_excel('Sufian Data set 05.08.2025.xlsx')
12
13# Encode 'Gravel Types'
14df['Gravel Types'] = df['Gravel Types'].map({'Natural': 0, 'Basalt': 1})
15
16# Define features and target
17X = df.drop(columns=['Compressive Strength (MPa) of 28d', 'Gravel Size (mm)'])
18y = df['Compressive Strength (MPa) of 28d']
19
20# ๐ Print and save feature names
21feature_names = X.columns.tolist()
22print("๐ Features used for prediction (X):")
23print(feature_names)
24
25# Train-test split
26X_train, X_test, y_train, y_test = train_test_split(
27 X, y, test_size=0.3, random_state=42
28)
29
30# Scale features and target
31scaler_X = StandardScaler()
32scaler_y = StandardScaler()
33
34X_train_scaled = scaler_X.fit_transform(X_train)
35X_test_scaled = scaler_X.transform(X_test)
36y_train_scaled = scaler_y.fit_transform(y_train.values.reshape(-1, 1)).ravel()
37
38# === Train Random Forest Regressor on scaled data ===
39model = RandomForestRegressor(
40 n_estimators=100,
41 max_depth=None, # you can set e.g., 10 if overfitting
42 random_state=42,
43 n_jobs=-1
44)
45model.fit(X_train_scaled, y_train_scaled)
46
47# Predict on scaled test data
48y_pred_scaled = model.predict(X_test_scaled)
49
50# === Evaluation on SCALED values ===
51y_test_scaled = scaler_y.transform(y_test.values.reshape(-1, 1)).ravel()
52rmse_scaled = mean_squared_error(y_test_scaled, y_pred_scaled, squared=False)
53r2_scaled = r2_score(y_test_scaled, y_pred_scaled)
54
55# === Inverse scale predictions for original performance ===
56y_pred = scaler_y.inverse_transform(y_pred_scaled.reshape(-1, 1)).ravel()
57
58rmse_original = mean_squared_error(y_test, y_pred, squared=False)
59r2_original = r2_score(y_test, y_pred)
60
61# ==== PRINT RESULTS ====
62print("๐ Evaluation Results (Random Forest):\n")
63
64print("๐น Scaled Data:")
65print(f" - RMSE (scaled): {rmse_scaled:.4f}")
66print(f" - Rยฒ Score (scaled): {r2_scaled:.4f}\n")
67
68print("๐น Original Data (after inverse transform):")
69print(f" - RMSE (original): {rmse_original:.2f}")
70print(f" - Rยฒ Score (original): {r2_original:.2f}")
71
72# === Feature Importance Plot (optional) ===
73importances = model.feature_importances_
74feature_names_arr = np.array(feature_names)
75indices = importances.argsort()[::-1]
76
77plt.figure(figsize=(10, 6))
78plt.title("Random Forest Feature Importance (on Scaled Data)")
79plt.bar(range(X.shape[1]), importances[indices], align="center")
80plt.xticks(range(X.shape[1]), feature_names_arr[indices], rotation=45)
81plt.tight_layout()
82# plt.show() # You can uncomment this locally if you want to see the plot
83
84# === SAVE MODEL + SCALERS + FEATURE NAMES ===
85joblib.dump(model, 'rf_model.pkl')
86joblib.dump(scaler_X, 'scaler_X.pkl')
87joblib.dump(scaler_y, 'scaler_y.pkl')
88joblib.dump(feature_names, 'feature_names.pkl')
89
90print("โ
Saved: rf_model.pkl, scaler_X.pkl, scaler_y.pkl, feature_names.pkl")
91 