ROC AUC (Receiver Operating Characteristic - Area Under Curve) является популярной метрикой для оценки качества бинарного классификатора. Однако, в некоторых ситуациях использование ROC AUC может быть неэффективным или вводящим в заблуждение.
При сильном дисбалансе классов, где один класс существенно преобладает над другим, ROC AUC может давать завышенные оценки качества модели. Это происходит потому, что ROC AUC учитывает как истинно положительные, так и ложно положительные сработки, но при этом не всегда отражает способность модели предсказывать редкий класс.
Если ошибки различных типов (ложно положительные и ложно отрицательные) имеют разную стоимость, ROC AUC может неадекватно отражать качество модели. В таких случаях более подходящей метрикой может быть Precision-Recall Curve или специфическая метрика, учитывающая стоимость ошибок.
При малом количестве положительных примеров (класса 1), ROC AUC может стать менее надежной, так как небольшое изменение в предсказаниях может существенно повлиять на значение метрики. В таких случаях Precision-Recall Curve и PR AUC могут предоставить более надежную оценку.
Может быть нестабильной и сильно зависеть от конкретного набора данных, особенно при небольших выборках. Это может привести к значительным колебаниям в оценках качества модели.
import numpy as np
import pandas as pd
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_auc_score, precision_recall_curve, auc
# Создание несбалансированного набора данных
X, y = make_classification(n_samples=1000, n_features=20, n_informative=2, n_redundant=10,
n_clusters_per_class=1, weights=[0.99], flip_y=0, random_state=42)
# Разделение на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Обучение модели логистической регрессии
model = LogisticRegression()
model.fit(X_train, y_train)
# Предсказание вероятностей
y_scores = model.predict_proba(X_test)[:, 1]
# Вычисление ROC AUC
roc_auc = roc_auc_score(y_test, y_scores)
# Вычисление Precision-Recall AUC
precision, recall, _ = precision_recall_curve(y_test, y_scores)
pr_auc = auc(recall, precision)
print(f"ROC AUC: {roc_auc}")
print(f"Precision-Recall AUC: {pr_auc}")
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
В Linux есть несколько команд для проверки свободного места на диске.
Эта команда отображает информацию о файловых системах, включая общий объём, использованное и свободное пространство.
df -h
Чтобы посмотреть только свободное место на корневом (
/) разделе: df -h /
Если нужно узнать место на конкретном диске или разделе:
df -h /dev/sda1
Команда
du показывает, сколько места занимает конкретная директория du -sh /путь/к/папке
lsblk — информация о дисках и разделах lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT
Если нужно увидеть структуру разделов диска
sudo fdisk -l
или
sudo parted -l
Если
du неудобен, можно установить и использовать ncdu: sudo apt install ncdu # Для Debian/Ubuntu
sudo yum install ncdu # Для CentOS/RHEL
ncdu
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Это два типа соединений (joins) в языке SQL, которые используются для объединения строк из двух или более таблиц на основе связанных столбцов. Основное различие между ними заключается в том, какие строки включаются в результирующий набор данных.
Возвращает только те строки, которые имеют совпадающие значения в обеих таблицах, участвующих в соединении. Возвращает строки, где существует совпадение значений в обоих таблицах. Если нет совпадающих значений, строка не будет включена в результирующий набор.
SELECT Employees.name, Departments.department_name
FROM Employees
INNER JOIN Departments ON Employees.department_id = Departments.id;
Возвращает все строки из левой таблицы (первой таблицы в запросе) и соответствующие строки из правой таблицы. Если в правой таблице нет совпадающих строк, в результирующем наборе будут NULL значения для столбцов правой таблицы. Возвращает все строки из левой таблицы и соответствующие строки из правой таблицы. Если в правой таблице нет соответствия, возвращаются NULL значения для правой таблицы.
SELECT Employees.name, Departments.department_name
FROM Employees
LEFT JOIN Departments ON Employees.department_id = Departments.id;
Возвращает только совпадающие строки. Если нет совпадений, строки не включаются в результат.
Возвращает все строки из левой таблицы. Включает совпадающие строки из правой таблицы. Если нет совпадений, строки из правой таблицы будут заполнены NULL значениями.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Это два типа данных в SQL, которые используются для хранения строковых данных. Основные различия между ними касаются способа хранения данных и управления памятью.
CHAR(n) хранит строки фиксированной длины n. Если строка короче, она дополняется пробелами до указанной длины.Использует фиксированное количество памяти, равное указанной длине
n, независимо от фактической длины строки.Может быть быстрее в некоторых случаях, так как длина строк фиксирована и известна заранее, что упрощает управление памятью.
Подходит для хранения данных, которые всегда имеют одинаковую длину, например, коды стран, идентификаторы и т.д.
CREATE TABLE example (
fixed_char CHAR(10)
);
VARCHAR(n) хранит строки переменной длины, где n — это максимальная длина строки. Реальная длина строки определяется по количеству символов в ней.Использует только столько памяти, сколько необходимо для хранения фактической длины строки, плюс дополнительные байты для хранения информации о длине строки.
Может быть менее эффективным в некоторых случаях по сравнению с
CHAR, так как длина строки не фиксирована и требует дополнительной обработки для управления памятью.Подходит для хранения данных, длина которых может варьироваться, например, имена, адреса, описания и т.д.
CREATE TABLE example (
variable_char VARCHAR(50)
);
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Термин «Ошибка на миллиард долларов» (
The Billion Dollar Mistake) был введён Тони Хоаром (Tony Hoare), создателем NULL, который в 2009 году на конференции признался, что введение NULL было его крупнейшей ошибкой. Название связано с тем, что NULL стал причиной множества багов, сбоев в программах и уязвимостей, что привело к огромным финансовым потерям в индустрии.- Попытка вызвать метод у
NULL приводит к ошибке NullPointerException в Java, NullReferenceException в C# и аналогичным сбоям в других языках.- Это одна из самых распространённых ошибок в программировании.
- Из-за
NULL приходится постоянно писать проверки if (x != null), что раздувает код и делает его менее читаемым.- Если забыть такую проверку, можно получить неожиданный сбой.
-
NULL можно передавать в любую функцию или объект, что ломает строгую типизацию.- Код становится менее предсказуемым.
-
NULL в SQL ведёт себя неинтуитивно (NULL != NULL, сравнение может давать UNKNOWN).- Может приводить к некорректным вычислениям в агрегатных функциях.
- Некоторые атаки используют
NULL для взлома систем (например, null dereference в C/C++ может привести к DoS-атаке).-
NULL может скрывать ошибки и приводить к утечке данных.- Использование обёрток вроде
Optional<T> (Java) или Option<T> (Rust) позволяет явно указывать возможность отсутствия значения.- Вместо возврата
NULL можно выбрасывать осмысленные исключения (IllegalArgumentException, NotFoundException).- Вместо
NULL можно использовать дефолтные объекты (EmptyList, GuestUser и т. д.).- Например, в Haskell и Rust применяют
Either<T, E>, Option<T>, что делает обработку NULL-подобных случаев более явной.Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Плохая организация кода — это один из главных факторов, который делает поддержку и развитие проекта сложными. Определить, что код плохо организован, можно по следующим признакам:
- Файлы и каталоги разбросаны хаотично.
- Код находится в одном огромном файле без логического разделения.
- Нет четкой модулярности (всё смешано в одном месте).
- Один и тот же фрагмент кода повторяется в разных местах вместо вынесения в отдельные функции или классы.
- При внесении изменений приходится исправлять одну и ту же логику в нескольких местах.
- Функции или методы слишком длинные и делают слишком много.
- Код трудно читать из-за вложенных конструкций (
if, for, while и т. д.).- Используются сложные алгоритмы там, где можно было бы обойтись более простыми.
- Один класс выполняет несколько задач (нарушение *Single Responsibility Principle*).
- Сильная зависимость между модулями (нарушение *Dependency Inversion Principle*).
- Проблемы с расширяемостью кода.
- Используются непонятные или слишком короткие названия (
a, x1, doSomething).- Название не отражает суть выполняемой операции.
- Если документации нет, код сложно понять.
- Если документации слишком много, и она не актуальна, это также мешает.
- Компоненты сильно зависят друг от друга, что усложняет тестирование и внесение изменений.
- Модули не могут использоваться независимо.
- Если код сложно протестировать, это признак плохой организации.
- Нет юнит-тестов или они покрывают только тривиальные случаи.
- Ошибки не логируются, а просто подавляются (
try...catch с пустым catch).- Ошибки обрабатываются хаотично.
- Избыточное потребление памяти или процессорных ресурсов из-за неоптимальных алгоритмов.
- Использование ненужных циклов, повторные вызовы функций.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM