|
|
# === Вот эта связка нужна для всех исполняемых скриптов внутри библиотеки, которая будет использоваться как сабмодуль ===
|
|
|
|
|
|
import sys
|
|
|
from pathlib import Path
|
|
|
|
|
|
ROOT = Path(__file__).parent.parent
|
|
|
if str(ROOT) not in sys.path:
|
|
|
sys.path.insert(0, str(ROOT))
|
|
|
|
|
|
# === перед вмеми импортами ===
|
|
|
|
|
|
import pandas as pd
|
|
|
import numpy as np
|
|
|
import joblib
|
|
|
import argparse
|
|
|
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score
|
|
|
|
|
|
def evaluate(csv_path, model_path, test_size=0.2, random_state=42):
|
|
|
# Загрузка модели
|
|
|
data = joblib.load(model_path)
|
|
|
model = data['model']
|
|
|
class_names = data['class_names']
|
|
|
print(f"Loaded model with classes: {class_names}")
|
|
|
|
|
|
# Загрузка данных
|
|
|
df = pd.read_csv(csv_path)
|
|
|
X = df.iloc[:, 1:].values.astype(np.float32)
|
|
|
y_labels = df.iloc[:, 0].values
|
|
|
|
|
|
label_to_id = {label: i for i, label in enumerate(class_names)}
|
|
|
y = np.array([label_to_id[label] for label in y_labels])
|
|
|
|
|
|
# Разделение (должно совпадать с параметрами обучения)
|
|
|
from sklearn.model_selection import train_test_split
|
|
|
_, X_test, _, y_test, _, y_labels_test = train_test_split(
|
|
|
X, y, y_labels, test_size=test_size, random_state=random_state, stratify=y
|
|
|
)
|
|
|
print(f"Test size: {len(X_test)}")
|
|
|
|
|
|
y_pred = model.predict(X_test)
|
|
|
acc = accuracy_score(y_test, y_pred)
|
|
|
report = classification_report(y_test, y_pred, target_names=class_names)
|
|
|
cm = confusion_matrix(y_test, y_pred)
|
|
|
|
|
|
print(f"\nAccuracy: {acc:.4f}")
|
|
|
print("\nClassification Report:")
|
|
|
print(report)
|
|
|
print("Confusion Matrix:")
|
|
|
print(cm)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
parser = argparse.ArgumentParser()
|
|
|
parser.add_argument('--csv', required=True, help='CSV с данными')
|
|
|
parser.add_argument('--model', required=True, help='Путь к модели')
|
|
|
parser.add_argument('--test_size', type=float, default=0.2)
|
|
|
parser.add_argument('--random_state', type=int, default=42)
|
|
|
args = parser.parse_args()
|
|
|
evaluate(args.csv, args.model, args.test_size, args.random_state)
|