AIM-PIbd-32-Kaznacheeva-E-K/lab_3/Lab3.ipynb

402 KiB
Raw Permalink Blame History

Вариант задания: Заработная плата рабочих мест в области Data Science (вариант - 8)

Бизнес-цели для датасета о заработной плате в Data Science: Оптимизация стратегии найма и оплаты труда в Data Science

Формулировка: Разработать модель, которая позволяет точно прогнозировать и оптимизировать заработную плату для специалистов в области Data Science на основе их опыта, типа занятости, местоположения и других факторов.

Цель: Увеличить привлекательность компании для талантливых специалистов в Data Science, обеспечивая конкурентоспособные зарплаты, а также оптимизировать расходы на персонал, избегая переплат и недоплат.

Ключевые показатели успеха (KPI):

Точность модели прогнозирования зарплаты (RMSE): Минимизация среднеквадратичной ошибки до уровня ниже 10% от реальной зарплаты, чтобы учитывать большие отклонения в оценке.

Средняя абсолютная ошибка (MAE): Модель должна предсказать зарплату с минимальной ошибкой и снизить MAE до 5% или меньше, учитывая большие отклонения в оценке.

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

Доступность: Внедрение модели в систему управления персоналом для использования HR-специалистами.

Оптимизация распределения ресурсов в компании

Формулировка: Разработать модель, которая поможет компаниям определить оптимальное распределение ресурсов (бюджета) на Data Science проекты и команды, учитывая уровень зарплат, опыт и другие факторы.

Цель: Снизить затраты на Data Science проекты, оптимизировать распределение бюджета, обеспечивая максимальную эффективность и результативность проектов.

Ключевые показатели успеха (KPI):

Возврат инвестиций (ROI): Проекты должны показывать не менее 20% прироста в результатах (например, увеличение прибыли, улучшение показателей) на каждый вложенный доллар в Data Science.

Средняя стоимость проекта на 1 сотрудника (CPA): Задача снизить расходы на проекты, минимизировав ненужные траты. Например, оптимизация затрат до $50,000 на проект с учетом максимального прироста в результатах.

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

Оптимизация стратегии развития карьеры в Data Science

Формулировка: Разработать модель, которая поможет специалистам в Data Science определить оптимальные пути развития карьеры, учитывая текущий уровень зарплаты, опыт и перспективы роста.

Цель: Повысить удовлетворенность и мотивацию специалистов в Data Science, обеспечивая им четкие пути развития карьеры и возможность получения конкурентоспособных зарплат.

Ключевые показатели успеха (KPI):

Уровень удовлетворенности сотрудников: Увеличение уровня удовлетворенности сотрудников на 15% за счет предоставления четких путей развития карьеры и возможностей для роста.

Средний срок пребывания в компании: Увеличение среднего срока пребывания сотрудников в компании на 20% за счет предоставления привлекательных перспектив развития.

Доступность: Внедрение модели в систему управления карьерой для использования сотрудниками и HR-специалистами.

Технические цели проекта для каждой выделенной бизнес-цели

Оптимизация стратегии найма и оплаты труда в Data Science

Сбор и подготовка данных:

Сбор данных: Получение данных о заработных платах специалистов в Data Science из различных источников (например, Glassdoor, LinkedIn, Kaggle).

Очистка данных: Удаление пропусков, выбросов и дубликатов. Преобразование категориальных переменных (например, experience_level, employment_type, employee_residence, company_location) в числовую форму с использованием One-Hot Encoding.

Нормализация и стандартизация: Применение методов масштабирования данных (нормировка, стандартизация) для числовых признаков (например, salary_in_usd, remote_ratio).

Разбиение данных: Разделение набора данных на обучающую, контрольную и тестовую выборки для предотвращения утечек данных и переобучения.

Разработка и обучение модели:

Исследование моделей: Эксперименты с различными алгоритмами (линейная регрессия, случайный лес, градиентный бустинг, деревья решений) для предсказания заработной платы.

Обучение модели: Обучение модели на обучающей выборке с использованием метрик оценки качества, таких как RMSE (Root Mean Square Error) и MAE (Mean Absolute Error).

Оценка качества: Оценка качества моделей на тестовой выборке, минимизируя MAE и RMSE для получения точных прогнозов заработной платы.

Развёртывание модели:

Интеграция модели: Интеграция модели в существующую систему управления персоналом или разработка API для доступа к модели.

Создание интерфейса: Создание веб-приложения или мобильного интерфейса для удобного использования модели и получения прогнозов в режиме реального времени.

Оптимизация распределения ресурсов в компании

Сбор и подготовка данных:

Сбор данных: Получение данных о затратах на Data Science проекты, результатах проектов, уровнях зарплат сотрудников и других релевантных факторов.

Очистка данных: Удаление пропусков, выбросов и дубликатов. Преобразование категориальных переменных в числовую форму с использованием One-Hot Encoding.

Нормализация и стандартизация: Применение методов масштабирования данных для числовых признаков.

Разбиение данных: Разделение набора данных на обучающую, контрольную и тестовую выборки.

Разработка и обучение модели:

Исследование моделей: Эксперименты с различными алгоритмами (линейная регрессия, случайный лес, градиентный бустинг) для предсказания оптимального распределения ресурсов.

Обучение модели: Обучение модели на обучающей выборке с использованием метрик оценки качества, таких как ROI (Return on Investment) и CPA (Cost Per Acquisition).

Оценка качества: Оценка качества моделей на тестовой выборке, минимизируя CPA и максимизируя ROI.

Развёртывание модели:

Интеграция модели: Интеграция модели в систему управления проектами или разработка API для доступа к модели.

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

Оптимизация стратегии развития карьеры в Data Science

Сбор и подготовка данных:

Сбор данных: Получение данных о карьерных траекториях специалистов в Data Science, уровнях зарплат, опыте и других релевантных факторах.

Очистка данных: Удаление пропусков, выбросов и дубликатов. Преобразование категориальных переменных в числовую форму с использованием One-Hot Encoding.

Нормализация и стандартизация: Применение методов масштабирования данных для числовых признаков.

Разбиение данных: Разделение набора данных на обучающую, контрольную и тестовую выборки.

Разработка и обучение модели:

Исследование моделей: Эксперименты с различными алгоритмами (линейная регрессия, случайный лес, градиентный бустинг) для предсказания оптимальных путей развития карьеры.

Обучение модели: Обучение модели на обучающей выборке с использованием метрик оценки качества, таких как MAE (Mean Absolute Error) и RMSE (Root Mean Square Error).

Оценка качества: Оценка качества моделей на тестовой выборке, минимизируя MAE и RMSE.

Развёртывание модели:

Интеграция модели: Интеграция модели в систему управления карьерой или разработка API для доступа к модели.

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

In [2]:
import pandas as pd
df = pd.read_csv("..//static//csv//ds_salaries.csv")
print(df.columns)
Index(['work_year', 'experience_level', 'employment_type', 'job_title',
       'salary', 'salary_currency', 'salary_in_usd', 'employee_residence',
       'remote_ratio', 'company_location', 'company_size'],
      dtype='object')
In [3]:
# Для наглядности
df.head()
Out[3]:
work_year experience_level employment_type job_title salary salary_currency salary_in_usd employee_residence remote_ratio company_location company_size
0 2023 SE FT Principal Data Scientist 80000 EUR 85847 ES 100 ES L
1 2023 MI CT ML Engineer 30000 USD 30000 US 100 US S
2 2023 MI CT ML Engineer 25500 USD 25500 US 100 US S
3 2023 SE FT Data Scientist 175000 USD 175000 CA 100 CA M
4 2023 SE FT Data Scientist 120000 USD 120000 CA 100 CA M
In [4]:
# Описание данных (основные статистические показатели)
df.describe()
Out[4]:
work_year salary salary_in_usd remote_ratio
count 3755.000000 3.755000e+03 3755.000000 3755.000000
mean 2022.373635 1.906956e+05 137570.389880 46.271638
std 0.691448 6.716765e+05 63055.625278 48.589050
min 2020.000000 6.000000e+03 5132.000000 0.000000
25% 2022.000000 1.000000e+05 95000.000000 0.000000
50% 2022.000000 1.380000e+05 135000.000000 0.000000
75% 2023.000000 1.800000e+05 175000.000000 100.000000
max 2023.000000 3.040000e+07 450000.000000 100.000000
In [5]:
# Процент пропущенных значений признаков
for i in df.columns:
    null_rate = df[i].isnull().sum() / len(df) * 100
    if null_rate > 0:
        print(f'{i} Процент пустых значений: %{null_rate:.2f}')

# Проверка на пропущенные данные
print(df.isnull().sum())

df.isnull().any()
work_year             0
experience_level      0
employment_type       0
job_title             0
salary                0
salary_currency       0
salary_in_usd         0
employee_residence    0
remote_ratio          0
company_location      0
company_size          0
dtype: int64
Out[5]:
work_year             False
experience_level      False
employment_type       False
job_title             False
salary                False
salary_currency       False
salary_in_usd         False
employee_residence    False
remote_ratio          False
company_location      False
company_size          False
dtype: bool

Разбиваем на выборки (обучающую, тестовую, контрольную)

In [6]:
from sklearn.model_selection import train_test_split

# Разделение данных на обучающую и тестовую выборки (80% - обучение, 20% - тестовая)
train_data, test_data = train_test_split(df, test_size=0.2, random_state=42)

# Разделение данных на обучающую и контрольную выборки (80% - обучение, 20% - контроль)
train_data, val_data = train_test_split(df, test_size=0.2, random_state=42)

print("Размер обучающей выборки: ", len(train_data))
print("Размер контрольной выборки: ", len(val_data))
print("Размер тестовой выборки: ", len(test_data))
Размер обучающей выборки:  3004
Размер контрольной выборки:  751
Размер тестовой выборки:  751
In [7]:
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# Предположим, что у вас уже есть данные, разделенные на обучающую, контрольную и тестовую выборки
# train_data, val_data, test_data

# Визуализация распределения заработной платы в выборках (гистограмма)
def plot_salary_distribution(data, title):
    sns.histplot(data['salary_in_usd'], kde=True)
    plt.title(title)
    plt.xlabel('Заработная плата (USD)')
    plt.ylabel('Частота')
    plt.show()

plot_salary_distribution(train_data, 'Распределение заработной платы в обучающей выборке')
plot_salary_distribution(val_data, 'Распределение заработной платы в контрольной выборке')
plot_salary_distribution(test_data, 'Распределение заработной платы в тестовой выборке')

# Оценка сбалансированности данных по целевой переменной (salary_in_usd)
print("Средняя заработная плата в обучающей выборке: ", train_data['salary_in_usd'].mean())
print("Средняя заработная плата в контрольной выборке: ", val_data['salary_in_usd'].mean())
print("Средняя заработная плата в тестовой выборке: ", test_data['salary_in_usd'].mean())
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Средняя заработная плата в обучающей выборке:  138055.9893475366
Средняя заработная плата в контрольной выборке:  135627.99201065247
Средняя заработная плата в тестовой выборке:  135627.99201065247
In [10]:
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from imblearn.over_sampling import RandomOverSampler
from imblearn.under_sampling import RandomUnderSampler

# Предположим, что у вас уже есть данные, разделенные на обучающую, контрольную и тестовую выборки
# train_data, val_data, test_data

# Преобразование целевой переменной (заработная плата) в категориальные диапазоны с использованием квантилей
train_data['salary_category'] = pd.qcut(train_data['salary_in_usd'], q=4, labels=['low', 'medium', 'high', 'very_high'])

# Визуализация распределения заработной платы после преобразования в категории
sns.countplot(x=train_data['salary_category'])
plt.title('Распределение категорий заработной платы в обучающей выборке')
plt.xlabel('Категория заработной платы')
plt.ylabel('Частота')
plt.show()

# Балансировка категорий с помощью RandomOverSampler (увеличение меньшинств)
ros = RandomOverSampler(random_state=42)
X_train = train_data.drop(columns=['salary_in_usd', 'salary_category'])
y_train = train_data['salary_category']

X_resampled, y_resampled = ros.fit_resample(X_train, y_train)

# Визуализация распределения заработной платы после oversampling
sns.countplot(x=y_resampled)
plt.title('Распределение категорий заработной платы после oversampling')
plt.xlabel('Категория заработной платы')
plt.ylabel('Частота')
plt.show()

# Применение RandomUnderSampler для уменьшения большего класса
rus = RandomUnderSampler(random_state=42)
X_resampled, y_resampled = rus.fit_resample(X_resampled, y_resampled)

# Визуализация распределения заработной платы после undersampling
sns.countplot(x=y_resampled)
plt.title('Распределение категорий заработной платы после undersampling')
plt.xlabel('Категория заработной платы')
plt.ylabel('Частота')
plt.show()

# Печать размеров выборки после балансировки
print("Размер обучающей выборки после oversampling и undersampling: ", len(X_resampled))
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
Размер обучающей выборки после oversampling и undersampling:  3044

Конструирование признаков

Теперь приступим к конструированию признаков для решения каждой задачи.

Процесс конструирования признаков Задача 1: Прогнозирование заработной платы в Data Science. Цель технического проекта: Разработка модели машинного обучения для точного прогнозирования заработной платы специалистов в области Data Science. Задача 2: Оптимизация распределения ресурсов в компании. Цель технического проекта: Разработка модели машинного обучения для оптимизации распределения ресурсов на Data Science проекты.

Унитарное кодирование Унитарное кодирование категориальных признаков (one-hot encoding). Преобразование категориальных признаков в бинарные векторы.

Дискретизация числовых признаков Процесс преобразования непрерывных числовых значений в дискретные категории или интервалы (бины).

In [16]:
# Конструирование признаков
# Унитарное кодирование категориальных признаков (применение one-hot encoding)

# Пример категориальных признаков
categorical_features = ['experience_level', 'employment_type', 'employee_residence', 'company_location', 'company_size']

# Применение one-hot encoding
train_data_encoded = pd.get_dummies(train_data, columns=categorical_features)
val_data_encoded = pd.get_dummies(val_data, columns=categorical_features)
test_data_encoded = pd.get_dummies(test_data, columns=categorical_features)
df_encoded = pd.get_dummies(df, columns=categorical_features)

print("Столбцы train_data_encoded:", train_data_encoded.columns.tolist())
print("Столбцы val_data_encoded:", val_data_encoded.columns.tolist())
print("Столбцы test_data_encoded:", test_data_encoded.columns.tolist())


# Пример дискретизации признака 'salary_in_usd' на 5 категорий
train_data_encoded['salary_category'] = pd.cut(train_data_encoded['salary_in_usd'], bins=5, labels=False)
val_data_encoded['salary_category'] = pd.cut(val_data_encoded['salary_in_usd'], bins=5, labels=False)
test_data_encoded['salary_category'] = pd.cut(test_data_encoded['salary_in_usd'], bins=5, labels=False)
df_encoded['salary_category'] = pd.cut(df_encoded['salary_in_usd'], bins=5, labels=False)

print("Столбцы train_data_encoded после дискретизации:", train_data_encoded.columns.tolist())
print("Столбцы val_data_encoded после дискретизации:", val_data_encoded.columns.tolist())
print("Столбцы test_data_encoded после дискретизации:", test_data_encoded.columns.tolist())
Столбцы train_data_encoded: ['work_year', 'job_title', 'salary', 'salary_currency', 'salary_in_usd', 'remote_ratio', 'salary_category', 'experience_level_EN', 'experience_level_EX', 'experience_level_MI', 'experience_level_SE', 'employment_type_CT', 'employment_type_FL', 'employment_type_FT', 'employment_type_PT', 'employee_residence_AE', 'employee_residence_AM', 'employee_residence_AR', 'employee_residence_AT', 'employee_residence_AU', 'employee_residence_BA', 'employee_residence_BE', 'employee_residence_BG', 'employee_residence_BO', 'employee_residence_BR', 'employee_residence_CA', 'employee_residence_CF', 'employee_residence_CH', 'employee_residence_CL', 'employee_residence_CN', 'employee_residence_CO', 'employee_residence_CR', 'employee_residence_CY', 'employee_residence_CZ', 'employee_residence_DE', 'employee_residence_DK', 'employee_residence_DZ', 'employee_residence_EE', 'employee_residence_EG', 'employee_residence_ES', 'employee_residence_FI', 'employee_residence_FR', 'employee_residence_GB', 'employee_residence_GH', 'employee_residence_GR', 'employee_residence_HK', 'employee_residence_HN', 'employee_residence_HR', 'employee_residence_HU', 'employee_residence_ID', 'employee_residence_IE', 'employee_residence_IL', 'employee_residence_IN', 'employee_residence_IQ', 'employee_residence_IR', 'employee_residence_IT', 'employee_residence_JP', 'employee_residence_KE', 'employee_residence_KW', 'employee_residence_LT', 'employee_residence_LU', 'employee_residence_LV', 'employee_residence_MA', 'employee_residence_MD', 'employee_residence_MK', 'employee_residence_MX', 'employee_residence_MY', 'employee_residence_NG', 'employee_residence_NL', 'employee_residence_NZ', 'employee_residence_PH', 'employee_residence_PK', 'employee_residence_PL', 'employee_residence_PR', 'employee_residence_PT', 'employee_residence_RO', 'employee_residence_RS', 'employee_residence_RU', 'employee_residence_SE', 'employee_residence_SG', 'employee_residence_SI', 'employee_residence_SK', 'employee_residence_TH', 'employee_residence_TN', 'employee_residence_TR', 'employee_residence_UA', 'employee_residence_US', 'employee_residence_UZ', 'employee_residence_VN', 'company_location_AE', 'company_location_AL', 'company_location_AM', 'company_location_AR', 'company_location_AS', 'company_location_AT', 'company_location_AU', 'company_location_BA', 'company_location_BE', 'company_location_BO', 'company_location_BR', 'company_location_CA', 'company_location_CF', 'company_location_CH', 'company_location_CL', 'company_location_CO', 'company_location_CR', 'company_location_CZ', 'company_location_DE', 'company_location_DK', 'company_location_DZ', 'company_location_EE', 'company_location_EG', 'company_location_ES', 'company_location_FI', 'company_location_FR', 'company_location_GB', 'company_location_GH', 'company_location_GR', 'company_location_HN', 'company_location_HR', 'company_location_HU', 'company_location_ID', 'company_location_IE', 'company_location_IL', 'company_location_IN', 'company_location_IQ', 'company_location_IR', 'company_location_IT', 'company_location_JP', 'company_location_KE', 'company_location_LT', 'company_location_LU', 'company_location_LV', 'company_location_MA', 'company_location_MD', 'company_location_MK', 'company_location_MX', 'company_location_MY', 'company_location_NG', 'company_location_NL', 'company_location_NZ', 'company_location_PH', 'company_location_PK', 'company_location_PL', 'company_location_PR', 'company_location_PT', 'company_location_RO', 'company_location_RU', 'company_location_SE', 'company_location_SG', 'company_location_SI', 'company_location_SK', 'company_location_TH', 'company_location_TR', 'company_location_UA', 'company_location_US', 'company_location_VN', 'company_size_L', 'company_size_M', 'company_size_S']
Столбцы val_data_encoded: ['work_year', 'job_title', 'salary', 'salary_currency', 'salary_in_usd', 'remote_ratio', 'experience_level_EN', 'experience_level_EX', 'experience_level_MI', 'experience_level_SE', 'employment_type_FL', 'employment_type_FT', 'employment_type_PT', 'employee_residence_AE', 'employee_residence_AR', 'employee_residence_AS', 'employee_residence_AT', 'employee_residence_AU', 'employee_residence_BE', 'employee_residence_BR', 'employee_residence_CA', 'employee_residence_CF', 'employee_residence_CH', 'employee_residence_CO', 'employee_residence_DE', 'employee_residence_DO', 'employee_residence_ES', 'employee_residence_FR', 'employee_residence_GB', 'employee_residence_GH', 'employee_residence_GR', 'employee_residence_HK', 'employee_residence_HR', 'employee_residence_IE', 'employee_residence_IN', 'employee_residence_IT', 'employee_residence_JE', 'employee_residence_JP', 'employee_residence_LV', 'employee_residence_MT', 'employee_residence_MX', 'employee_residence_NG', 'employee_residence_NL', 'employee_residence_PK', 'employee_residence_PR', 'employee_residence_PT', 'employee_residence_RU', 'employee_residence_TH', 'employee_residence_TR', 'employee_residence_UA', 'employee_residence_US', 'employee_residence_UZ', 'company_location_AE', 'company_location_AS', 'company_location_AT', 'company_location_AU', 'company_location_BE', 'company_location_BS', 'company_location_CA', 'company_location_CF', 'company_location_CH', 'company_location_CN', 'company_location_CO', 'company_location_DE', 'company_location_ES', 'company_location_FI', 'company_location_FR', 'company_location_GB', 'company_location_GH', 'company_location_GR', 'company_location_HK', 'company_location_HR', 'company_location_IE', 'company_location_IN', 'company_location_JP', 'company_location_LU', 'company_location_LV', 'company_location_MT', 'company_location_MX', 'company_location_NG', 'company_location_NL', 'company_location_PK', 'company_location_PR', 'company_location_PT', 'company_location_RU', 'company_location_SG', 'company_location_TH', 'company_location_TR', 'company_location_UA', 'company_location_US', 'company_size_L', 'company_size_M', 'company_size_S']
Столбцы test_data_encoded: ['work_year', 'job_title', 'salary', 'salary_currency', 'salary_in_usd', 'remote_ratio', 'experience_level_EN', 'experience_level_EX', 'experience_level_MI', 'experience_level_SE', 'employment_type_FL', 'employment_type_FT', 'employment_type_PT', 'employee_residence_AE', 'employee_residence_AR', 'employee_residence_AS', 'employee_residence_AT', 'employee_residence_AU', 'employee_residence_BE', 'employee_residence_BR', 'employee_residence_CA', 'employee_residence_CF', 'employee_residence_CH', 'employee_residence_CO', 'employee_residence_DE', 'employee_residence_DO', 'employee_residence_ES', 'employee_residence_FR', 'employee_residence_GB', 'employee_residence_GH', 'employee_residence_GR', 'employee_residence_HK', 'employee_residence_HR', 'employee_residence_IE', 'employee_residence_IN', 'employee_residence_IT', 'employee_residence_JE', 'employee_residence_JP', 'employee_residence_LV', 'employee_residence_MT', 'employee_residence_MX', 'employee_residence_NG', 'employee_residence_NL', 'employee_residence_PK', 'employee_residence_PR', 'employee_residence_PT', 'employee_residence_RU', 'employee_residence_TH', 'employee_residence_TR', 'employee_residence_UA', 'employee_residence_US', 'employee_residence_UZ', 'company_location_AE', 'company_location_AS', 'company_location_AT', 'company_location_AU', 'company_location_BE', 'company_location_BS', 'company_location_CA', 'company_location_CF', 'company_location_CH', 'company_location_CN', 'company_location_CO', 'company_location_DE', 'company_location_ES', 'company_location_FI', 'company_location_FR', 'company_location_GB', 'company_location_GH', 'company_location_GR', 'company_location_HK', 'company_location_HR', 'company_location_IE', 'company_location_IN', 'company_location_JP', 'company_location_LU', 'company_location_LV', 'company_location_MT', 'company_location_MX', 'company_location_NG', 'company_location_NL', 'company_location_PK', 'company_location_PR', 'company_location_PT', 'company_location_RU', 'company_location_SG', 'company_location_TH', 'company_location_TR', 'company_location_UA', 'company_location_US', 'company_size_L', 'company_size_M', 'company_size_S']
Столбцы train_data_encoded после дискретизации: ['work_year', 'job_title', 'salary', 'salary_currency', 'salary_in_usd', 'remote_ratio', 'salary_category', 'experience_level_EN', 'experience_level_EX', 'experience_level_MI', 'experience_level_SE', 'employment_type_CT', 'employment_type_FL', 'employment_type_FT', 'employment_type_PT', 'employee_residence_AE', 'employee_residence_AM', 'employee_residence_AR', 'employee_residence_AT', 'employee_residence_AU', 'employee_residence_BA', 'employee_residence_BE', 'employee_residence_BG', 'employee_residence_BO', 'employee_residence_BR', 'employee_residence_CA', 'employee_residence_CF', 'employee_residence_CH', 'employee_residence_CL', 'employee_residence_CN', 'employee_residence_CO', 'employee_residence_CR', 'employee_residence_CY', 'employee_residence_CZ', 'employee_residence_DE', 'employee_residence_DK', 'employee_residence_DZ', 'employee_residence_EE', 'employee_residence_EG', 'employee_residence_ES', 'employee_residence_FI', 'employee_residence_FR', 'employee_residence_GB', 'employee_residence_GH', 'employee_residence_GR', 'employee_residence_HK', 'employee_residence_HN', 'employee_residence_HR', 'employee_residence_HU', 'employee_residence_ID', 'employee_residence_IE', 'employee_residence_IL', 'employee_residence_IN', 'employee_residence_IQ', 'employee_residence_IR', 'employee_residence_IT', 'employee_residence_JP', 'employee_residence_KE', 'employee_residence_KW', 'employee_residence_LT', 'employee_residence_LU', 'employee_residence_LV', 'employee_residence_MA', 'employee_residence_MD', 'employee_residence_MK', 'employee_residence_MX', 'employee_residence_MY', 'employee_residence_NG', 'employee_residence_NL', 'employee_residence_NZ', 'employee_residence_PH', 'employee_residence_PK', 'employee_residence_PL', 'employee_residence_PR', 'employee_residence_PT', 'employee_residence_RO', 'employee_residence_RS', 'employee_residence_RU', 'employee_residence_SE', 'employee_residence_SG', 'employee_residence_SI', 'employee_residence_SK', 'employee_residence_TH', 'employee_residence_TN', 'employee_residence_TR', 'employee_residence_UA', 'employee_residence_US', 'employee_residence_UZ', 'employee_residence_VN', 'company_location_AE', 'company_location_AL', 'company_location_AM', 'company_location_AR', 'company_location_AS', 'company_location_AT', 'company_location_AU', 'company_location_BA', 'company_location_BE', 'company_location_BO', 'company_location_BR', 'company_location_CA', 'company_location_CF', 'company_location_CH', 'company_location_CL', 'company_location_CO', 'company_location_CR', 'company_location_CZ', 'company_location_DE', 'company_location_DK', 'company_location_DZ', 'company_location_EE', 'company_location_EG', 'company_location_ES', 'company_location_FI', 'company_location_FR', 'company_location_GB', 'company_location_GH', 'company_location_GR', 'company_location_HN', 'company_location_HR', 'company_location_HU', 'company_location_ID', 'company_location_IE', 'company_location_IL', 'company_location_IN', 'company_location_IQ', 'company_location_IR', 'company_location_IT', 'company_location_JP', 'company_location_KE', 'company_location_LT', 'company_location_LU', 'company_location_LV', 'company_location_MA', 'company_location_MD', 'company_location_MK', 'company_location_MX', 'company_location_MY', 'company_location_NG', 'company_location_NL', 'company_location_NZ', 'company_location_PH', 'company_location_PK', 'company_location_PL', 'company_location_PR', 'company_location_PT', 'company_location_RO', 'company_location_RU', 'company_location_SE', 'company_location_SG', 'company_location_SI', 'company_location_SK', 'company_location_TH', 'company_location_TR', 'company_location_UA', 'company_location_US', 'company_location_VN', 'company_size_L', 'company_size_M', 'company_size_S']
Столбцы val_data_encoded после дискретизации: ['work_year', 'job_title', 'salary', 'salary_currency', 'salary_in_usd', 'remote_ratio', 'experience_level_EN', 'experience_level_EX', 'experience_level_MI', 'experience_level_SE', 'employment_type_FL', 'employment_type_FT', 'employment_type_PT', 'employee_residence_AE', 'employee_residence_AR', 'employee_residence_AS', 'employee_residence_AT', 'employee_residence_AU', 'employee_residence_BE', 'employee_residence_BR', 'employee_residence_CA', 'employee_residence_CF', 'employee_residence_CH', 'employee_residence_CO', 'employee_residence_DE', 'employee_residence_DO', 'employee_residence_ES', 'employee_residence_FR', 'employee_residence_GB', 'employee_residence_GH', 'employee_residence_GR', 'employee_residence_HK', 'employee_residence_HR', 'employee_residence_IE', 'employee_residence_IN', 'employee_residence_IT', 'employee_residence_JE', 'employee_residence_JP', 'employee_residence_LV', 'employee_residence_MT', 'employee_residence_MX', 'employee_residence_NG', 'employee_residence_NL', 'employee_residence_PK', 'employee_residence_PR', 'employee_residence_PT', 'employee_residence_RU', 'employee_residence_TH', 'employee_residence_TR', 'employee_residence_UA', 'employee_residence_US', 'employee_residence_UZ', 'company_location_AE', 'company_location_AS', 'company_location_AT', 'company_location_AU', 'company_location_BE', 'company_location_BS', 'company_location_CA', 'company_location_CF', 'company_location_CH', 'company_location_CN', 'company_location_CO', 'company_location_DE', 'company_location_ES', 'company_location_FI', 'company_location_FR', 'company_location_GB', 'company_location_GH', 'company_location_GR', 'company_location_HK', 'company_location_HR', 'company_location_IE', 'company_location_IN', 'company_location_JP', 'company_location_LU', 'company_location_LV', 'company_location_MT', 'company_location_MX', 'company_location_NG', 'company_location_NL', 'company_location_PK', 'company_location_PR', 'company_location_PT', 'company_location_RU', 'company_location_SG', 'company_location_TH', 'company_location_TR', 'company_location_UA', 'company_location_US', 'company_size_L', 'company_size_M', 'company_size_S', 'salary_category']
Столбцы test_data_encoded после дискретизации: ['work_year', 'job_title', 'salary', 'salary_currency', 'salary_in_usd', 'remote_ratio', 'experience_level_EN', 'experience_level_EX', 'experience_level_MI', 'experience_level_SE', 'employment_type_FL', 'employment_type_FT', 'employment_type_PT', 'employee_residence_AE', 'employee_residence_AR', 'employee_residence_AS', 'employee_residence_AT', 'employee_residence_AU', 'employee_residence_BE', 'employee_residence_BR', 'employee_residence_CA', 'employee_residence_CF', 'employee_residence_CH', 'employee_residence_CO', 'employee_residence_DE', 'employee_residence_DO', 'employee_residence_ES', 'employee_residence_FR', 'employee_residence_GB', 'employee_residence_GH', 'employee_residence_GR', 'employee_residence_HK', 'employee_residence_HR', 'employee_residence_IE', 'employee_residence_IN', 'employee_residence_IT', 'employee_residence_JE', 'employee_residence_JP', 'employee_residence_LV', 'employee_residence_MT', 'employee_residence_MX', 'employee_residence_NG', 'employee_residence_NL', 'employee_residence_PK', 'employee_residence_PR', 'employee_residence_PT', 'employee_residence_RU', 'employee_residence_TH', 'employee_residence_TR', 'employee_residence_UA', 'employee_residence_US', 'employee_residence_UZ', 'company_location_AE', 'company_location_AS', 'company_location_AT', 'company_location_AU', 'company_location_BE', 'company_location_BS', 'company_location_CA', 'company_location_CF', 'company_location_CH', 'company_location_CN', 'company_location_CO', 'company_location_DE', 'company_location_ES', 'company_location_FI', 'company_location_FR', 'company_location_GB', 'company_location_GH', 'company_location_GR', 'company_location_HK', 'company_location_HR', 'company_location_IE', 'company_location_IN', 'company_location_JP', 'company_location_LU', 'company_location_LV', 'company_location_MT', 'company_location_MX', 'company_location_NG', 'company_location_NL', 'company_location_PK', 'company_location_PR', 'company_location_PT', 'company_location_RU', 'company_location_SG', 'company_location_TH', 'company_location_TR', 'company_location_UA', 'company_location_US', 'company_size_L', 'company_size_M', 'company_size_S', 'salary_category']

Ручной синтез

Создание новых признаков на основе экспертных знаний и логики предметной области. К примеру, для данных о заработной плате в Data Science можно создать признак "зарплата в месяц".

In [34]:
df = pd.read_csv("..//static//csv//ds_salaries.csv")
# Создание нового признака 'Salary in month'
df['Salary in month'] = df['salary'] // 12

# Вывод первых нескольких строк датафрейма для проверки
print(df.head())
   work_year experience_level employment_type                 job_title  \
0       2023               SE              FT  Principal Data Scientist   
1       2023               MI              CT               ML Engineer   
2       2023               MI              CT               ML Engineer   
3       2023               SE              FT            Data Scientist   
4       2023               SE              FT            Data Scientist   

   salary salary_currency  salary_in_usd employee_residence  remote_ratio  \
0   80000             EUR          85847                 ES           100   
1   30000             USD          30000                 US           100   
2   25500             USD          25500                 US           100   
3  175000             USD         175000                 CA           100   
4  120000             USD         120000                 CA           100   

  company_location company_size  Salary in month  
0               ES            L             6666  
1               US            S             2500  
2               US            S             2125  
3               CA            M            14583  
4               CA            M            10000  

Масштабирование признаков - это процесс преобразования числовых признаков таким образом, чтобы они имели одинаковый масштаб. Это важно для многих алгоритмов машинного обучения, которые чувствительны к масштабу признаков, таких как линейная регрессия, метод опорных векторов (SVM) и нейронные сети.

In [36]:
from sklearn.preprocessing import StandardScaler, MinMaxScaler

# Пример масштабирования числовых признаков
numerical_features = ['work_year', 'salary']

scaler = StandardScaler()
train_data_encoded[numerical_features] = scaler.fit_transform(train_data_encoded[numerical_features])
val_data_encoded[numerical_features] = scaler.transform(val_data_encoded[numerical_features])
test_data_encoded[numerical_features] = scaler.transform(test_data_encoded[numerical_features])

Конструирование признаков с применением фреймворка Featuretools

In [43]:
import pandas as pd
import featuretools as ft
from sklearn.model_selection import train_test_split

# Загрузка данных
df = pd.read_csv("..//static//csv//ds_salaries.csv")

# Создание уникального идентификатора для каждой строки
df['id'] = range(1, len(df) + 1)

# Предобработка данных (например, кодирование категориальных признаков, удаление дубликатов)
# Удаление дубликатов по всем столбцам
df = df.drop_duplicates()

# Создание EntitySet
es = ft.EntitySet(id='data_science_jobs')

# Добавление датафрейма с данными о рабочих местах
es = es.add_dataframe(
    dataframe_name='jobs',
    dataframe=df,
    index='id'
)

# Генерация признаков с помощью глубокой синтезы признаков
feature_matrix, feature_defs = ft.dfs(entityset=es, target_dataframe_name='jobs', max_depth=1)

# Выводим первые 5 строк сгенерированного набора признаков
print(feature_matrix.head())

# Разделение данных на обучающую и тестовую выборки
train_data, test_data = train_test_split(df, test_size=0.3, random_state=42)

# Разделение оставшейся части на валидационную и тестовую выборки
val_data, test_data = train_test_split(test_data, test_size=0.5, random_state=42)

# Преобразование признаков для контрольной и тестовой выборок
val_feature_matrix = ft.calculate_feature_matrix(features=feature_defs, entityset=es, instance_ids=val_data['id'])
test_feature_matrix = ft.calculate_feature_matrix(features=feature_defs, entityset=es, instance_ids=test_data['id'])

# Вывод первых 5 строк сгенерированных признаков для валидационной и тестовой выборок
print(val_feature_matrix.head())
print(test_feature_matrix.head())
d:\MII\AIM-PIbd-32-Kaznacheeva-E-K\aimenv\Lib\site-packages\woodwork\type_sys\utils.py:33: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
d:\MII\AIM-PIbd-32-Kaznacheeva-E-K\aimenv\Lib\site-packages\woodwork\type_sys\utils.py:33: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
d:\MII\AIM-PIbd-32-Kaznacheeva-E-K\aimenv\Lib\site-packages\woodwork\type_sys\utils.py:33: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
d:\MII\AIM-PIbd-32-Kaznacheeva-E-K\aimenv\Lib\site-packages\woodwork\type_sys\utils.py:33: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
d:\MII\AIM-PIbd-32-Kaznacheeva-E-K\aimenv\Lib\site-packages\woodwork\type_sys\utils.py:33: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
d:\MII\AIM-PIbd-32-Kaznacheeva-E-K\aimenv\Lib\site-packages\woodwork\type_sys\utils.py:33: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
d:\MII\AIM-PIbd-32-Kaznacheeva-E-K\aimenv\Lib\site-packages\woodwork\type_sys\utils.py:33: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
d:\MII\AIM-PIbd-32-Kaznacheeva-E-K\aimenv\Lib\site-packages\woodwork\type_sys\utils.py:33: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
d:\MII\AIM-PIbd-32-Kaznacheeva-E-K\aimenv\Lib\site-packages\woodwork\type_sys\utils.py:33: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
d:\MII\AIM-PIbd-32-Kaznacheeva-E-K\aimenv\Lib\site-packages\woodwork\type_sys\utils.py:33: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
d:\MII\AIM-PIbd-32-Kaznacheeva-E-K\aimenv\Lib\site-packages\woodwork\type_sys\utils.py:33: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
d:\MII\AIM-PIbd-32-Kaznacheeva-E-K\aimenv\Lib\site-packages\woodwork\type_sys\utils.py:33: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
d:\MII\AIM-PIbd-32-Kaznacheeva-E-K\aimenv\Lib\site-packages\woodwork\type_sys\utils.py:33: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
d:\MII\AIM-PIbd-32-Kaznacheeva-E-K\aimenv\Lib\site-packages\woodwork\type_sys\utils.py:33: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
    work_year experience_level employment_type                 job_title  \
id                                                                         
1        2023               SE              FT  Principal Data Scientist   
2        2023               MI              CT               ML Engineer   
3        2023               MI              CT               ML Engineer   
4        2023               SE              FT            Data Scientist   
5        2023               SE              FT            Data Scientist   

    salary salary_currency  salary_in_usd employee_residence  remote_ratio  \
id                                                                           
1    80000             EUR          85847                 ES           100   
2    30000             USD          30000                 US           100   
3    25500             USD          25500                 US           100   
4   175000             USD         175000                 CA           100   
5   120000             USD         120000                 CA           100   

   company_location company_size  
id                                
1                ES            L  
2                US            S  
3                US            S  
4                CA            M  
5                CA            M  
      work_year experience_level employment_type           job_title  salary  \
id                                                                             
2385       2022               SE              FT       Data Engineer  175000   
941        2023               SE              FT  Analytics Engineer  150000   
1617       2023               MI              FT        Data Analyst   65000   
1443       2023               MI              FT        Data Analyst   61200   
416        2023               SE              FT      Data Scientist  175000   

     salary_currency  salary_in_usd employee_residence  remote_ratio  \
id                                                                     
2385             USD         175000                 US           100   
941              USD         150000                 US             0   
1617             GBP          78990                 GB             0   
1443             USD          61200                 US             0   
416              USD         175000                 US           100   

     company_location company_size  
id                                  
2385               US            M  
941                US            M  
1617               GB            M  
1443               US            M  
416                US            M  
      work_year experience_level employment_type           job_title  salary  \
id                                                                             
2321       2022               SE              FT  Analytics Engineer  116250   
473        2023               EX              FT       Data Engineer  286000   
2269       2022               EN              FT       Data Engineer  135000   
430        2023               SE              FT        Data Analyst  208450   
3574       2020               MI              FT       Data Engineer   88000   

     salary_currency  salary_in_usd employee_residence  remote_ratio  \
id                                                                     
2321             USD         116250                 US           100   
473              USD         286000                 US           100   
2269             USD         135000                 US             0   
430              USD         208450                 US           100   
3574             GBP         112872                 GB            50   

     company_location company_size  
id                                  
2321               US            M  
473                US            M  
2269               US            M  
430                US            M  
3574               GB            L  

Оценка качества каждого набора признаков

Предсказательная способность Метрики: RMSE, MAE, R²

Методы: Обучение модели на обучающей выборке и оценка на контрольной и тестовой выборках.

Скорость вычисления Методы: Измерение времени выполнения генерации признаков и обучения модели.

Надежность Методы: Кросс-валидация, анализ чувствительности модели к изменениям в данных.

Корреляция Методы: Анализ корреляционной матрицы признаков, удаление мультиколлинеарных признаков.

Цельность Методы: Проверка логической связи между признаками и целевой переменной, интерпретация результатов модели.

In [44]:
import time
import pandas as pd
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score

# Загрузка данных
df = pd.read_csv("..//static//csv//ds_salaries.csv")

# Разделение данных на признаки и целевую переменную
X = df.drop(['salary_in_usd', 'salary', 'salary_currency'], axis=1)  # Удаляем целевую переменную и ненужные столбцы
y = df['salary_in_usd']

# One-hot encoding для категориальных переменных
X = pd.get_dummies(X, drop_first=True)

# Проверяем, есть ли пропущенные значения, и заполняем их медианой или другим подходящим значением
X.fillna(X.median(), inplace=True)

# Разделение данных на обучающую и валидационную выборки
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)

# Обучение модели
model = LinearRegression()

# Начинаем отсчет времени
start_time = time.time()
model.fit(X_train, y_train)

# Время обучения модели
train_time = time.time() - start_time

# Предсказания и оценка модели
predictions = model.predict(X_val)
mse = mean_squared_error(y_val, predictions)
mae = mean_absolute_error(y_val, predictions)
r2 = r2_score(y_val, predictions)

print(f'Время обучения модели: {train_time:.2f} секунд')
print(f'Среднеквадратичная ошибка (RMSE): {mse**0.5:.2f}')
print(f'Средняя абсолютная ошибка (MAE): {mae:.2f}')
print(f'Коэффициент детерминации (R²): {r2:.2f}')

# Кросс-валидация
cv_scores = cross_val_score(model, X, y, cv=5, scoring='neg_mean_squared_error')
cv_rmse_scores = (-cv_scores)**0.5
print(f'Кросс-валидация RMSE: {cv_rmse_scores.mean():.2f}{cv_rmse_scores.std():.2f})')

# Анализ корреляции
correlation_matrix = X.corr()
print("Корреляционная матрица признаков:")
print(correlation_matrix)

# Цельность: Проверка логической связи между признаками и целевой переменной
# В данном случае, мы можем проанализировать коэффициенты модели
coefficients = pd.DataFrame({'Feature': X.columns, 'Coefficient': model.coef_})
print("Коэффициенты модели:")
print(coefficients)
Время обучения модели: 1.81 секунд
Среднеквадратичная ошибка (RMSE): 49834.60
Средняя абсолютная ошибка (MAE): 37776.22
Коэффициент детерминации (R²): 0.37
Кросс-валидация RMSE: 51653687796568.14 (± 37705548691705.71)
Корреляционная матрица признаков:
                     work_year  remote_ratio  experience_level_EX  \
work_year             1.000000     -0.236430             0.003156   
remote_ratio         -0.236430      1.000000             0.007190   
experience_level_EX   0.003156      0.007190             1.000000   
experience_level_MI  -0.128381     -0.000650            -0.092433   
experience_level_SE   0.194923     -0.035201            -0.252152   
...                        ...           ...                  ...   
company_location_UA   0.005969     -0.005896            -0.005778   
company_location_US   0.267002     -0.077706             0.022562   
company_location_VN   0.014787     -0.015545            -0.002888   
company_size_M        0.421975     -0.154550            -0.003061   
company_size_S       -0.257948      0.108512             0.012020   

                     experience_level_MI  experience_level_SE  \
work_year                      -0.128381             0.194923   
remote_ratio                   -0.000650            -0.035201   
experience_level_EX            -0.092433            -0.252152   
experience_level_MI             1.000000            -0.744400   
experience_level_SE            -0.744400             1.000000   
...                                  ...                  ...   
company_location_UA            -0.017059             0.005553   
company_location_US            -0.255712             0.324686   
company_location_VN            -0.008526            -0.023258   
company_size_M                 -0.097174             0.236746   
company_size_S                  0.060936            -0.163489   

                     employment_type_FL  employment_type_FT  \
work_year                     -0.050350            0.116310   
remote_ratio                   0.025238           -0.068702   
experience_level_EX           -0.009144            0.001938   
experience_level_MI            0.035964           -0.033295   
experience_level_SE           -0.040667            0.113486   
...                                 ...                 ...   
company_location_UA            0.156722           -0.079394   
company_location_US           -0.053906            0.082093   
company_location_VN           -0.000843            0.001628   
company_size_M                -0.047840            0.125424   
company_size_S                 0.095761           -0.173783   

                     employment_type_PT  job_title_AI Developer  \
work_year                     -0.093825                0.027726   
remote_ratio                   0.041919               -0.016126   
experience_level_EX           -0.011933               -0.009591   
experience_level_MI           -0.006230               -0.004301   
experience_level_SE           -0.096100               -0.045802   
...                                 ...                     ...   
company_location_UA           -0.002202                0.300345   
company_location_US           -0.078434               -0.099216   
company_location_VN           -0.001101               -0.000885   
company_size_M                -0.100277               -0.043467   
company_size_S                 0.108664                0.064994   

                     job_title_AI Programmer  ...  company_location_SG  \
work_year                           0.004219  ...            -0.021620   
remote_ratio                        0.001772  ...             0.016794   
experience_level_EX                -0.004085  ...            -0.007079   
experience_level_MI                -0.012059  ...             0.044089   
experience_level_SE                -0.032896  ...            -0.042828   
...                                      ...  ...                  ...   
company_location_UA                -0.000754  ...            -0.001306   
company_location_US                -0.047600  ...            -0.082490   
company_location_VN                -0.000377  ...            -0.000653   
company_size_M                     -0.021372  ...            -0.055210   
company_size_S                     -0.004676  ...            -0.008104   

                     company_location_SI  company_location_SK  \
work_year                      -0.017648            -0.008821   
remote_ratio                    0.027712             0.018050   
experience_level_EX            -0.005778            -0.002888   
experience_level_MI             0.042620            -0.008526   
experience_level_SE            -0.029172             0.011453   
...                                  ...                  ...   
company_location_UA            -0.001066            -0.000533   
company_location_US            -0.067335            -0.033654   
company_location_VN            -0.000533            -0.000266   
company_size_M                 -0.030233            -0.037352   
company_size_S                 -0.006615             0.080574   

                     company_location_TH  company_location_TR  \
work_year                      -0.001648            -0.051424   
remote_ratio                    0.011871            -0.004714   
experience_level_EX            -0.005003            -0.006461   
experience_level_MI             0.008196             0.052106   
experience_level_SE            -0.020249            -0.036503   
...                                  ...                  ...   
company_location_UA            -0.000923            -0.001192   
company_location_US            -0.058306            -0.075293   
company_location_VN            -0.000462            -0.000596   
company_size_M                 -0.039024            -0.003949   
company_size_S                 -0.005728            -0.007397   

                     company_location_UA  company_location_US  \
work_year                       0.005969             0.267002   
remote_ratio                   -0.005896            -0.077706   
experience_level_EX            -0.005778             0.022562   
experience_level_MI            -0.017059            -0.255712   
experience_level_SE             0.005553             0.324686   
...                                  ...                  ...   
company_location_UA             1.000000            -0.067335   
company_location_US            -0.067335             1.000000   
company_location_VN            -0.000533            -0.033654   
company_size_M                 -0.030233             0.314961   
company_size_S                  0.035342            -0.229439   

                     company_location_VN  company_size_M  company_size_S  
work_year                       0.014787        0.421975       -0.257948  
remote_ratio                   -0.015545       -0.154550        0.108512  
experience_level_EX            -0.002888       -0.003061        0.012020  
experience_level_MI            -0.008526       -0.097174        0.060936  
experience_level_SE            -0.023258        0.236746       -0.163489  
...                                  ...             ...             ...  
company_location_UA            -0.000533       -0.030233        0.035342  
company_location_US            -0.033654        0.314961       -0.229439  
company_location_VN             1.000000       -0.037352       -0.003306  
company_size_M                 -0.037352        1.000000       -0.463577  
company_size_S                 -0.003306       -0.463577        1.000000  

[250 rows x 250 columns]
Коэффициенты модели:
                 Feature   Coefficient
0              work_year   3996.696898
1           remote_ratio      5.199270
2    experience_level_EX  88740.552288
3    experience_level_MI  20170.854874
4    experience_level_SE  44093.474726
..                   ...           ...
245  company_location_UA -64984.628104
246  company_location_US  40574.678578
247  company_location_VN  24478.024917
248       company_size_M  -2895.244061
249       company_size_S -23506.811439

[250 rows x 2 columns]
In [ ]:
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error
from sklearn.model_selection import train_test_split, cross_val_score

# Загрузка данных
df = pd.read_csv("..//static//csv//ds_salaries.csv")

# Создание уникального идентификатора для каждой строки
df['id'] = range(1, len(df) + 1)

# Предобработка данных (например, кодирование категориальных признаков, удаление дубликатов)
# Удаление дубликатов по всем столбцам
df = df.drop_duplicates()

# Создание EntitySet
es = ft.EntitySet(id='data_science_jobs')

# Добавление датафрейма с данными о рабочих местах
es = es.add_dataframe(
    dataframe_name='jobs',
    dataframe=df,
    index='id'
)

# Генерация признаков с помощью глубокой синтезы признаков
feature_matrix, feature_defs = ft.dfs(entityset=es, target_dataframe_name='jobs', max_depth=1)

# Удаление строк с NaN
feature_matrix = feature_matrix.dropna()

# Разделение данных на обучающую и тестовую выборки
X_train = feature_matrix.drop('salary_in_usd', axis=1)
y_train = feature_matrix['salary_in_usd']

# Кодирования категориальных переменных с использованием одноразового кодирования
X_train = pd.get_dummies(X_train, drop_first=True)

# Разобьём тренировочный тест и примерку модели
X_train, X_test, y_train, y_test = train_test_split(X_train, y_train, test_size=0.2, random_state=42)

# Выбор модели
model = RandomForestRegressor(random_state=42)

# Обучение модели
model.fit(X_train, y_train)

# Предсказание и оценка
y_pred = model.predict(X_test)

rmse = mean_squared_error(y_test, y_pred, squared=False)
r2 = r2_score(y_test, y_pred)
mae = mean_absolute_error(y_test, y_pred)

print(f"RMSE: {rmse}")
print(f"R²: {r2}")
print(f"MAE: {mae} \n")

# Кросс-валидация
scores = cross_val_score(model, X_train, y_train, cv=5, scoring='neg_mean_squared_error')
rmse_cv = (-scores.mean())**0.5
print(f"Кросс-валидация RMSE: {rmse_cv} \n")

# Анализ важности признаков
feature_importances = model.feature_importances_
feature_names = X_train.columns

# Проверка на переобучение
y_train_pred = model.predict(X_train)

rmse_train = mean_squared_error(y_train, y_train_pred, squared=False)
r2_train = r2_score(y_train, y_train_pred)
mae_train = mean_absolute_error(y_train, y_train_pred)

print(f"Train RMSE: {rmse_train}")
print(f"Train R²: {r2_train}")
print(f"Train MAE: {mae_train}")
print()

# Визуализация результатов
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred, alpha=0.5)
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'k--', lw=2)
plt.xlabel('Фактическая зарплата (USD)')
plt.ylabel('Прогнозируемая зарплата (USD)')
plt.title('Фактическая зарплата по сравнению с прогнозируемой')
plt.show()
d:\MII\AIM-PIbd-32-Kaznacheeva-E-K\aimenv\Lib\site-packages\woodwork\type_sys\utils.py:33: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
d:\MII\AIM-PIbd-32-Kaznacheeva-E-K\aimenv\Lib\site-packages\woodwork\type_sys\utils.py:33: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
d:\MII\AIM-PIbd-32-Kaznacheeva-E-K\aimenv\Lib\site-packages\woodwork\type_sys\utils.py:33: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
d:\MII\AIM-PIbd-32-Kaznacheeva-E-K\aimenv\Lib\site-packages\woodwork\type_sys\utils.py:33: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
d:\MII\AIM-PIbd-32-Kaznacheeva-E-K\aimenv\Lib\site-packages\woodwork\type_sys\utils.py:33: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
d:\MII\AIM-PIbd-32-Kaznacheeva-E-K\aimenv\Lib\site-packages\woodwork\type_sys\utils.py:33: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
d:\MII\AIM-PIbd-32-Kaznacheeva-E-K\aimenv\Lib\site-packages\woodwork\type_sys\utils.py:33: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
d:\MII\AIM-PIbd-32-Kaznacheeva-E-K\aimenv\Lib\site-packages\woodwork\type_sys\utils.py:33: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
d:\MII\AIM-PIbd-32-Kaznacheeva-E-K\aimenv\Lib\site-packages\woodwork\type_sys\utils.py:33: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
d:\MII\AIM-PIbd-32-Kaznacheeva-E-K\aimenv\Lib\site-packages\woodwork\type_sys\utils.py:33: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
d:\MII\AIM-PIbd-32-Kaznacheeva-E-K\aimenv\Lib\site-packages\woodwork\type_sys\utils.py:33: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
d:\MII\AIM-PIbd-32-Kaznacheeva-E-K\aimenv\Lib\site-packages\woodwork\type_sys\utils.py:33: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
d:\MII\AIM-PIbd-32-Kaznacheeva-E-K\aimenv\Lib\site-packages\woodwork\type_sys\utils.py:33: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
d:\MII\AIM-PIbd-32-Kaznacheeva-E-K\aimenv\Lib\site-packages\woodwork\type_sys\utils.py:33: UserWarning: Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
  pd.to_datetime(
d:\MII\AIM-PIbd-32-Kaznacheeva-E-K\aimenv\Lib\site-packages\sklearn\metrics\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.
  warnings.warn(
RMSE: 8277.602700993119
R²: 0.9826437806135544
MAE: 1270.2934354194408 

Кросс-валидация RMSE: 13606.980806552549 

Train RMSE: 4839.006207438376
Train R²: 0.9941174224388726
Train MAE: 664.4994041278297

d:\MII\AIM-PIbd-32-Kaznacheeva-E-K\aimenv\Lib\site-packages\sklearn\metrics\_regression.py:492: FutureWarning: 'squared' is deprecated in version 1.4 and will be removed in 1.6. To calculate the root mean squared error, use the function'root_mean_squared_error'.
  warnings.warn(
No description has been provided for this image

Выводы и итог

Модель случайного леса (RandomForestRegressor) показала удовлетворительные результаты при прогнозировании зарплат в области Data Science. Метрики качества и кросс-валидация позволяют предположить, что модель не сильно переобучена и может быть использована для практических целей.

Точность предсказаний: Модель показывает довольно высокий R² (0.8029), что указывает на хорошее объяснение вариации зарплат. Однако, значения RMSE и MAE довольно высоки, что говорит о том, что модель не очень точно предсказывает зарплаты, особенно для высоких значений.

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

Кросс-валидация: Значение RMSE после кросс-валидации немного выше, чем на тестовой выборке, что может указывать на некоторую нестабильность модели.

Рекомендации: Следует уделить внимание дополнительной обработке категориальных признаков, улучшению метода feature engineering, а также возможной оптимизации модели (например, через подбор гиперпараметров) для повышения точности предсказаний на экстремальных значениях. Также стоит рассмотреть возможность использования других моделей, таких как градиентный бустинг или нейронные сети, для сравнения результатов и выбора наиболее эффективной модели.