Запрос компании:

Я работал со стартапом, который привлекал удаленных сотрудников для выполнения сложных проектов, связанных с данными. В компании 100–200 сотрудников, на которых они в настоящее время полагаются в проектах, но есть еще несколько тысяч человек, которых они хотели бы привлечь в будущем. Следовательно, их метод ручного отбора команд для проектов в конечном итоге окажется непрактичным. Таким образом, целью проекта был задан набор проектов, пул потенциальных работников. Есть ли способ алгоритмически сопоставить работников с проектами?

Я разбил этот проект на 3 части:

1. Классификация навыков самоописания

У компании был набор из 30 формальных категорий проектов, таких как «Машинное обучение» и «Сбор данных». Однако люди записывали такие навыки, как «опыт работы с Python» или «опыт делового письма». Следовательно, мне нужно было классифицировать неструктурированный текст, используемый работниками, по этим 30 категориям.

Сначала я предварительно обработал и разбил текст на отдельные токены; разделение запятыми, переводом строки, вертикальной чертой, двоеточием и точкой с запятой. Такие фразы, как «например», «нравится», «включая» и «и» также были разделены. Стоп-слова были удалены, а оставшиеся слова выделены с помощью стеммера Snowball. Я выбрал стеммер Snowball, потому что он был менее агрессивен, чем стеммер Портера, который сокращал такие слова, как «создание», на «cr».

После предварительной обработки я сгруппировал 715 сгенерированных токенов, используя нечеткое сопоставление для измерения расстояния. Я также рассматривал возможность использования подхода с дистанционным редактированием, но дистанционное редактирование рассматривает такие фразы, как «microsoft word» и «ms word», как более далекие от нечеткого соответствия, которое рассматривает тот факт, что «слово» появляется в обеих фразах как информативное. Это сгенерировало список терминов, которые были отображены в сети на основе их совместного появления, приведенного ниже. Как видите, одни термины периферийны, а другие образуют плотный центр.

Затем я назначил эти жетоны и попросил компанию проверить, какой навык должен принадлежать к какой формальной категории. Следует отметить, что один навык может относиться к нескольким. Например, знание R поместит его как в «Машинное обучение», так и в «Исследовательский анализ данных».

Я создал активированный порогом классификатор K-ближайшего соседа с несколькими метками, используя существующие рабочие процессы в качестве обучающего набора. Классификатор присваивает метку новому токену, если K (3 в моем случае по умолчанию) ближайшие нечеткие совпадения слов имеют эту метку и этот порог расстояния превышает 75. Вот как он обрабатывает слова «numpy» и «3dsmax».

«Numpy» совпадает с «numpi», которое с оценкой 80 превышает пороговое значение 75 и имеет присвоенные ему ярлыки. Два других ближайших совпадения игнорируются. Для «3dsmax» все 3 ближайших совпадения игнорируются, потому что ни одно из них не достигает порогового значения. 3dsmax хранится в списке, который отслеживает неклассифицированные слова. Это связано с тем, что, если никакой токен обучающего набора не является близким к целевому токену, вполне вероятно, что это токен, который следует включить в обучающий набор.

Чтобы оценить, что обучающая выборка обоснованно классифицирована, я оценил среднее значение в пределах кластерного расстояния и сравнил его со средним значением между кластерным расстоянием. Сравнение этих двух приведено ниже.

• Соглашение о нечетком соответствии внутри категории: 94,6 + 12,42

• Соглашение о нечетком соответствии между категориями: 39.01 + 22.67

Я попросил компанию нанять 50 новых потенциальных сотрудников, чтобы оценить матрицу ошибок алгоритма. (Все еще ожидая ответа). Затем, классифицировав навыки, я занялся распределением людей по командам.

2. Организация команд

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

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

Входы: требования к проекту, зависимости задач, способности сотрудников и их доступность.

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

Для этого я построил 3 модели возрастающей сложности:

A. Первая модель игнорирует зависимости задач, то есть ситуации, когда одна задача должна быть завершена, прежде чем может начаться другая. Как на рисунке ниже. Модель довольно экономичная. Для матрицы ограничений размер столбца равен Число рабочих x Число задач, а количество строк - Число рабочих + Количество задач.

Б. Вторая модель включает зависимости, что требует учета неравенства, согласно которому более ранняя задача в цепочке должна быть выполнена раньше, чем более поздняя. Например: задача по анализу потенциальных клиентов может иметь следующую последовательность проектов.

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

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

C. Третья модель, помимо зависимостей задач, включает время начала и остановки рабочих для данной задачи. Матрица ограничений использует примерно вдвое больше столбцов модели 2 и такое же количество строк. Это гарантирует, что люди, которые лучше всего подходят для выполнения задачи позже в цепочке, но недоступны до завершения более ранних задач, не будут назначены задаче.

Чтобы дать представление о том, как выглядят эти модели, вот постановка задачи для третьей модели. Индекс i, относится к работнику i, а j, относится к задачам, а p , относится к цене за час. Требование - это объем работы, который необходимо выполнить над проектом, Задача относится к времени остановки для данной задачи, а способность указывает, насколько хорошо она может выполнить задачу. Наконец, start и stop относятся к времени запуска и остановки работника для данной задачи с start_min и stop_max относится к самому раннему времени начала и времени последней остановки работника.

На практике модель 2 оказалась наиболее подходящей для компании. Ограничение доступности, учтенное в модели 3, было на самом деле редкостью с точки зрения их реальных проектов. Однако реализованная модель требует знания индивидуальных способностей. Чтобы его можно было использовать, я предположил, что все обладают одинаковыми навыками, и использовал небольшую ошибку с плавающей запятой, чтобы создать разделители. Тем не менее, измерение фактического индивидуального выполнения этих задач было необходимо для того, чтобы модель могла быть использована наилучшим образом. Я обращаюсь к этому вопросу оценки способностей в следующем разделе.

3. Вывод навыков рабочего из рейтинга

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

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

  1. Надежность: разные оценщики будут по-разному оценивать то, что составляет 5 и 4. Для этого потребуется калибровка между кодировщиками, которая возможна только в том случае, если между оценщиками существует большая степень совпадения и с большим количеством данных. точки. Поскольку я предполагал, что вначале данных не будет, это снижает ценность таких оценок.
  2. Грубость. Люди часто испытывают трудности с присвоением количественных оценок качественной результативности при выполнении сложных задач, таких как исследования. Даже предполагая надежность оценщика, 1–5 баллов ограничивают производительность только этими 5 значениями.
  3. Уточнение. По мере сбора большего количества данных о работниках следует делать более точные выводы. В частности, чем больше данных было собрано, тем точнее можно было бы вывести объективную (то есть действительную) оценку способностей по данной задаче.

Вместо оценки я предложил вместо этого ранжировать индивидуальный вклад. Ранги менее подвержены перечисленным выше ограничениям. Даже если оценщики расходятся во мнениях, они обычно соглашаются с тем, кто показал лучший результат. Более того, людям удобнее ранжировать большие группы людей, чем ставить им баллы от 10 до 15. Что наиболее важно, математические свойства рангов позволяют делать более точные выводы о фактических способностях по мере того, как количество набираемых рангов увеличивается.

Звания не подлежат распределению, то есть не требуют каких-либо предположений относительно основного распределения талантов рабочих, за исключением того факта, что нет двух людей по-настоящему равных. Это означает, что можно определить лучших работников, не оценивая, на какой объем работы способен каждый работник. Например, мы можем определить, кто лучший программист, не зная, как быстро он кодирует.

Используя последовательность рангов рабочего в разных командах, можно сделать вывод, к какому квантилю или верхнему процентилю он или она, скорее всего, принадлежит. В частности, если основной истиной рабочего является то, что он входит в 10% лучших по сравнению со своими коллегами по задаче, то ранг, который он получает по конкретной задаче по сравнению с его коллегами, может быть определен заранее вероятностным образом.

Это делается путем вычисления P (R | Q), условной вероятности получения заданного ранга, R, относительно их истинного квантиля, Q, путем решения варианта биномиального распределения. Например, на рисунке ниже перечислены вероятности разных рангов, которые кто-то из верхнего квинтиля, как ожидается, получит в случайной команде из 10 человек.

С последовательностью рангов затем используется максимальное правдоподобие в последовательности для оценки наиболее вероятного квантиля человека. Чтобы оценить осуществимость этой стратегии, я рассчитал частоту ошибок этого метода, используя разное количество доступных рангов при попытке оценить квинтиль или дециль человека. Графики их ошибок приведены ниже.

Здесь мы видим улучшение ошибки после использования 5 рангов, но затем улучшение замедляется. Тем не менее, 5 рангов достаточно хороши для присвоения квинтиля с точностью 80%, и если кто-то оценивает лучшего исполнителя, показатель на самом деле составляет около 90%. Точно так же для децилей точность 5 рангов составляет 60%, а для верхнего дециля - 80%.

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

Резюме

Распределение людей по командам для большинства - несложная задача. Он заключается в том, чтобы знать, кто находится рядом, и сопоставлять их таланты с группами, которые в этом нуждаются. Алгоритмически процесс аналогичен, но требует некоторого приближения интуиции и здравого смысла. Когда входные данные известны, процесс становится механическим, но измерение этих входных данных, в частности, насколько «хороший» кто-то выполняет конкретную задачу, - это то место, где мы понимаем, что здравый смысл - это сложное дело.