Вопрос или проблема
Учитывая следующий датафрейм
age job salary
0 1 Doctor 100
1 2 Engineer 200
2 3 Lawyer 300
...
с age
как числовым, job
как категориальным, я хочу протестировать корреляцию со зарплатой, с целью выбора признаков (возраст и/или работа) для предсказания зарплаты (регрессионная задача). Могу ли я использовать следующий API из sklearn (или другой API)
sklearn.feature_selection.f_regression
sklearn.feature_selection.mutual_info_regression
для этого тестирования? Если да, то какой правильный метод и синтаксис для проверки корреляции?
Следующий код набора данных
df=pd.DataFrame({"age":[1,2,3],"job":["Doctor","Engineer","Lawyer"],"salary":[100,200,300]})
Вы можете использовать mutual_info_regression
как для непрерывных, так и для дискретных признаков. Но сначала закодируйте вашу job
вручную или с использованием LabelEncoder
. Затем получите оценку MI, указав индекс job
(здесь, $1$):
X, y = df.drop(columns="salary"), df['salary']
X['job'] = # закодируйте этот признак
mutual_info_regression(X, y, discrete_features=[1])
Ответ или решение
Чтобы определить корреляцию между признаками (в данном случае возраст и работа) и целевой переменной (зарплатой) в задаче регрессии, можно использовать функции из модуля sklearn
– mutual_info_regression
и f_regression
. Однако важно учитывать, что работа (job
) является категориальным признаком, который нужно сначала преобразовать в числовой формат.
Пошаговое руководство
-
Предобработка данных:
- Прежде всего, необходимо закодировать категориальный признак «работа». Для этого можно воспользоваться
LabelEncoder
из библиотекиsklearn
. Это преобразует категориальные данные в числовые, что позволит корректно использовать методmutual_info_regression
.
- Прежде всего, необходимо закодировать категориальный признак «работа». Для этого можно воспользоваться
-
Регрессионные методы:
- Используем
mutual_info_regression
, так как он подходит как для дискретных, так и для непрерывных переменных. - Метод
f_regression
можно также использовать, но он больше ориентирован на линейную зависимость, в то время какmutual_info_regression
позволяет выявлять и нелинейные связи.
- Используем
Пример кода
import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.feature_selection import mutual_info_regression
# Создание DataFrame
df = pd.DataFrame({
"age": [1, 2, 3],
"job": ["Doctor", "Engineer", "Lawyer"],
"salary": [100, 200, 300]
})
# Предобработка данных - кодирование категориального признака
le = LabelEncoder()
df['job'] = le.fit_transform(df['job'])
# Разделение данных на признаки и целевую переменную
X = df.drop(columns="salary")
y = df['salary']
# Расчет взаимной информации
mi_scores = mutual_info_regression(X, y, discrete_features=[1]) # 1 - это индекс колонки 'job'
print("Scores of Mutual Information:", mi_scores)
Пояснения:
LabelEncoder
преобразует категориальный признак в числовой формат. Это важно, так как модели машинного обучения не могут обрабатывать строковые данные напрямую.mutual_info_regression
позволяет оценить взаимную информацию между признаками и целевой переменной. В данном случае, мы явно указываем, чтоjob
— это дискретный признак, передаваяdiscrete_features=[1]
, где 1 — это индекс столбца с работой.
Заключение
Методы mutual_info_regression
и f_regression
предоставляют полезные инструменты для оценки корреляции между признаками и целевой переменной в задачах регрессии. Однако mutual_info_regression
более универсален, так как может обрабатывать как непрерывные, так и дискретные переменные. Следуя приведенным шагам, вы сможете эффективно определить значимость каждого из признаков для предсказания зарплаты.