TGViewer
asisakov asisakov @asisakov_channel · 4.08K subscribers
Post #528 671
Отбор признаков с применением корреляции

Если вы помните, то в одном из постов я описывал проверки на корреляцию как один из способов отбора признаков. Также вспомним, что например коэффициент корреляции Пирсона принимает значения от -1 до 1:

🔵Значение, близкое к 1, означает сильную положительную корреляцию
🔵Значение, близкое к -1, означает сильную отрицательную корреляцию
🔵Значение, близкое к 0, означает отсутствие линейной корреляции.

import pandas as pd

df = pd.read_csv('data.csv')

corr_matrix = df.corr()
corr_with_target = corr_matrix['target'].drop('target')

print(corr_with_target.sort_values(ascending=False))


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

Допустим, мы тут сократили количество признаков с 300 до 40 (не забыв предварительно взять абсолюты!). Надо ли копнуть еще глубже?

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

import seaborn as sns
import matplotlib.pyplot as plt

corr_matrix = df.corr()

plt.figure(figsize=(10,8))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', linewidths=.5)
plt.title('Correlation Matrix Heatmap')
plt.show()


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

1️⃣Вычисляем корреляционную матрицу для всех признаков.
2️⃣Определяем пары признаков с высокой корреляцией (например, выше 0.8).
3️⃣Для каждой пары оставляем признак с большей корреляцией с таргетом.
4️⃣Удаляем из набора данных наименее значимые признаки.

import pandas as pd

df = pd.read_csv('data.csv')

threshold = 0.8

corr_matrix = df.corr().abs()

target = 'Target'
to_drop = set()

for i in range(len(corr_matrix.columns)):
for j in range(i):
if corr_matrix.iloc[i, j] > threshold:
col1 = corr_matrix.columns[i]
col2 = corr_matrix.columns[j]
if corr_matrix[col1][target] > corr_matrix[col2][target]:
to_drop.add(col2)
else:
to_drop.add(col1)

df_reduced = df.drop(columns=to_drop)


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

Подробнее: тут, тут, и тут

@asisakov_channel

#ml #code
Telegram asisakov Как из 6000 признаков выбрать 10 наиболее нужных для модели? Допустим, мы нагенерили много признаков с использованием техник, описанных в посте выше. Что делать дальше? Неужели нам потом надо тянуть в модель их все и собирать для них отдельные витрины? С…
  • 🔥 12
  • 👍 6
  • ❤ 5
More from @asisakov_channel
  1. Sep 24, 2026Post #1428
  2. Sep 24, 2026Оказывается недавно вышел Opus 5.5, который типа догоняет Fable 5.1, и при этом дешевле на…
  3. Sep 23, 2026Таки вы не Исаков, а Исааков 😏 Шекели жалко
  4. Sep 23, 2026Недавно во второй раз забанили в Клоде, было очень обидно за свою $20 подписку 😭 P.S. При…
  5. Sep 23, 2026Post #1424
  6. Sep 22, 2026Дайте мне повод сжечь токены, и я сделаю это! #meme
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →