{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":36363,"databundleVersionId":4050810,"sourceType":"competition"}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"pip install pycaret\n\npip install pandas pydicom opencv-python tensorflow\n\npip install pylibjpeg-libjpeg pylibjpeg-openjpeg\n\npip install pylibjpeg\n\npip install numpy==1.26.4","metadata":{}},{"cell_type":"code","source":"# Підключення бібліотек\nimport os\nimport pydicom\nimport cv2\nimport random\nimport matplotlib.pyplot as plt\nimport pandas as pd\nimport seaborn as sns\nfrom imblearn.over_sampling import SMOTE\nfrom pycaret.classification import *\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import StandardScaler\nimport numpy as np","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-16T01:29:22.085808Z","iopub.execute_input":"2024-11-16T01:29:22.086972Z","iopub.status.idle":"2024-11-16T01:29:22.093481Z","shell.execute_reply.started":"2024-11-16T01:29:22.086924Z","shell.execute_reply":"2024-11-16T01:29:22.092105Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 1. Ознайомитись з набором даних https://www.kaggle.com/competitions/rsna-2022-cervical-spine-fracture-detection. \n\n## Для читання зображень (https://www.kaggle.com/code/micheldc55/how-to-read-dcm-dicom-data)","metadata":{}},{"cell_type":"code","source":"# Параметри для даних\nbase_dir = '/kaggle/input/rsna-2022-cervical-spine-fracture-detection/'\nimage_data_dir = os.path.join(base_dir, 'train_images/')\nval_data_dir = os.path.join(base_dir, 'test_images/')\ntrain_csv = os.path.join(base_dir, 'train.csv')\ntest_csv_path = os.path.join(base_dir, 'test.csv')\nbounding_boxes_csv = os.path.join(base_dir, 'train_bounding_boxes.csv')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-16T01:29:22.104398Z","iopub.execute_input":"2024-11-16T01:29:22.105239Z","iopub.status.idle":"2024-11-16T01:29:22.111062Z","shell.execute_reply.started":"2024-11-16T01:29:22.105193Z","shell.execute_reply":"2024-11-16T01:29:22.109855Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Завантажимо метадані\ntrain_df = pd.read_csv(train_csv)\ndf = train_df.copy()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-16T01:29:22.131292Z","iopub.execute_input":"2024-11-16T01:29:22.131747Z","iopub.status.idle":"2024-11-16T01:29:22.151874Z","shell.execute_reply.started":"2024-11-16T01:29:22.131705Z","shell.execute_reply":"2024-11-16T01:29:22.150393Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Функція для завантаження DICOM-зображень\ndef load_dicom_img(file_path):\n    dicom = pydicom.dcmread(file_path)\n    array = dicom.pixel_array\n    return array","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-16T01:29:22.153975Z","iopub.execute_input":"2024-11-16T01:29:22.154358Z","iopub.status.idle":"2024-11-16T01:29:22.160345Z","shell.execute_reply.started":"2024-11-16T01:29:22.154319Z","shell.execute_reply":"2024-11-16T01:29:22.158983Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Функція для візуалізації DICOM-зображень\ndef plot_dicom_image(image_array, title=\"DICOM Image\"):\n    plt.imshow(image_array, cmap=\"bone\")\n    plt.title(title)\n    plt.axis('off')\n    plt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-16T01:29:22.162151Z","iopub.execute_input":"2024-11-16T01:29:22.162729Z","iopub.status.idle":"2024-11-16T01:29:22.17332Z","shell.execute_reply.started":"2024-11-16T01:29:22.162666Z","shell.execute_reply":"2024-11-16T01:29:22.171971Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Функція для тестування завантаження та візуалізації 5 рандомних зображень\ndef visualize_random_dicom_images(train_df, image_data_dir, num_samples=5):\n    # Вибір 5 рандомних StudyInstanceUID\n    random_studies = train_df['StudyInstanceUID'].sample(num_samples).tolist()\n    \n    for study_uid in random_studies:\n        study_dir = os.path.join(image_data_dir, study_uid)\n        \n        # Отримання всіх файлів *.dcm у теці\n        dicom_files = [f for f in os.listdir(study_dir) if f.endswith('.dcm')]\n        if not dicom_files:\n            print(f\"У теці {study_dir} немає DICOM-файлів.\")\n            continue\n        \n        # Вибір випадкового файлу\n        random_file = random.choice(dicom_files)\n        file_path = os.path.join(study_dir, random_file)\n        \n        # Завантаження та візуалізація\n        image = load_dicom_img(file_path)\n        plot_dicom_image(image, title=f\"Study: {study_uid}, File: {random_file}\")\n\n# Виклик функції\nvisualize_random_dicom_images(train_df, image_data_dir)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-16T01:29:22.176007Z","iopub.execute_input":"2024-11-16T01:29:22.176409Z","iopub.status.idle":"2024-11-16T01:29:23.81153Z","shell.execute_reply.started":"2024-11-16T01:29:22.176368Z","shell.execute_reply":"2024-11-16T01:29:23.809986Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 2. Пояснювальний аналіз даних.","metadata":{}},{"cell_type":"code","source":"# Переглянемо перші рядки\nprint(df.head())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-16T01:29:23.813664Z","iopub.execute_input":"2024-11-16T01:29:23.814093Z","iopub.status.idle":"2024-11-16T01:29:23.82354Z","shell.execute_reply.started":"2024-11-16T01:29:23.81405Z","shell.execute_reply":"2024-11-16T01:29:23.822215Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Інформація про типи даних та пропущені значення\nprint(df.info())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-16T01:29:23.825799Z","iopub.execute_input":"2024-11-16T01:29:23.826232Z","iopub.status.idle":"2024-11-16T01:29:23.841865Z","shell.execute_reply.started":"2024-11-16T01:29:23.826191Z","shell.execute_reply":"2024-11-16T01:29:23.8406Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Перевірка на наявність пропущених значень\nprint(df.isnull().sum())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-16T01:29:23.844996Z","iopub.execute_input":"2024-11-16T01:29:23.845406Z","iopub.status.idle":"2024-11-16T01:29:23.857077Z","shell.execute_reply.started":"2024-11-16T01:29:23.845366Z","shell.execute_reply":"2024-11-16T01:29:23.855707Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Статистичний опис числових стовпців\nprint(df.describe())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-16T01:29:23.859725Z","iopub.execute_input":"2024-11-16T01:29:23.860235Z","iopub.status.idle":"2024-11-16T01:29:23.890004Z","shell.execute_reply.started":"2024-11-16T01:29:23.860183Z","shell.execute_reply":"2024-11-16T01:29:23.888729Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 3. Визначити збалансованість класів","metadata":{}},{"cell_type":"code","source":"# Статистика по наявності переломів у хребцях\ncolumns = ['C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7']\n\nfracture_counts = df[columns].sum()\nprint(fracture_counts)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-16T01:29:23.891574Z","iopub.execute_input":"2024-11-16T01:29:23.891986Z","iopub.status.idle":"2024-11-16T01:29:23.900469Z","shell.execute_reply.started":"2024-11-16T01:29:23.891948Z","shell.execute_reply":"2024-11-16T01:29:23.899284Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Візуалізація розподілу переломів по хребцях\nfracture_counts.plot(kind='bar', figsize=(12, 6))\nplt.title('Distribution of Fractures by Cervical Vertebrae')\nplt.ylabel('Number of Positive Cases')\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-16T01:29:23.901729Z","iopub.execute_input":"2024-11-16T01:29:23.902094Z","iopub.status.idle":"2024-11-16T01:29:24.175156Z","shell.execute_reply.started":"2024-11-16T01:29:23.902058Z","shell.execute_reply":"2024-11-16T01:29:24.173463Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Створимо список всіх класів C1-C7 df[classes].value_counts()\ncolumns = ['C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7']\n\n# Перевірка розподілу класів\nclass_counts = {}\nfor cls in columns:\n    class_counts[cls] = df[cls].value_counts()\n\n# Виведемо результат\nfor cls, counts in class_counts.items():\n    print(f\"{cls}:\\n{counts}\\n\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-16T01:29:24.176671Z","iopub.execute_input":"2024-11-16T01:29:24.177078Z","iopub.status.idle":"2024-11-16T01:29:24.190622Z","shell.execute_reply.started":"2024-11-16T01:29:24.17704Z","shell.execute_reply":"2024-11-16T01:29:24.189391Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Побудуємо графік розподілу класів\nclass_labels = list(class_counts.keys())\nclass_0_counts = [counts.get(0, 0) for counts in class_counts.values()]\nclass_1_counts = [counts.get(1, 0) for counts in class_counts.values()]\n\n# Створимо графік\nx = range(len(columns))\nwidth = 0.35\n\nplt.figure(figsize=(10, 6))\n\n# Створюємо два набори стовпців для 0 і 1\nplt.bar(x, class_0_counts, width, label='0', color='skyblue')\nplt.bar([i + width for i in x], class_1_counts, width, label='1', color='orange')\n\n# Додавання заголовків та міток\nplt.xlabel('Мітка')\nplt.ylabel('Кількість прикладів')\nplt.title('Розподіл класів у тренувальному наборі даних')\nplt.xticks([i + width / 2 for i in x], class_labels)\nplt.legend()\n\n# Показуємо графік\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-16T01:29:24.192236Z","iopub.execute_input":"2024-11-16T01:29:24.192745Z","iopub.status.idle":"2024-11-16T01:29:24.607865Z","shell.execute_reply.started":"2024-11-16T01:29:24.192693Z","shell.execute_reply":"2024-11-16T01:29:24.606679Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Обчислення кореляційної матриці\ncorrelation_matrix = df[columns].corr()\n\n# Виведення кореляційної матриці\nprint(\"Кореляційна матриця для міток C1-C7:\")\nprint(correlation_matrix)\n\n# Візуалізація кореляційної матриці\nplt.figure(figsize=(10, 8))\nsns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', fmt='.2f', linewidths=0.5, cbar=True)\nplt.title('Кореляційна матриця для міток C1-C7')\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-16T01:29:24.611369Z","iopub.execute_input":"2024-11-16T01:29:24.611823Z","iopub.status.idle":"2024-11-16T01:29:25.090779Z","shell.execute_reply.started":"2024-11-16T01:29:24.61178Z","shell.execute_reply":"2024-11-16T01:29:25.089314Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Розподіл на ознаки (X) та цільові змінні (y)\nX = df.drop(columns=['StudyInstanceUID', 'patient_overall'])\ny = df[columns].values","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-16T01:29:25.092236Z","iopub.execute_input":"2024-11-16T01:29:25.092619Z","iopub.status.idle":"2024-11-16T01:29:25.10075Z","shell.execute_reply.started":"2024-11-16T01:29:25.09258Z","shell.execute_reply":"2024-11-16T01:29:25.099127Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Перевести y з one-hot encoding в категоріальні мітки\ny = np.argmax(y, axis=1)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-16T01:29:25.102252Z","iopub.execute_input":"2024-11-16T01:29:25.102669Z","iopub.status.idle":"2024-11-16T01:29:25.111441Z","shell.execute_reply.started":"2024-11-16T01:29:25.102629Z","shell.execute_reply":"2024-11-16T01:29:25.110082Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Використання SMOTE для збалансування класів\nsmote = SMOTE(sampling_strategy='auto', random_state=42)\nX_resampled, y_resampled = smote.fit_resample(X, y)\n\n# Перевірка результату\nprint(\"Після SMOTE:\")\nprint(pd.Series(y_resampled).value_counts())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-16T01:29:25.112899Z","iopub.execute_input":"2024-11-16T01:29:25.113249Z","iopub.status.idle":"2024-11-16T01:29:25.145284Z","shell.execute_reply.started":"2024-11-16T01:29:25.113213Z","shell.execute_reply":"2024-11-16T01:29:25.144015Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Розподіл на навчальну та тестову вибірки\nX_train, X_test, y_train, y_test = train_test_split(X_resampled, y_resampled, test_size=0.2, random_state=42)\n\n# Масштабування ознак\nscaler = StandardScaler()\nX_train_scaled = scaler.fit_transform(X_train)\nX_test_scaled = scaler.transform(X_test)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-16T01:29:25.147291Z","iopub.execute_input":"2024-11-16T01:29:25.147669Z","iopub.status.idle":"2024-11-16T01:29:25.164722Z","shell.execute_reply.started":"2024-11-16T01:29:25.147629Z","shell.execute_reply":"2024-11-16T01:29:25.163322Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## 4. Визначити модель класифікації.\n\n    Побудувати модель прогнозування класифікатор (pycaret). Використати крос-валідацію та метрику F1 для оцінки точності","metadata":{}},{"cell_type":"code","source":"# Ініціалізація середовища для класифікації\nmodels_classification = {target: {} for target in columns}\n\nfor target in columns:\n    clf = setup(data=X_resampled, target=target, session_id=42, \n             train_size=0.8, normalize=True, \n             ignore_features=['feature_to_ignore1', 'feature_to_ignore2'],\n             fold=5, fix_imbalance=True)\n    \n    # Порівняння моделей з використанням крос-валідації та метрики F1\n    best_model = compare_models(sort='F1')\n    models_classification[target] = create_model(best_model)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-16T01:29:25.16674Z","iopub.execute_input":"2024-11-16T01:29:25.167221Z","iopub.status.idle":"2024-11-16T01:34:29.270366Z","shell.execute_reply.started":"2024-11-16T01:29:25.167169Z","shell.execute_reply":"2024-11-16T01:34:29.269236Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Найкраща модель для кожної мітки\nfor target in columns:\n    print(f\"Мітка {target}: {models_classification[target]}\\n\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-16T01:34:29.272018Z","iopub.execute_input":"2024-11-16T01:34:29.272469Z","iopub.status.idle":"2024-11-16T01:34:29.283373Z","shell.execute_reply.started":"2024-11-16T01:34:29.272425Z","shell.execute_reply":"2024-11-16T01:34:29.282235Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Висновок:\n\n    1. Простота vs Складність: Моделі, як DecisionTree, QDA та Logistic Regression (не згадані тут, але можуть бути схожими на інші), є менш складними і швидшими у виконанні. Вони підходять для базових задач, де можна припустити лінійні або прості розподіли даних. Проте при складних та нелінійних залежностях вони можуть мати суттєві обмеження.\n    \n    2. Висока точність та складність: Моделі як GradientBoosting, LGBM і XGBoost є значно більш потужними для складних завдань. Вони забезпечують високі результати, але потребують налаштування і вимагають більше часу на тренування та оптимізацію.\n\n    3. Перенавчання: Як і всі моделі, ансамблеві методи, такі як GradientBoosting, LGBM і XGBoost, можуть бути схильні до перенавчання, якщо не буде застосовано належне налаштування параметрів або регуляризації.\n\n    4. Швидкість навчання та масштабування: Якщо обробка великих наборів даних є важливою, LGBM і XGBoost є кращими варіантами завдяки їхній швидкості та ефективності.","metadata":{}},{"cell_type":"markdown","source":"## Реалізація моделі пошуку аномалій на основі кластеризації (PyOD)","metadata":{}},{"cell_type":"code","source":"from sklearn.cluster import KMeans, DBSCAN\n\n# Створимо словники для зберігання результатів\nclusters_kmeans = {}\nclusters_dbscan = {}\nmodels_kmeans = {}\nmodels_dbscan = {}\n\n# Обчислення кластерів для кожного методу\nfor i in columns:\n    print(f\"\\nСтворення моделі кластеризації для мітки {i}\")\n\n    # Ініціалізація моделей\n    model_kmeans = KMeans(n_clusters=3, random_state=42)  # Приклад з 3 кластерами\n    model_dbscan = DBSCAN(eps=0.5, min_samples=5)\n\n    # Навчання моделей\n    model_kmeans.fit(X_resampled)\n    model_dbscan.fit(X_resampled)\n\n    # Збереження моделей\n    models_kmeans[i] = model_kmeans\n    models_dbscan[i] = model_dbscan\n\n    # Прогнозування кластерів\n    predictions_kmeans = model_kmeans.predict(X_train_scaled)\n    predictions_dbscan = model_dbscan.labels_\n\n    clusters_kmeans[i] = predictions_kmeans\n    clusters_dbscan[i] = predictions_dbscan\n\n    # Виведення кількості точок в кожному кластері\n    print(f\"KMeans: Кількість точок в кластерах: {len(set(predictions_kmeans))}\")\n    print(f\"DBSCAN: Кількість точок в кластерах: {len(set(predictions_dbscan))}\")\n\n# Створення DataFrame з результатами\nresult_df = pd.DataFrame({\n    'Column': columns,\n    'KMeans_Clusters': [len(set(clusters_kmeans[col])) for col in columns],\n    'DBSCAN_Clusters': [len(set(clusters_dbscan[col])) for col in columns],\n    'KMeans_First_10': [clusters_kmeans[col][:10] for col in columns],\n    'DBSCAN_First_10': [clusters_dbscan[col][:10] for col in columns]\n})\n\n# Виведення результатів\nprint(\"\\nРезультати для кожного стовпця:\")\nprint(result_df)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-16T01:34:29.285071Z","iopub.execute_input":"2024-11-16T01:34:29.285463Z","iopub.status.idle":"2024-11-16T01:34:33.128294Z","shell.execute_reply.started":"2024-11-16T01:34:29.285418Z","shell.execute_reply":"2024-11-16T01:34:33.126646Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"#  Висновки:\n\n    1. KMeans намагається жорстко поділити дані на три класи, і тому кількість кластерів для кожного стовпця однакова (3), хоча дані можуть бути більш складними і мати різну внутрішню структуру.\n        * Недолік: KMeans може не справлятися з складними або не лінійними структурами кластерів.\n\n    2. DBSCAN, у свою чергу, визначає набагато більше кластерів (42) і може краще виявляти складні структури даних, оскільки цей алгоритм не вимагає заздалегідь визначеної кількості кластерів. Однак, DBSCAN може мати проблеми з надто розрідженими або занадто щільними точками, залежно від налаштувань параметрів (наприклад, eps і min_samples).\n        * Перевага: Може виявляти \"шумні\" точки, які не належать до жодного з кластерів.","metadata":{}},{"cell_type":"markdown","source":"## Реалізація моделі прогнозування на основі кластеризації (PyCaret)","metadata":{}},{"cell_type":"code","source":"from pycaret.clustering import setup as clustering_setup, create_model as clustering_create_model, assign_model\nfrom pycaret.classification import setup as classification_setup, compare_models, create_model\n\n# Кластеризація: створюємо кластерну мітку для всіх класів\ncluster_setup = clustering_setup(data=X_resampled[columns], session_id=123)\nkmeans_model = clustering_create_model('kmeans', num_clusters=7)\n\n# Додаємо кластерні мітки як нову ознаку до початкового датафрейму\ncluster_labels = assign_model(kmeans_model)\ntrain_df_with_clusters = X_resampled.copy()\ntrain_df_with_clusters['cluster'] = cluster_labels['Cluster']\n\n# Класифікація для кожного класу (C1, C2, ... C7) з використанням кластерної ознаки\ncluster_based_models = {}\n\nfor target in columns:\n    print(f\"\\nПобудова класифікаційної моделі для класу {target}\")\n    \n    # Налаштування PyCaret для кожного класу з доданою ознакою 'cluster'\n    clf_setup = classification_setup(\n        data=train_df_with_clusters, \n        target=target, \n        fold_strategy='stratifiedkfold', \n        fold=5, \n        fold_shuffle=True, \n        session_id=123\n    )\n    \n    # Порівняння та вибір найкращої класифікаційної моделі\n    best_model = compare_models(sort='F1', fold=5)\n    print(f\"Найкраща класифікаційна модель для {target}: {best_model}\")\n    \n    # Збереження моделі для кожного класу\n    cluster_based_models[target] = create_model(best_model)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-16T01:34:33.13029Z","iopub.execute_input":"2024-11-16T01:34:33.131111Z","iopub.status.idle":"2024-11-16T01:38:45.893093Z","shell.execute_reply.started":"2024-11-16T01:34:33.131062Z","shell.execute_reply":"2024-11-16T01:38:45.891618Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Моделі прогнозування для всіх міток\nfor i in columns:\n    print(f\"Мітка {i}: {cluster_based_models[i]}\\n\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-16T01:38:45.89466Z","iopub.execute_input":"2024-11-16T01:38:45.895022Z","iopub.status.idle":"2024-11-16T01:38:45.905034Z","shell.execute_reply.started":"2024-11-16T01:38:45.894987Z","shell.execute_reply":"2024-11-16T01:38:45.903389Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Висновок:\n\n    * Простота vs складність: Моделі типу LDA, Logistic Regression та Naive Bayes (GaussianNB) є простими і підходять для швидкої класифікації, якщо дані мають лінійні залежності. Вони добре працюють, коли є невелика кількість даних або чіткі лінійні розмежування між класами.\n\n    * Нелінійні та складніші задачі: Для задач з більш складними та нелінійними залежностями між класами методи типу Gradient Boosting можуть бути набагато ефективнішими, хоч вони й вимагають більшого часу на налаштування та навчання.\n\n    * Налаштування параметрів: Методи KNN і Gradient Boosting вимагають обережної настройки параметрів, таких як кількість сусідів або кількість дерев, щоб досягти оптимальних результатів. Для KNN також важливо вибрати правильну метрику для відстані.\n\n    * Загальний підхід: Для задач, де не можна чітко визначити лінійні чи нелінійні зв'язки, оптимальним варіантом може бути використання ансамблевих методів, таких як Gradient Boosting, або гібридних підходів для покращення точності.\n\n    * Баланс між точністю та часом навчання: Якщо набір з великими обсягами даних або високими вимогами до часу обчислень, треба враховувати витрати часу на навчання для кожної моделі, а також застосовувати методи для оптимізації моделі.\n\n    Таким чином, в залежності від характеристик вхідних даних та необхідних ресурсів, можна вибрати одну з цих моделей або їх комбінацію для досягнення найкращих результатів.","metadata":{}}]}