Data Science | Вопросы собесов
4.96K subscribers
33 photos
1 video
1.05K links
Download Telegram
🤔 Как оценивать эффективность работы рекомендательных моделей?

Оценка эффективности рекомендательных моделей делится на точностные и ранговые метрики.

🚩Точностные метрики

🟠RMSE (Среднеквадратичная ошибка)
Формула
RMSE = \sqrt{\frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2}


Пример
from sklearn.metrics import mean_squared_error
import numpy as np

y_true = np.array([4, 3, 5, 2])
y_pred = np.array([3.8, 2.9, 5.1, 2.2])
rmse = np.sqrt(mean_squared_error(y_true, y_pred))
print(f'RMSE: {rmse}')


🟠MAE (Средняя абсолютная ошибка)
Формула
MAE = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y}_i|


Пример
from sklearn.metrics import mean_absolute_error

y_true = np.array([4, 3, 5, 2])
y_pred = np.array([3.8, 2.9, 5.1, 2.2])
mae = mean_absolute_error(y_true, y_pred)
print(f'MAE: {mae}')


🚩Ранговые метрики

🟠Precision@K и Recall@K
Precision@K: Доля релевантных элементов среди первых K предложений.
Recall@K: Доля найденных релевантных элементов среди всех возможных релевантных.
Пример
def precision_at_k(recommended_items, relevant_items, k):
return len(set(recommended_items[:k]) & set(relevant_items)) / k

def recall_at_k(recommended_items, relevant_items, k):
return len(set(recommended_items[:k]) & set(relevant_items)) / len(relevant_items)

recommended_items = [1, 2, 3, 4, 5]
relevant_items = [3, 4, 5, 6, 7]
k = 3

print(f'Precision@{k}: {precision_at_k(recommended_items, relevant_items, k)}')
print(f'Recall@{k}: {recall_at_k(recommended_items, relevant_items, k)}')


🟠MAP (Средний показатель)
Пример
def average_precision(recommended_items, relevant_items):
score = 0.0
num_hits = 0.0
for i, item in enumerate(recommended_items):
if item in relevant_items:
num_hits += 1.0
score += num_hits / (i + 1.0)
return score / len(relevant_items)

def mean_average_precision(recommended_items_list, relevant_items_list):
return np.mean([average_precision(r, t) for r, t in zip(recommended_items_list, relevant_items_list)])

recommended_items_list = [[1, 2, 3, 4, 5], [2, 3, 4, 5, 6]]
relevant_items_list = [[3, 4, 5, 6, 7], [1, 2, 3, 4, 5]]

print(f'MAP: {mean_average_precision(recommended_items_list, relevant_items_list)}')


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1🤔1💊1
🤔 В чем различия между методами apply и applymap?

В pandas `apply` используется для применения функции вдоль оси DataFrame (по строкам или столбцам), в то время как `applymap` применяется к каждому элементу DataFrame индивидуально.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2👍1
🤔 Какие методы обнаружения аномалии?

Методы обнаружения аномалий включают статистический анализ, машинное обучение и методы на основе правил. Статистические методы используют отклонения от нормальных распределений, машинное обучение опирается на кластеризацию или нейронные сети, а методы на основе правил выявляют отклонения от заданных шаблонов. Выбор подхода зависит от сложности данных и целей анализа.

🚩Методы

🟠Статистические методы
Z-оценка (Z-score): Измеряет количество стандартных отклонений от среднего. Применимо для данных с нормальным распределением.Метод межквартильного размаха (IQR): Использует квартильные размахи для определения выбросов.

🟠Машинное обучение
Методы без учителя
K-Means: Кластеризует данные, выделяя аномалии на основе удаленности от центроидов. DBSCAN: Определяет аномалии на основе плотности данных. One-Class SVM: Обучается на одном классе данных, выделяя аномалии. Isolation Forest: Быстро изолирует аномальные точки с помощью случайных деревьев.
from sklearn.ensemble import IsolationForest

X_train = ...
clf = IsolationForest(contamination=0.1)
clf.fit(X_train)
y_pred = clf.predict(X_train)


🟠Методы с учителем
Используются при наличии размеченных данных (логистическая регрессия, решающие деревья и т.д.).

🟠Методы на основе временных рядов
Методы скользящего окна (Moving Average)
Выявляют аномалии путем анализа средних значений за периоды.
Методы автокорреляции
Анализируют повторяющиеся шаблоны во временных рядах.

🟠Глубокое обучение
Нейронные сети, кодирующие данные в низкоразмерное пространство и декодирующие их обратно. Высокие ошибки восстановления указывают на аномалии.
from keras.models import Model, Sequential
from keras.layers import Dense, Input

input_dim = X_train.shape[1]
encoding_dim = 14

input_layer = Input(shape=(input_dim, ))
encoder = Dense(encoding_dim, activation="tanh")(input_layer)
encoder = Dense(int(encoding_dim / 2), activation="relu")(encoder)
decoder = Dense(int(encoding_dim / 2), activation="tanh")(encoder)
decoder = Dense(input_dim, activation="relu")(decoder)
autoencoder = Model(inputs=input_layer, outputs=decoder)
autoencoder.compile(optimizer="adam", loss="mean_squared_error")

autoencoder.fit(X_train, X_train, epochs=100, batch_size=32, shuffle=True, validation_split=0.1)


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Что такое пи вэлью?

P-value — это вероятность того, что наблюдаемые данные или более экстремальные данные могли бы возникнуть при условии, что нулевая гипотеза верна. В контексте статистических тестов, маленькое значение p-value указывает на то, что нулевая гипотеза может быть отвергнута в пользу альтернативной гипотезы. Обычно порог значимости устанавливается на уровне 0.05, и если p-value меньше этого порога, нулевая гипотеза отвергается. P-value не говорит о размере эффекта, а лишь о степени уверенности в полученных данных.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Какие есть агрегации мультиклассовых метрик ?

В задачах многоклассовой классификации (multi-class classification) метрики производительности можно агрегировать различными способами.

🟠Micro Average (Микро-среднее)
Агрегирует вклад всех классов, рассматривая каждый истинный или предсказанный пример как единицу. Оно вычисляется путем суммирования истинно положительных, ложно положительных и ложно отрицательных сработок для всех классов и затем использования этих сумм для вычисления метрики.
from sklearn.metrics import precision_score, recall_score, f1_score

# y_true - истинные метки классов
# y_pred - предсказанные метки классов

precision_micro = precision_score(y_true, y_pred, average='micro')
recall_micro = recall_score(y_true, y_pred, average='micro')
f1_micro = f1_score(y_true, y_pred, average='micro')

print(f"Micro Precision: {precision_micro}")
print(f"Micro Recall: {recall_micro}")
print(f"Micro F1-Score: {f1_micro}")


🟠Macro Average (Макро-среднее)
Вычисляет метрики для каждого класса отдельно, а затем усредняет их. Этот метод не учитывает дисбаланс классов, так как каждому классу придается одинаковый вес.
precision_macro = precision_score(y_true, y_pred, average='macro')
recall_macro = recall_score(y_true, y_pred, average='macro')
f1_macro = f1_score(y_true, y_pred, average='macro')

print(f"Macro Precision: {precision_macro}")
print(f"Macro Recall: {recall_macro}")
print(f"Macro F1-Score: {f1_macro}")


🟠Weighted Average (Взвешенное среднее)
Вычисляет метрики для каждого класса отдельно, но взвешивает их по числу истинных экземпляров в каждом классе. Это позволяет учитывать дисбаланс классов.
precision_weighted = precision_score(y_true, y_pred, average='weighted')
recall_weighted = recall_score(y_true, y_pred, average='weighted')
f1_weighted = f1_score(y_true, y_pred, average='weighted')

print(f"Weighted Precision: {precision_weighted}")
print(f"Weighted Recall: {recall_weighted}")
print(f"Weighted F1-Score: {f1_weighted}")


🟠Per-Class Metrics (Метрики для каждого класса)
Можно также рассчитывать метрики отдельно для каждого класса. Это полезно для анализа производительности модели по каждому классу.
import numpy as np
from sklearn.metrics import precision_recall_fscore_support

precision, recall, f1, _ = precision_recall_fscore_support(y_true, y_pred, average=None, labels=np.unique(y_true))

for i, label in enumerate(np.unique(y_true)):
print(f"Class {label}: Precision = {precision[i]}, Recall = {recall[i]}, F1-Score = {f1[i]}")


🟠Confusion Matrix (Матрица ошибок)
Для многоклассовой классификации представляет собой квадратную матрицу, где строки соответствуют истинным классам, а столбцы — предсказанным классам.
from sklearn.metrics import confusion_matrix

conf_matrix = confusion_matrix(y_true, y_pred)
print("Confusion Matrix:")
print(conf_matrix)


