tgoop.com/asisakov_channel/528
Create:
Last Update:
Last Update:
Отбор признаков с применением корреляции
Если вы помните, то в одном из постов я описывал проверки на корреляцию как один из способов отбора признаков. Также вспомним, что например коэффициент корреляции Пирсона принимает значения от -1 до 1:
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ок предложить нам код для реализации удаления одного из пары сильно скоррелированных признаков. При этом оставим тот, который наиболее скоррелирован с таргетом.
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