IIS_2023_1/kochkareva_elizaveta_lab_3/main.py
2023-11-24 15:25:28 +04:00

194 lines
17 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from sklearn.tree import DecisionTreeClassifier
def data_preprocessing():
df_job_orig = pd.read_csv('D:/Интеллектуальные информационные системы/Dataset/job_descriptions.csv')
df_job_orig = pd.DataFrame(df_job_orig)
desired_rows = int(0.99 * len(df_job_orig))
df_job = df_job_orig.copy()
df_job = df_job[:desired_rows]
df_job.drop(["Job Id", "latitude", "longitude", "Contact Person", "Contact", "Job Description", "Responsibilities"], axis=1,
inplace=True)
# digitization
# --------------------------'Years'------------------------
# Разделяем значения 'Years' на минимальное и максимальное
# Удаляем символы валюты и другие символы
df_job['Experience'] = df_job['Experience'].apply(lambda x: str(x).replace('Years', '') if x is not None else x)
df_job[['Min Experience', 'Max Experience']] = df_job['Experience'].str.split(' to ', expand=True)
# Преобразуем значения в числовой формат
df_job['Min Experience'] = pd.to_numeric(df_job['Min Experience'])
df_job['Max Experience'] = pd.to_numeric(df_job['Max Experience'])
# --------------------------'Salary Range'------------------------
# Удаляем символы валюты и другие символы
df_job['Salary Range'] = df_job['Salary Range'].str.replace('$', '').str.replace('K', '000')
# Разделяем значения на минимальное и максимальное
df_job[['Min Salary', 'Max Salary']] = df_job['Salary Range'].str.split('-', expand=True)
# Преобразуем значения в числовой формат
df_job['Min Salary'] = pd.to_numeric(df_job['Min Salary'])
df_job['Max Salary'] = pd.to_numeric(df_job['Max Salary'])
# --------------------------'Qualifications'------------------------
# Создаем словарь для отображения уникальных значений в числовые идентификаторы
qualifications_dict = {qual: i for i, qual in enumerate(df_job['Qualifications'].unique())}
# Заменяем значения в столбце "Qualifications" соответствующими числовыми идентификаторами
df_job['Qualifications'] = df_job['Qualifications'].map(qualifications_dict)
# --------------------------'location'------------------------
# Создаем словарь для отображения уникальных значений в числовые идентификаторы
locations_dict = {locat: i for i, locat in enumerate(df_job['location'].unique())}
# Заменяем значения в столбце "location" соответствующими числовыми идентификаторами
df_job['location'] = df_job['location'].map(locations_dict)
# --------------------------'Country'-------------------------
# Создаем словарь для отображения уникальных значений в числовые идентификаторы
countries_dict = {countr: i for i, countr in enumerate(df_job['Country'].unique())}
# Заменяем значения в столбце "Country" соответствующими числовыми идентификаторами
df_job['Country'] = df_job['Country'].map(countries_dict)
# --------------------------'Work Type'-------------------------
# Создаем словарь для отображения уникальных значений в числовые идентификаторы
wt_dict = {wt: i for i, wt in enumerate(df_job['Work Type'].unique())}
# Заменяем значения в столбце "Work Type" соответствующими числовыми идентификаторами
df_job['Work Type'] = df_job['Work Type'].map(wt_dict)
# --------------------------'Preference gender'-------------------------
# Создаем словарь для отображения уникальных значений в числовые идентификаторы
gender_dict = {gender: i for i, gender in enumerate(df_job['Preference'].unique())}
# Заменяем значения в столбце "Preference" соответствующими числовыми идентификаторами
df_job['Preference'] = df_job['Preference'].map(gender_dict)
# --------------------------'Job Title'-------------------------
# Создаем словарь для отображения уникальных значений в числовые идентификаторы
jt_dict = {jt: i for i, jt in enumerate(df_job['Job Title'].unique())}
# Заменяем значения в столбце "Job Title" соответствующими числовыми идентификаторами
df_job['Job Title'] = df_job['Job Title'].map(jt_dict)
# --------------------------'Role'-------------------------
# Создаем словарь для отображения уникальных значений в числовые идентификаторы
role_dict = {role: i for i, role in enumerate(df_job['Role'].unique())}
# Заменяем значения в столбце "Role" соответствующими числовыми идентификаторами
df_job['Role'] = df_job['Role'].map(role_dict)
# --------------------------'Job Portal'-------------------------
# Создаем словарь для отображения уникальных значений в числовые идентификаторы
jp_dict = {jp: i for i, jp in enumerate(df_job['Job Portal'].unique())}
# Заменяем значения в столбце "Job Portal" соответствующими числовыми идентификаторами
df_job['Job Portal'] = df_job['Job Portal'].map(jp_dict)
# --------------------------'Company'-------------------------
# Создаем словарь для отображения уникальных значений в числовые идентификаторы
comp_dict = {comp: i for i, comp in enumerate(df_job['Company'].unique())}
# Заменяем значения в столбце "Company" соответствующими числовыми идентификаторами
df_job['Company'] = df_job['Company'].map(comp_dict)
# --------------------------'Company Profile'-------------------------
df_company_profile = df_job['Company Profile'].str.split('",', expand=True)
df_company_profile.columns = ['Sector', 'Industry', 'City', 'State', 'Zip', 'Website', 'Ticker', 'CEO']
df_company_profile = df_company_profile.apply(
lambda x: x.str.replace('{', '').str.replace('"', '').str.replace('}', '')
.str.replace('Sector', '').str.replace('Industry', '').str.replace('City', '')
.str.replace('State', '').str.replace('Zip', '').str.replace('Website', '')
.str.replace('Ticker', '').str.replace('CEO', '').str.replace(':', ''))
df_company_profile.drop(["CEO", "Website", "Zip"], axis=1, inplace=True)
# --------------------------'Sector'-------------------------
# Создаем словарь для отображения уникальных значений в числовые идентификаторы
comp_dict = {sector: i for i, sector in enumerate(df_company_profile['Sector'].unique())}
# Заменяем значения в столбце "Sector" соответствующими числовыми идентификаторами
df_company_profile['Sector'] = df_company_profile['Sector'].map(comp_dict)
# --------------------------'Industry'-------------------------
# Создаем словарь для отображения уникальных значений в числовые идентификаторы
comp_dict = {industry: i for i, industry in enumerate(df_company_profile['Industry'].unique())}
# Заменяем значения в столбце "Industry" соответствующими числовыми идентификаторами
df_company_profile['Industry'] = df_company_profile['Industry'].map(comp_dict)
# --------------------------'City'-------------------------
# Создаем словарь для отображения уникальных значений в числовые идентификаторы
comp_dict = {city: i for i, city in enumerate(df_company_profile['City'].unique())}
# Заменяем значения в столбце "City" соответствующими числовыми идентификаторами
df_company_profile['City'] = df_company_profile['City'].map(comp_dict)
# --------------------------'State'-------------------------
# Создаем словарь для отображения уникальных значений в числовые идентификаторы
comp_dict = {state: i for i, state in enumerate(df_company_profile['State'].unique())}
# Заменяем значения в столбце "State" соответствующими числовыми идентификаторами
df_company_profile['State'] = df_company_profile['State'].map(comp_dict)
# --------------------------'Ticker'-------------------------
# Создаем словарь для отображения уникальных значений в числовые идентификаторы
comp_dict = {ticker: i for i, ticker in enumerate(df_company_profile['Ticker'].unique())}
# Заменяем значения в столбце "Ticker" соответствующими числовыми идентификаторами
df_company_profile['Ticker'] = df_company_profile['Ticker'].map(comp_dict)
# Объединение преобразованных столбцов с исходным датасетом
df_job = pd.concat([df_job, df_company_profile], axis=1)
# --------------------------'Job Posting Date'-------------------------
df_job[['year', 'month', 'day']] = df_job['Job Posting Date'].str.split('-', expand=True)
df_job['year'] = pd.to_numeric(df_job['year'])
df_job['month'] = pd.to_numeric(df_job['month'])
df_job['day'] = pd.to_numeric(df_job['day'])
# --------------------------'Benefits'-------------------------
df_job['Benefits'] = df_job['Benefits'].str.replace('{', '').str.replace('}', '')
# Применить метод get_dummies для оцифровки столбца 'Benefits'
benefits_encoded = pd.get_dummies(df_job['Benefits'], dtype=int)
# Соединить исходный DataFrame с оцифрованными данными
df_job = pd.concat([df_job, benefits_encoded], axis=1)
# --------------------------'skills'-------------------------
# Создаем словарь для отображения уникальных значений в числовые идентификаторы
comp_dict = {skill: i for i, skill in enumerate(df_job['skills'].unique())}
# Заменяем значения в столбце "skills" соответствующими числовыми идентификаторами
df_job['skills'] = df_job['skills'].map(comp_dict)
df_job.drop(["Company Profile", "Experience", "Salary Range", "Benefits", "Job Posting Date"], axis=1, inplace=True)
print(df_job.dtypes)
df_job.to_csv('D:/Интеллектуальные информационные системы/Dataset/updated_job_descriptions.csv', index=False)
def decision_tree_classifier():
data = pd.read_csv('D:/Интеллектуальные информационные системы/Dataset/updated_job_descriptions.csv')
corr = data[['location', 'Country', 'Work Type', 'Company Size', 'Preference', 'Job Title', 'Role', 'Job Portal', 'skills', 'Company', 'Min Experience', 'Max Experience', 'Min Salary',
'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'"]]
print(corr.head())
# определение целевой переменной
y = data['Qualifications']
# Разделение данных на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(corr.values, y.values, test_size=0.2)
# Создание экземпляра классификатора дерева решений
clf = DecisionTreeClassifier(random_state=241)
# Обучение модели на обучающей выборке
clf.fit(X_train, y_train)
# Прогнозирование классов для тестовой выборки
y_pred = clf.predict(X_test)
importances = clf.feature_importances_
print("Важность признаков: ")
print(importances)
print("Отсортированная важность признаков: ")
conversion_ratings(importances)
def conversion_ratings(rank):
column_names = ['location', 'Country', 'Work Type', 'Company Size', 'Preference', 'Job Title', 'Role', 'Job Portal', 'skills', 'Company', 'Min Experience', 'Max Experience', 'Min Salary',
'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'"]
ranks = dict()
ranks = np.abs(rank)
minmax = MinMaxScaler()
ranks = minmax.fit_transform(np.array(ranks).reshape(33, 1)).ravel() # - преобразование данных
ranks = map(lambda x: round(x, 2), ranks) # - округление элементов массива
my_dict = dict(zip(column_names, ranks))
sorted_dict = dict(sorted(my_dict.items(), key=lambda x: x[1], reverse=True))
print(sorted_dict)
if __name__ == '__main__':
#data_preprocessing()
decision_tree_classifier()