🟠Overall Accuracy (Общая точность)
Вычисляется как доля правильных предсказаний среди всех предсказаний.
from sklearn.metrics import accuracy_score

accuracy = accuracy_score(y_true, y_pred)
print(f"Overall Accuracy: {accuracy}")


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Какими должны быть распределения для t-теста?

Для стандартного t-теста данные должны быть:
1. Нормально распределёнными.
2. Иметь одинаковую дисперсию между группами.
Если эти условия не выполняются, используют его модификации или непараметрические тесты.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Как представить модель лтв для бизнеса?

Представление модели пожизненной ценности клиента (LTV) для бизнеса требует чёткого понимания целей бизнеса, практической значимости модели и способности переводить технические детали в понятные и полезные бизнес-инсайты.

🟠Определите цель модели LTV
Начните с объяснения, для чего была разработана модель LTV и какие бизнес-процессы она может улучшить. Это может быть повышение ROI маркетинговых кампаний, оптимизация взаимодействия с клиентами, повышение удержания клиентов или более эффективное распределение ресурсов.

🟠Подробно о методологии
Опишите, какие данные были использованы для обучения модели, какие методы машинного обучения применялись, и как производилась валидация результатов. Объясните выбор определённых переменных и их влияние на прогнозы LTV.

🟠Демонстрация результатов
Используйте визуализации для демонстрации работы модели. Графики, такие как ROC-кривые, диаграммы распределения LTV или сравнения реальных и предсказанных значений LTV, могут помочь наглядно представить эффективность модели. Также покажите, как модель справляется с различными сегментами клиентов.

🟠Бизнес-влияние
Объясните, как использование модели LTV может привести к конкретным бизнес-преимуществам. Приведите примеры улучшений: например, на сколько увеличилась рентабельность за счёт оптимизации маркетинговых затрат или как повысилась общая прибыль за счет более точного прогнозирования поведения клиентов.

🟠Предложения по реализации
Опишите, как модель можно интегрировать в текущие бизнес-процессы. Предложите конкретные шаги для внедрения модели, включая необходимые изменения в IT-инфраструктуре, процессы обработки данных и требования к персоналу.

🟠Рассмотрение ограничений и рисков
Не упустите возможность обсудить потенциальные ограничения модели и возможные риски, связанные с её использованием. Это может включать данные, которые могут стать устаревшими, потенциальное переобучение модели или вопросы, связанные с конфиденциальностью данных.

🟠План постоянного обновления и обслуживания
Модели машинного обучения требуют регулярного обновления для поддержания актуальности. Опишите процесс регулярного пересмотра и обновления модели, включая сбор новых данных, повторную оценку модели и адаптацию к изменяющимся рыночным условиям.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊1
🤔 Как делается прунинг деревьев?

1. Pre-pruning: остановка роста дерева по заранее заданным критериям (глубина, минимальный размер листа).
2. Post-pruning: удаление "слабых" ветвей после построения дерева для улучшения обобщения.
3. Метрики, такие как ошибка на валидационной выборке, помогают оценить, какие ветви обрезать.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔Зачем нужен yield вместо return в функции?

Ключевое слово yield используется для создания генератора, который является разновидностью итератора. В отличие от обычных функций, которые возвращают значения с помощью return и завершают своё выполнение, функции с yield возвращают генератор, который при каждом вызове продолжает выполнение функции с того места, где было сделано последнее yield.

🚩Плюсы

Экономия памяти
Генераторы вычисляют значения по требованию (lazy evaluation), что позволяет им обрабатывать даже очень большие последовательности данных, не загружая всю последовательность в память. Это особенно полезно для обработки больших файлов или потоков данных.

Удобство в управлении состоянием
Функции с yield удобны, когда нужно управлять сложным состоянием внутри функции. Функция может "замораживать" своё состояние между вызовами и продолжать выполнение с того места, где она остановилась.

Составление итераторов
Создание итератора с помощью yield значительно упрощается по сравнению с классами итераторов, которые требуют определения методов __iter__() и __next__().

def fibonacci(n):
a, b = 0, 1
for _ in range(n):
yield a
a, b = b, a + b

# Создание генератора для первых 10 чисел Фибоначчи
fib_gen = fibonacci(10)

# Итерация по генератору
for num in fib_gen:
print(num)


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1
🤔 В чем разница между метрикой качества и функцией потери при обучении?

Метрика качества оценивает, насколько хорошо модель работает, сравнивая её предсказания с реальными данными (например, Accuracy, Precision, ROC AUC). Функция потери измеряет ошибку модели и используется во время обучения для минимизации этой ошибки (например, MSE, Cross-Entropy). Метрика качества часто применяется на тестовых данных, а функция потери — на этапе оптимизации модели

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Опиши дизайн эксперимента проверки работы рекомендательной модели при условии деления пользователей по геопозиции?

Дизайн эксперимента для проверки работы рекомендательной системы с разделением пользователей по геопозиции может включать несколько ключевых этапов, в том числе подготовку данных, разделение пользователей, разработку и оценку рекомендательной модели.

🟠Определение целей эксперимента
Перед началом эксперимента необходимо четко определить, что именно вы хотите изучить или доказать. Например, вы можете проверить, улучшится ли качество рекомендаций при использовании географических данных.

🟠Сбор и подготовка данных
Для проведения эксперимента необходимо собрать достаточное количество данных о пользователях, включая их географическое положение и историю взаимодействий с продуктом. Данные должны быть предварительно обработаны для удаления ошибок и пропусков.

🟠Разделение пользователей
Пользователи делятся на группы согласно их геопозиции. Например, можно разделить их на регионы: Север, Юг, Запад, Восток. Важно, чтобы в каждой группе было достаточно пользователей для статистической значимости результатов.

🟠Разработка модели
Разрабатывается рекомендательная модель, которая может использовать географическую информацию для улучшения качества рекомендаций. Например, модель может предпочитать рекомендовать продукты или услуги, популярные в том же географическом регионе.

🟠Экспериментальное тестирование
Разработанная модель тестируется на разных группах пользователей. Можно провести A/B-тестирование, где одной группе показываются рекомендации без учета геопозиции, а другой — с учетом. Также можно сравнить работу модели на разных географических группах.

🟠Анализ результатов
Результаты эксперимента анализируются на предмет различий в эффективности рекомендаций. Особое внимание уделяется метрикам, таким как точность, полнота, и другие релевантные показатели качества рекомендаций.

🟠Выводы
На основе анализа данных делаются выводы о том, насколько эффективно использование геопозиции улучшает качество рекомендаций.

# Пример кода для разделения пользователей по геопозиции и подготовки данных
import pandas as pd

# Загрузка данных
data = pd.read_csv('user_data.csv')

# Предполагаем, что у нас есть колонки 'user_id', 'region' и 'interaction'
# Разделение данных по регионам
groups = data.groupby('region')

# Пример создания модели и оценки для каждой группы
for region, group_data in groups:
train, test = train_test_split(group_data, test_size=0.2)
model = train_model(train)
results = evaluate_model(model, test)
print(f"Результаты для региона {region}: {results}")


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Какие переменные (типы данных) можно использовать в качестве ключей?

Хэшируемые типы данных, такие как числа, строки, кортежи с неизменяемыми элементами. Это важно, если требуется быстро сопоставить значения в структуре данных.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Какой базовый алгоритм чаще всего используется?

В машинном обучении часто используются различные базовые алгоритмы в зависимости от типа задачи и характеристик данных. Однако, некоторые алгоритмы являются особенно популярными и универсальными.

🟠Линейная регрессия (Linear Regression)
Линейная регрессия используется для задач регрессии, где цель – предсказать непрерывную переменную на основе одной или нескольких независимых переменных. Простота, интерпретируемость и эффективное обучение на больших объемах данных.
from sklearn.linear_model import LinearRegression

# Пример использования линейной регрессии
model = LinearRegression()
model.fit(X_train, y_train)
predictions = model.predict(X_test)


🟠Логистическая регрессия (Logistic Regression)
Логистическая регрессия используется для задач бинарной классификации. Она оценивает вероятность принадлежности наблюдения к одному из двух классов. Простота, интерпретируемость и эффективность для линейно разделимых классов.
from sklearn.linear_model import LogisticRegression

# Пример использования логистической регрессии
model = LogisticRegression()
model.fit(X_train, y_train)
predictions = model.predict(X_test)


🟠K-ближайших соседей (K-Nearest Neighbors, KNN)
KNN используется как для классификации, так и для регрессии. Алгоритм находит K ближайших обучающих примеров в пространстве признаков и предсказывает класс (или значение) на основе большинства (или среднего) этих соседей. Простота и отсутствие необходимости в явной фазе обучения.
from sklearn.neighbors import KNeighborsClassifier

# Пример использования K-ближайших соседей
model = KNeighborsClassifier(n_neighbors=5)
model.fit(X_train, y_train)
predictions = model.predict(X_test)


