Прогноз зарплаты по описанию вакансии

01.03.2016 916
Количество просмотров
#Разработка

Интернет буквально бурлит обсуждениями больших данных (big data) и блокчейн (blockchain), но к сожалению 90% “экспертов” не имеют отношения к подобным проектам. Наше кредо - не пускать пустых слов на ветер, а работат, засучив рукава. Все эти термины не очень интересны без реального применения. Обработка больших данных не эфемерное понятие, о котором можно судачить 3 часа с кружкой пива - это обязательный процесс в больших проектах, мы любим такие проекты, мы решаем поставленные задачи, мы делаем дело - посмотрите наши кейсы. Отдельно ознакомьтесь с технологией на нашей странице о блокчейн, будьте уверены 99% статей в интернете по этой тематике - пустая брехня.

 

Решение реальных задач требует квалификации. Обучение - один из важнейших процессов в нашей компании, если ты не узнаешь нового - ты остановился и  покроешься пылью. Наш разработчик по большим данным Сергеев Влад, как раз проходит обучение в Школе Аналитики Данных Яндекса. Он рассказал нам о решении интересной задаче - Прогноз зарплаты по описанию вакансии, дадим ему слово:

 

"Всем, привет! Меня зовут Сергеев Влад, я работаю разработчиком в компании Арт Проект и в данный момент учусь в ШАД Яндекс. На последнем семинаре мы разбирали очень интересную задачу, британская рекрутинговая компания хотела создать движок, который бы по описанию вакансии, либо оценивая резюме соискателя, мог бы выдавать прогноз по зарплате. 

Машина по предсказанию зарплатыПредставьте себе, что вы ищите работу. Вы просматриваете кучу вакансий. Согласитесь, просмотрев требования к кандидату и условия, у вас в голове уже есть ориентир зарплаты, за которую бы вы согласились на эту работу? Конечно же при полном соответствии квалификации, но это мы оставим на совесть самих соискателей. Справедлива и обратная задача, компания, оценивая резюме кандидата, примерно представляет, сколько она готова платить (или не платить) человеку с указанной квалификацией.

Пример обработки резюме

Так вот, а что если научить машину предугадывать зарплату по описанию и требованиям вакансии?! Оказывается - это дело техники. Главное иметь качественную выборку для обучения. Такая выборка должна быть репрезентативной - иметь десятки тысяч реальных объявлений с описанием и требованием и итоговой заплатой. Уже по такой выборке, можно качественно обучить модель. Останется лишь сообщить модели вакансии, которые мы хотим оценить и она предскажет нам зарплату. Кажется не сильно сложно, не правда ли!?

 

Линейные методы хорошо подходят для работы с данными у которых есть пропуски, либо не заполнены некоторые признаки — к таковым как раз относятся тексты. Это можно объяснить высокой скоростью обучения и небольшим количеством параметров, благодаря чему удается избежать переобучения.

Описание линейной модели

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

Отображение данных

Где, FullDescription - это описание вакансии и требования к кандидату;
LocationNormalized - город, где расположения компания-наниматель;
ContractTime - полная/частичная занятость;
SalaryNormalized - зарплата за год;

Ранжирование слов в текстах вакансий по важности проведем по методу TF-IDF.

Из Вики:
TF-IDF (от англ. TF — term frequency, IDF — inverse document frequency)
 — статистическая мера, используемая для оценки важности слова 
в контексте документа, являющегося частью коллекции документов 
или корпуса. Вес некоторого слова пропорционален количеству 
употребления этого слова в документе, и обратно пропорционален 
частоте употребления слова в других документах коллекции.

 В качестве инструмента выбран python с библиотеками SciPy, Nympy, Scikit-Learn и pandas, это продиктовано легкостью использования вместе с функциональной мощью.

 

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

data['FullDescription'] = data['FullDescription']
       .apply(lambda x: re.sub('[^a-zA-Z0-9]', ' ', x.lower()))

Далее заменим пропущенные данные на кодовую строку, например ‘nd’.

data['LocationNormalized'].fillna('nd', inplace=True)
data['ContractTime'].fillna('nd', inplace=True)

Применим метод TF-IDF для преобразования текстов в векторы признаков.

vectorizer=TfidfVectorizer(input='content', encoding='utf-8', 
decode_error='strict', strip_accents=None, lowercase=True, 
preprocessor=None, tokenizer=None, analyzer='word', 
stop_words=None, min_df=6)
X_train=vectorizer.fit_transform(data['FullDescription'])

Признаки LocationNormalized и ContractTime делят нашу выборку вакансий на категории, указывая соответствие вакансии город работы и тип занятости. Типичный подход к их обработке — кодирование категориального признака с m возможными значениями с помощью m бинарных признаков. Каждый бинарный признак соответствует одному из возможных значений категориального признака и является индикатором того, что на данном объекте он принимает данное значение. Данный подход иногда называют one-hot-кодированием. Воспользуйтесь им, чтобы перекодировать признаки.

enc = DictVectorizer()
X_train_categ = enc.fit_transform(data[['LocationNormalized',
'ContractTime']].to_dict('records'))

Для предсказания целевой переменной мы будем использовать гребневую регрессию, которая реализована в классе sklearn.linear_model.Ridge. Необходимо обучить нашу модель регрессии на исходной выборке. Целевой переменной для нас является столбец с зарплатой - SalaryNormalized. То есть мы говорим машине: построй модель зависимости зарплаты от сведений о вакансии. Найди и оцени влияние ключевых слов в описании вакансии на итоговый оклад.

from sklearn.linear_model import Ridge
clf = Ridge(alpha=1.0,fit_intercept=False, solver='lsqr')
clf.fit(stacked_data, data['SalaryNormalized'])

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

x_prediction = clf.predict(test_vacancies)
print(x_prediction)

>>33000

 

Вуаля! Модель работает!"

 

Как видно, машинное обучение может выполнять важные прикладные задачи. Особенно интересными являются модели, которые стараются предсказать людские поведенческие факторы и поступки. Мы еще вернемся к этой теме…

 

Есть вопросы или предложения - не стесняясь, пишите нам!
Подписывайтесь, чтобы получать свежие статьи себе на электронную почту!

 

 

Понравилось? Подпишись на обновления!

Мы страемся публиковать в данном разделе только полезный и уникальный контент для рынка. По этому подпишись и ты будешь первым, кто получит уведомление о свежей публикации
Нам будет приятно, если вы захотите подписаться на обновления наших проектов
Вы успешно подписались на уведомление об обновлениях.
Пожалуйста, укажите своё имя:
Нам очень приятно, что вы проявили интерес!