Что такое тепловая карта?

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

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

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

Загрузка набора данных о диабете

Мы будем использовать набор данных о диабете из sklearn для нашего кода.

from sklearn import datasets
import pandas as pd

#Load dataset
data = datasets.load_diabetes()

#Converting data into dataframe
df = pd.DataFrame(data.data,columns=data.feature_names)
df['target']= data.target

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

Для лучшего понимания мы будем переименовывать столбцы

# Use data['DESCR'] for better understanding of dataset

df=df.rename(columns={'s1':'tc', 's2':'ldl', 's3':'hdl', 's4':'tch', 
                       's5':'ltg', 's6':'glu'})
  • tc -> общий холестерин сыворотки
  • ldl -› липопротеины низкой плотности
  • hdl – липопротеины высокой плотности
  • tch -› общий холестерин/ЛПВП
  • ltg – возможно, логарифмический уровень триглицеридов в сыворотке
  • glu – уровень сахара в крови

Тепловая карта

import matplotlib.pylab as plt
import seaborn as sns

corrmat = df.corr()
plt.figure(figsize=(10,10))

hm = sns.heatmap(corrmat, 
                 cbar=True, 
                 annot=True, 
                 square=True, 
                 fmt='.2f', 
                 annot_kws={'size': 10}, 
                 yticklabels=df.columns, 
                 xticklabels=df.columns, 
                 cmap="Spectral_r",
                linewidths=.5)
plt.show()

Построение модели

Мы будем использовать линейную регрессию.

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

def predict_model_acc(df, cols, target='target', state=0):
    X_train, X_test, y_train, y_test = train_test_split(df[cols], df[target], 
                                        test_size=0.20, random_state=state)
    model = LinearRegression()
    model.fit(X_train, y_train)
    return model.score(X_test, y_test)

Берем все столбцы для построения модели

columns = df.drop(columns=['target']).columns
predict_model_acc(df, columns)

# Output: 0.33222203269065154

Поиск столбцов с самой высокой и самой низкой корреляцией с «целью».

# We have used .abs() for getting -ve and +ve correlation 
related = df.corr().abs()

most=list(related['target'].sort_values(ascending=False).index[1:6])
least = list(related['target'].sort_values().index[1:6])

print('Columns having highest correlation to target: ', most)
print('Columns having lowest correlation to target: ', least)

# Columns having highest correlation to target:  ['bmi', 'ltg', 'bp', 'tch', 'hdl']
# Columns having lowest correlation to target:  ['ldl', 'age', 'tc', 'glu', 'hdl']

Прогнозирование наиболее коррелированных и наименее коррелированных атрибутов.

print("Most co-related: ", predict_model_acc(df, most))
print("Least co-related: ", predict_model_acc(df, least))

# Output:
# Most co-related:  0.32072173268887205
# Least co-related:  0.19727081785603096

Из приведенного выше прогноза ясно видно, что атрибуты, имеющие более высокую корреляцию с «целью», дают лучшую точность, чем атрибут с наименьшей корреляцией.

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

Тестирование нашей модели для 100 значений "случайного состояния"

c = 0
for i in range(100):
    most_acc = predict_model_acc(df, most, 'target', state= i)
    least_acc = predict_model_acc(df, least, 'target', state= i)
    
    if(most_acc< least_acc):
        print("Most co-related: ", most_acc)
        print("Least co-related: ", least_acc)
        print()
        c+=1

print("No. of Occurrences of lower correlated columns having higher accuracy.: ",c)

Мы можем ясно заметить, что даже после получения 100 различных значений «случайного состояния» возникает только один такой случай, когда наименее коррелированные атрибуты превосходят наиболее коррелированные.

Заключение

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

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