🟠Решающие деревья (Decision Trees)
Решающие деревья используются как для классификации, так и для регрессии. Дерево строится путем разбиения данных на подмножества на основе значений признаков. Интерпретируемость, способность работать с категориальными и числовыми данными, и выявление важности признаков.
from sklearn.tree import DecisionTreeClassifier

# Пример использования решающего дерева
model = DecisionTreeClassifier()
model.fit(X_train, y_train)
predictions = model.predict(X_test)


🟠Случайный лес (Random Forest)
Случайный лес состоит из множества решающих деревьев, обученных на различных подвыборках данных. Итоговое предсказание получается путем усреднения предсказаний отдельных деревьев. Высокая точность, устойчивость к переобучению и возможность обработки больших объемов данных.
from sklearn.ensemble import RandomForestClassifier

# Пример использования случайного леса
model = RandomForestClassifier(n_estimators=100)
model.fit(X_train, y_train)
predictions = model.predict(X_test)


🟠Градиентный бустинг (Gradient Boosting)
Градиентный бустинг создает ансамбль слабых моделей (обычно деревьев), обучаясь последовательно, чтобы уменьшить ошибку предыдущих моделей. Высокая точность, особенно для сложных задач с большими объемами данных.
from sklearn.ensemble import GradientBoostingClassifier

# Пример использования градиентного бустинга
model = GradientBoostingClassifier()
model.fit(X_train, y_train)
predictions = model.predict(X_test)


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что такое градиентное затухание?

Градиентное затухание (vanishing gradients) — это проблема, когда в глубоких нейросетях градиенты становятся очень малыми при обратном распространении.
Это мешает обновлению весов в начальных слоях, и обучение "замирает".
Чаще всего возникает в RNN и в сетях с плохой инициализацией или неподходящей функцией активации.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Как валидировать временные ряды ?

Валидация временных рядов требует специальных подходов, которые учитывают временную структуру данных. Обычные методы кросс-валидации не подходят, так как они разрывают временную последовательность.

🟠Train/Test Split
Простейший метод заключается в разделении данных на две части: обучающую и тестовую выборки. При этом важно, чтобы тестовая выборка содержала данные, которые следуют за данными из обучающей выборки.
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split

# Пример данных временного ряда
data = pd.Series(np.arange(100))

# Процент данных для тестовой выборки
test_size = 0.2
split_index = int(len(data) * (1 - test_size))

# Разделение данных
train_data = data[:split_index]
test_data = data[split_index:]

print("Обучающая выборка:", train_data)
print("Тестовая выборка:", test_data)


🟠Time Series Cross-Validation
Кросс-валидация для временных рядов (Time Series Cross-Validation) выполняется путем последовательного использования разных временных интервалов для обучения и тестирования. Два основных подхода включают rolling cross-validation и expanding window validation.

🟠Walk-Forward Validation
Похожа на expanding window validation, но отличается тем, что каждая новая модель обучается на данных, включающих предыдущие обучающие данные, и делает одно предсказание на каждом шаге.
import numpy as np
import pandas as pd

# Пример данных временного ряда
data = pd.Series(np.arange(100))

# Размер начального окна и шаг
initial_window = 20

# Walk-forward validation
for i in range(initial_window, len(data)):
train_data = data[:i]
test_data = data[i:i+1]
print("Обучающая выборка:", train_data)
print("Тестовая выборка:", test_data)


🟠Использование методов скользящего окна
Этот метод включает в себя создание фиксированного окна данных, которое движется по временной оси. Модель обучается на данных внутри окна и тестируется на следующем наборе данных. При валидации моделей для временных рядов следует учитывать временную структуру данных.
import numpy as np
import pandas as pd

# Пример данных временного ряда
data = pd.Series(np.arange(100))

# Размер окна и шаг
window_size = 20
step_size = 5

# Sliding window validation
for start in range(0, len(data) - window_size, step_size):
train_data = data[start:start+window_size]
test_data = data[start+window_size:start+window_size+step_size]
print("Обучающая выборка:", train_data)
print("Тестовая выборка:", test_data)


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что известно о Gradient-boosted trees?

Это ансамблевый метод, строящий модель как последовательность слабых моделей (обычно деревьев), где каждая новая модель корректирует ошибки предыдущей. Он использует градиентный спуск по функции потерь. Обладает высокой точностью и хорошо работает с табличными данными, но чувствителен к гиперпараметрам. Популярные реализации — XGBoost, LightGBM, CatBoost.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM