# Изисквания: pip install numpy pandas scikit-learn matplotlib import numpy as np import pandas as pd from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier, plot_tree from sklearn.metrics import classification_report, confusion_matrix, accuracy_score import matplotlib.pyplot as plt # 1) Генериране на синтетични данни (симулиращи мрежови трафик) # Тук използваме make_classification: всеки ред = сесия/пакет; target = клас (напр. "злонамерен"/"нормален") X, y = make_classification( n_samples=2000, # брой примери n_features=10, # общ брой признаци (можеш да увеличиш по-нататък) n_informative=6, # колко признака са информативни за класа n_redundant=2, # линейно зависими признаци n_repeated=0, n_classes=2, # бинарна класификация (например 0 = нормален, 1 = опасен) weights=[0.8, 0.2], # лек дисбаланс (80% нормални, 20% атаки) class_sep=1.2, random_state=42 ) # 2) Зареждане в DataFrame чрез pandas feature_names = [f'feat_{i}' for i in range(X.shape[1])] df = pd.DataFrame(X, columns=feature_names) df['label'] = y print(df.head()) # 3) Разделяне на тренировъчен и тестов набор X = df[feature_names].values y = df['label'].values X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.3, stratify=y, random_state=42 ) # 4) Използване на данните за обучение на Decision Tree clf = DecisionTreeClassifier( criterion='gini', max_depth=5, # контролира простотата на дървото; пробвай различни стойности min_samples_split=10, random_state=42 ) clf.fit(X_train, y_train) # 5) Начертаване на дървото plt.figure(figsize=(16,8)) plot_tree(clf, feature_names=feature_names, class_names=['normal','attack'], filled=True, fontsize=8) plt.title("Decision Tree") plt.show() # 6) Оценка на представянето върху тестовия масив y_pred = clf.predict(X_test) print("Accuracy:", accuracy_score(y_test, y_pred)) print("Confusion matrix:\n", confusion_matrix(y_test, y_pred)) print("Classification report:\n", classification_report(y_test, y_pred)) # 7) Проба със същото, но увеличаване на броя признаци # Генерираме нов набор с повече признаци (напр. 30) X2, y2 = make_classification( n_samples=2000, n_features=30, n_informative=15, n_redundant=10, n_classes=2, weights=[0.8, 0.2], class_sep=1.0, random_state=1 ) df2 = pd.DataFrame(X2, columns=[f'feat_{i}' for i in range(X2.shape[1])]) df2['label'] = y2 X2 = df2.drop(columns=['label']).values y2 = df2['label'].values X2_train, X2_test, y2_train, y2_test = train_test_split(X2, y2, test_size=0.3, stratify=y2, random_state=1) clf2 = DecisionTreeClassifier(max_depth=6, min_samples_split=10, random_state=1) clf2.fit(X2_train, y2_train) y2_pred = clf2.predict(X2_test) print("With 30 features - Accuracy:", accuracy_score(y2_test, y2_pred)) print("With 30 features - Classification report:\n", classification_report(y2_test, y2_pred))