diff --git a/kochkareva_elizaveta_lab_5/MaxSalaryChart.png b/kochkareva_elizaveta_lab_5/MaxSalaryChart.png new file mode 100644 index 0000000..352822d Binary files /dev/null and b/kochkareva_elizaveta_lab_5/MaxSalaryChart.png differ diff --git a/kochkareva_elizaveta_lab_5/MinSalaryChart.png b/kochkareva_elizaveta_lab_5/MinSalaryChart.png new file mode 100644 index 0000000..7aef0ac Binary files /dev/null and b/kochkareva_elizaveta_lab_5/MinSalaryChart.png differ diff --git a/kochkareva_elizaveta_lab_5/README.md b/kochkareva_elizaveta_lab_5/README.md new file mode 100644 index 0000000..e2317b3 --- /dev/null +++ b/kochkareva_elizaveta_lab_5/README.md @@ -0,0 +1,53 @@ + +# Лабораторная работа 5. Вариант 15 + +### Задание +Использовать линейную регрессию, самостоятельно сформулировав задачу. + +### Как запустить лабораторную работу +Для запуска программы необходимо с помощью командной строки в корневой директории файлов прокета прописать: +``` +python main.py +``` +### Какие технологии использовали +- Библиотека *numpy* для работы с массивами. +- Библиотека *pandas* для работы с данными в формате таблицы. +- Библиотека *matplotlib pyplot* - для визуализации данных. +- Библиотека *sklearn*: + - *LinearRegression* для создания и работы с моделью Линейной регрессии. + - *train_test_split* для разделения набора данных на обучающую и тестовую выборки. + - RFE для рекурсивного отбора признаков + +### Описание лабораторной работы +#### Сформулированная задача +Задачи анализа, решаемая регрессией: предсказать диапазон окладов на основе других признаков. +#### Оценка важности параметров + +Для решения данной задачи будем рассматривать отдельно столбцы `"Max Salary"` и `"Min Salary"`, а также произведем оценку важности отстальных параметров/столбцов датасета с помощью алгоритма RFE, аналогично прошлой лабораторной работе. + +В результате получаем следующее: +``` +Оценка важности параметров для нахождения минимальной оплаты труда +{'Qualifications': 1.0, 'Work Type': 1.0, 'Preference': 1.0, 'Min Experience': 1.0, 'Max Experience': 1.0, 'day': 1.0, "'Casual Dress Code, Social and Recreational Activities, Employee Referral Programs, Health and Wellness Facilities, Life and Disability Insurance'": 1.0, "'Childcare Assistance, Paid Time Off (PTO), Relocation Assistance, Flexible Work Arrangements, Professional Development'": 1.0, "'Employee Assistance Programs (EAP), Tuition Reimbursement, Profit-Sharing, Transportation Benefits, Parental Leave'": 1.0, "'Employee Referral Programs, Financial Counseling, Health and Wellness Facilities, Casual Dress Code, Flexible Spending Accounts (FSAs)'": 1.0, "'Flexible Spending Accounts (FSAs), Relocation Assistance, Legal Assistance, Employee Recognition Programs, Financial Counseling'": 1.0, "'Health Insurance, Retirement Plans, Flexible Work Arrangements, Employee Assistance Programs (EAP), Bonuses and Incentive Programs'": 1.0, "'Legal Assistance, Bonuses and Incentive Programs, Wellness Programs, Employee Discounts, Retirement Plans'": 1.0, "'Life and Disability Insurance, Stock Options or Equity Grants, Employee Recognition Programs, Health Insurance, Social and Recreational Activities'": 1.0, "'Transportation Benefits, Professional Development, Bonuses and Incentive Programs, Profit-Sharing, Employee Discounts'": 1.0, "'Tuition Reimbursement, Stock Options or Equity Grants, Parental Leave, Wellness Programs, Childcare Assistance'": 1.0, "'Health Insurance, Retirement Plans, Paid Time Off (PTO), Flexible Work Arrangements, Employee Assistance Programs (EAP)'": 0.5, 'year': 0.33, 'month': 0.25, 'State': 0.2, 'location': 0.17, 'Country': 0.14, 'Role': 0.12, 'Job Portal': 0.11, 'City': 0.1, 'Industry': 0.09, 'Job Title': 0.08, 'skills': 0.08, 'Company': 0.07, 'Sector': 0.07, 'Company Size': 0.06, 'Max Salary': 0.06, 'Ticker': 0.06} +Оценка важности параметров для нахождения максимальной оплаты труда +{'Work Type': 1.0, 'Preference': 1.0, 'Min Experience': 1.0, 'Max Experience': 1.0, 'year': 1.0, "'Casual Dress Code, Social and Recreational Activities, Employee Referral Programs, Health and Wellness Facilities, Life and Disability Insurance'": 1.0, "'Childcare Assistance, Paid Time Off (PTO), Relocation Assistance, Flexible Work Arrangements, Professional Development'": 1.0, "'Employee Assistance Programs (EAP), Tuition Reimbursement, Profit-Sharing, Transportation Benefits, Parental Leave'": 1.0, "'Employee Referral Programs, Financial Counseling, Health and Wellness Facilities, Casual Dress Code, Flexible Spending Accounts (FSAs)'": 1.0, "'Flexible Spending Accounts (FSAs), Relocation Assistance, Legal Assistance, Employee Recognition Programs, Financial Counseling'": 1.0, "'Health Insurance, Retirement Plans, Flexible Work Arrangements, Employee Assistance Programs (EAP), Bonuses and Incentive Programs'": 1.0, "'Health Insurance, Retirement Plans, Paid Time Off (PTO), Flexible Work Arrangements, Employee Assistance Programs (EAP)'": 1.0, "'Legal Assistance, Bonuses and Incentive Programs, Wellness Programs, Employee Discounts, Retirement Plans'": 1.0, "'Life and Disability Insurance, Stock Options or Equity Grants, Employee Recognition Programs, Health Insurance, Social and Recreational Activities'": 1.0, "'Transportation Benefits, Professional Development, Bonuses and Incentive Programs, Profit-Sharing, Employee Discounts'": 1.0, "'Tuition Reimbursement, Stock Options or Equity Grants, Parental Leave, Wellness Programs, Childcare Assistance'": 1.0, 'month': 0.5, 'Country': 0.33, 'location': 0.25, 'day': 0.2, 'Qualifications': 0.17, 'State': 0.14, 'Sector': 0.12, 'Industry': 0.11, 'Role': 0.1, 'Ticker': 0.09, 'Job Portal': 0.08, 'Company': 0.08, 'skills': 0.07, 'City': 0.07, 'Company Size': 0.06, 'Job Title': 0.06, 'Min Salary': 0.06} +``` + +Как можно заметить наиболее значимые параметры для столбцов `"Max Salary"` и `"Min Salary"` почти аналогичны, однако для `"Min Salary"` также важен параметр `"Qualifications"`, а для `"Max Salary"` - `"year"`. + +#### Линейная регрессия +Для предсказать диапазон окладов на основе других признаков создадим два метода для столбцов `"Max Salary"` и `"Min Salary"`, где скопируем данные датасета и удалим из него столбец целевого значения и столбцы/параматеры, которые имеют наименьшую значимость. + +Затем, разделим датасет на тестувую и обучающую выборк, создаем экземпляр модели линейной регрессии с помощью класса `LinearRegression()`, которая будет использоваться для построения линейной регрессии. Обучаем модель на обучающем наборе данных `X_train` и `y_train` с помощью метода `fit()`. Затем используем обученную модель для прогнозирования целевых переменных на тестовом наборе данных `X_test` с помощью метода `predict()`. Полученные прогнозы сохраняются в переменную `y_pred`. И вычисляем коэффициент детерминации (R-квадрат) для для оценки качества модели регрессии на тестовом наборе данных с помощью метода `score()`. + +Выполним построение графиков: + + +![График линейной регрессии "Min Salary"](MinSalaryChart.png) + +![График линейной регрессии "Max Salary"](MaxSalaryChart.png) + +### Вывод +Исходя из данных графиков, можно сделать вывод о том, что модели линейной регрессии не объясняют вариацию в данных и дают негативное значение, т.к. коэффициент детерминации равен *-0,00104...*.Обычно, отрицательное значение коэффициента детерминации указывает на то, что модель показывает худшие результаты, чем простая горизонтальная линия, которая является наихудшим предсказанием. + +Исходя из этого, можно сделать вывод, что линейная регрессия, представленная данной моделью, плохо соответствует данным и не объясняет вариацию в данных. Возможно, требуется рассмотреть другие модели или улучшить текущую модель, чтобы достичь более точных предсказаний. \ No newline at end of file diff --git a/kochkareva_elizaveta_lab_5/main.py b/kochkareva_elizaveta_lab_5/main.py new file mode 100644 index 0000000..2ef16e7 --- /dev/null +++ b/kochkareva_elizaveta_lab_5/main.py @@ -0,0 +1,125 @@ +import os.path +import pandas as pd +from matplotlib import pyplot as plt +from sklearn.feature_selection import RFE +from sklearn.linear_model import LinearRegression +from sklearn.model_selection import train_test_split + +#Задачи анализа, решаемые регрессией: предсказать диапазон окладов или компенсаций +# на основе других признаков: опыт, квалификация, тип работы и т.д. + + +picfld = os.path.join('static', 'charts') + +data = pd.read_csv('D:/Интеллектуальные информационные системы/Dataset/updated_job_descriptions.csv') + +def linear_regression_min_salary(): + y = data['Min Salary'] + df = data.copy() + # удаляем целевое значение и наименее важные параметры + df.drop(['Min Salary', 'Preference', 'day', 'month', 'Job Portal', 'State', 'location', 'Country', 'Industry', 'skills', + 'Role', 'Job Title', 'City', 'Sector', 'Ticker', 'Company Size', 'Company', 'Max Salary'], + axis=1, inplace=True) + X_train, X_test, y_train, y_test = train_test_split(df.values, y.values, test_size=0.0002, train_size=0.2) + model = LinearRegression() + model.fit(X_train, y_train) + y_pred = model.predict(X_test) + r_sq = model.score(X_test, y_test) + plt.plot(y_test, c="#bd0000", label="\"y\" исходная") + plt.plot(y_pred, c="#00BFFF", + label="\"y\" предсказанная \n" "Кд = " + str(r_sq)) + plt.legend(loc='lower left') + plt.title("Линейная регрессия") + plt.savefig('static/charts/MinSalaryChart.png') + plt.close() + + +def linear_regression_max_salary(): + y = data['Max Salary'] + df = data.copy() + # удаляем целевое значение и наименее важные параметры + df.drop(['Max Salary', 'Max Experience', 'Job Portal', 'day', 'Sector', 'Industry', 'Country', 'location', 'Job Title', + 'Ticker', 'Company', 'City', 'State', 'Role', 'skills', 'Qualifications', 'Company Size', 'Min Salary'], axis=1, inplace=True) + X_train, X_test, y_train, y_test = train_test_split(df.values, y.values, test_size=0.0002, train_size=0.2) + model = LinearRegression() + model.fit(X_train, y_train) + y_pred = model.predict(X_test) + r_sq = model.score(X_test, y_test) + plt.plot(y_test, c="#bd0000", label="\"y\" исходная") + plt.plot(y_pred, c="#00BFFF", + label="\"y\" предсказанная \n" "Кд = " + str(r_sq)) + plt.legend(loc='lower left') + plt.title("Линейная регрессия") + plt.savefig('static/charts/MaxSalaryChart.png') + plt.close() + + +# оценка важности параметров +def RFE_max_salary(): + df = data.copy() + y = data['Max Salary'] + df.drop(["Max Salary"], axis=1, inplace=True) + X_train, X_test, y_train, y_test = train_test_split(df.values, y.values, test_size=0.2) + column_names = ['Qualifications', 'Country', 'location', 'Work Type', 'Company Size', 'Preference', 'Job Title', 'Role', 'Job Portal', + 'skills', 'Company', 'Min Experience', 'Max Experience', 'Min Salary', + 'Sector', 'Industry', 'City', 'State', 'Ticker', 'year', 'month', 'day', + "'Casual Dress Code, Social and Recreational Activities, Employee Referral Programs, Health and Wellness Facilities, Life and Disability Insurance'", + "'Childcare Assistance, Paid Time Off (PTO), Relocation Assistance, Flexible Work Arrangements, Professional Development'", + "'Employee Assistance Programs (EAP), Tuition Reimbursement, Profit-Sharing, Transportation Benefits, Parental Leave'", + "'Employee Referral Programs, Financial Counseling, Health and Wellness Facilities, Casual Dress Code, Flexible Spending Accounts (FSAs)'", + "'Flexible Spending Accounts (FSAs), Relocation Assistance, Legal Assistance, Employee Recognition Programs, Financial Counseling'", + "'Health Insurance, Retirement Plans, Flexible Work Arrangements, Employee Assistance Programs (EAP), Bonuses and Incentive Programs'", + "'Health Insurance, Retirement Plans, Paid Time Off (PTO), Flexible Work Arrangements, Employee Assistance Programs (EAP)'", + "'Legal Assistance, Bonuses and Incentive Programs, Wellness Programs, Employee Discounts, Retirement Plans'", + "'Life and Disability Insurance, Stock Options or Equity Grants, Employee Recognition Programs, Health Insurance, Social and Recreational Activities'", + "'Transportation Benefits, Professional Development, Bonuses and Incentive Programs, Profit-Sharing, Employee Discounts'", + "'Tuition Reimbursement, Stock Options or Equity Grants, Parental Leave, Wellness Programs, Childcare Assistance'"] + estimator = LinearRegression() + rfe_model = RFE(estimator) + rfe_model.fit(X_train, y_train) + ranks = rank_to_dict_rfe(rfe_model.ranking_, column_names) + sorted_dict = dict(sorted(ranks.items(), key=lambda x: x[1], reverse=True)) + print("Оценка важности параметров для нахождения максимальной оплаты труда") + print(sorted_dict) + + +def RFE_min_salary(): + df = data.copy() + y = data['Min Salary'] + df.drop(["Min Salary"], axis=1, inplace=True) + X_train, X_test, y_train, y_test = train_test_split(df.values, y.values, test_size=0.2) + column_names = ['Qualifications', 'Country', 'location', 'Work Type', 'Company Size', 'Preference', 'Job Title', 'Role', 'Job Portal', + 'skills', 'Company', 'Min Experience', 'Max Experience', 'Max Salary', + 'Sector', 'Industry', 'City', 'State', 'Ticker', 'year', 'month', 'day', + "'Casual Dress Code, Social and Recreational Activities, Employee Referral Programs, Health and Wellness Facilities, Life and Disability Insurance'", + "'Childcare Assistance, Paid Time Off (PTO), Relocation Assistance, Flexible Work Arrangements, Professional Development'", + "'Employee Assistance Programs (EAP), Tuition Reimbursement, Profit-Sharing, Transportation Benefits, Parental Leave'", + "'Employee Referral Programs, Financial Counseling, Health and Wellness Facilities, Casual Dress Code, Flexible Spending Accounts (FSAs)'", + "'Flexible Spending Accounts (FSAs), Relocation Assistance, Legal Assistance, Employee Recognition Programs, Financial Counseling'", + "'Health Insurance, Retirement Plans, Flexible Work Arrangements, Employee Assistance Programs (EAP), Bonuses and Incentive Programs'", + "'Health Insurance, Retirement Plans, Paid Time Off (PTO), Flexible Work Arrangements, Employee Assistance Programs (EAP)'", + "'Legal Assistance, Bonuses and Incentive Programs, Wellness Programs, Employee Discounts, Retirement Plans'", + "'Life and Disability Insurance, Stock Options or Equity Grants, Employee Recognition Programs, Health Insurance, Social and Recreational Activities'", + "'Transportation Benefits, Professional Development, Bonuses and Incentive Programs, Profit-Sharing, Employee Discounts'", + "'Tuition Reimbursement, Stock Options or Equity Grants, Parental Leave, Wellness Programs, Childcare Assistance'"] + estimator = LinearRegression() + rfe_model = RFE(estimator) + rfe_model.fit(X_train, y_train) + ranks = rank_to_dict_rfe(rfe_model.ranking_, column_names) + sorted_dict = dict(sorted(ranks.items(), key=lambda x: x[1], reverse=True)) + print("Оценка важности параметров для нахождения минимальной оплаты труда") + print(sorted_dict) + + +def rank_to_dict_rfe(ranking, names): + n_ranks = [float(1 / i) for i in ranking] + n_ranks = map(lambda x: round(x, 2), n_ranks) + return dict(zip(names, n_ranks)) + + +if __name__ == '__main__': + # linear_regression_min_salary() + # linear_regression_max_salary() + RFE_min_salary() + RFE_max_salary() + diff --git a/kochkareva_elizaveta_lab_5/static/charts/MaxSalaryChart.png b/kochkareva_elizaveta_lab_5/static/charts/MaxSalaryChart.png new file mode 100644 index 0000000..352822d Binary files /dev/null and b/kochkareva_elizaveta_lab_5/static/charts/MaxSalaryChart.png differ diff --git a/kochkareva_elizaveta_lab_5/static/charts/MinSalaryChart.png b/kochkareva_elizaveta_lab_5/static/charts/MinSalaryChart.png new file mode 100644 index 0000000..7aef0ac Binary files /dev/null and b/kochkareva_elizaveta_lab_5/static/charts/MinSalaryChart.png differ