File size: 4,713 Bytes
d134ff9 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
import os
import pickle
import pandas as pd
class SVM_Classifier:
def __init__(self):
self.weight = 70 # default weight in kg
self.height = 1.75 # default height in m
self.gender = "Male" # default gender
self.duration = 1.0 # default duration in hours
self.fat = 25 # default fat percentage
self.freq = 3 # default workouts per week
self.experience = 1 # default experience level
self.workout = "Cardio" # default workout type
# Add debug info dictionary
self.debug_info = {}
# Load the model and required data
try:
# Load the SVM model
model_file = os.path.join("data", "svm_model.pkl")
with open(model_file, 'rb') as f:
self.svm_model = pickle.load(f)
# Load the column names
cols_file = os.path.join("data", "column_names.csv")
with open(cols_file, 'r') as f:
self.column_names = [line.strip() for line in f]
# Load normalization parameters
mean_file = os.path.join("data", "SVM_train_mean.csv")
self.df_mean = pd.read_csv(mean_file, index_col=0)
std_file = os.path.join("data", "SVM_train_std.csv")
self.df_std = pd.read_csv(std_file, index_col=0)
except Exception as e:
print(f"Error loading model files: {str(e)}")
raise
def make_prediction(self):
try:
num = [self.weight, self.height, self.duration, self.fat, self.freq, self.experience]
self.debug_info['original_values'] = dict(zip(
['weight', 'height', 'duration', 'fat', 'freq', 'experience'],
num
))
m_norm = self.df_mean.values.flatten().tolist()
s_norm = self.df_std.values.flatten().tolist()
self.debug_info['normalization'] = {
'means': m_norm,
'stds': s_norm
}
norm = [(x-y)/z for x, y, z in zip(num, m_norm, s_norm)]
self.debug_info['normalized_values'] = dict(zip(
['weight', 'height', 'duration', 'fat', 'freq', 'experience'],
norm
))
if self.gender == 'Female':
norm.extend([1,0])
self.debug_info['gender_encoding'] = 'Female: [1, 0]'
else:
norm.extend([0,1])
self.debug_info['gender_encoding'] = 'Male: [0, 1]'
# Add one-hot encoded workout type
workout_encoding = {
'Cardio': [1, 0, 0, 0],
'HIIT': [0, 1, 0, 0],
'Strength': [0, 0, 1, 0],
'Yoga': [0, 0, 0, 1]
}
norm.extend(workout_encoding[self.workout])
self.debug_info['workout_encoding'] = f'{self.workout}: {workout_encoding[self.workout]}'
X = pd.DataFrame([norm],columns=self.column_names)
self.debug_info['final_feature_vector'] = X.to_dict('records')[0]
prediction = self.svm_model.predict(X)
self.debug_info['prediction'] = prediction[0]
return prediction[0]
except Exception as e:
self.debug_info['error'] = str(e)
return f"Error: {str(e)}"
def get_debug_info(self):
"""Returns formatted debug information"""
debug_text = "=== DEBUG INFORMATION ===\n\n"
# Original values
debug_text += "Original Values:\n"
for key, value in self.debug_info['original_values'].items():
debug_text += f"{key}: {value}\n"
# Normalization parameters
debug_text += "\nNormalization Parameters:\n"
for i, (mean, std) in enumerate(zip(
self.debug_info['normalization']['means'],
self.debug_info['normalization']['stds']
)):
debug_text += f"Feature {i}: mean={mean:.4f}, std={std:.4f}\n"
# Normalized values
debug_text += "\nNormalized Values:\n"
for key, value in self.debug_info['normalized_values'].items():
debug_text += f"{key}: {value:.4f}\n"
# Encodings
debug_text += f"\nGender Encoding: {self.debug_info['gender_encoding']}\n"
debug_text += f"Workout Encoding: {self.debug_info['workout_encoding']}\n"
# Final vector
debug_text += f"\nVector: {self.debug_info['final_feature_vector']}\n"
# Final prediction
debug_text += f"\nFinal Prediction: {self.debug_info['prediction']}\n"
return debug_text
|