Ну, в вашем вопросе много недостающей информации, например, будет гораздо яснее, если вы предоставите все имеющиеся у вас функции, но позвольте мне высказать некоторые предположения!
ML Моделирование в классификации всегда требует работы с числовыми входами, и вы можете легко вывести каждый из уникальных входных данных как целое число, особенно классы!
Теперь позвольте мне ответить на ваши вопросы:
- Как мне разработать учебный набор для моей модели логистической регрессии.
На мой взгляд, у вас есть два варианта ( не обязательно, оба практичны, это вы должны решать в соответствии с вашим набором данных и проблемой ), либо вы прогнозируете вероятность всех сотрудников в компания, которая будет выходить в определенный день в соответствии с имеющимися у вас историческими данными (т.е. предыдущими наблюдениями), в этом случае каждый сотрудник будет представлять класс ( целое число от 0 до числа сотрудников, которое вы хотите включить ). Или вы создаете модель для каждого сотрудника, в этом случае классы будут либо выключены (т.е. оставить), либо включены (т.е. присутствовать).
Пример 1
Я создал пример набора данных из 70 дел и 4 сотрудников, который выглядит следующим образом:
Здесь каждое имя связано с днем и месяцем, который они сняли, относительно того, сколько им осталось ежегодных листьев!
Реализация (с использованием Scikit-Learn ) будет выглядеть примерно так ( N.B дата содержит только день и месяц ):
Теперь мы можем сделать что-то вроде этого:
import math
import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV, RepeatedStratifiedKFold
# read dataset example
df = pd.read_csv('leaves_dataset.csv')
# assign unique integer to every employee (i.e. a class label)
mapping = {'Jack': 0, 'Oliver': 1, 'Ruby': 2, 'Emily': 3}
df.replace(mapping, inplace=True)
y = np.array(df[['Name']]).reshape(-1)
X = np.array(df[['Leaves Left', 'Day', 'Month']])
# create the model
parameters = {'penalty': ['l1', 'l2'], 'C': [0.1, 0.5, 1.0, 10, 100, 1000]}
lr = LogisticRegression(random_state=0)
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=2, random_state=0)
clf = GridSearchCV(lr, parameters, cv=cv)
clf.fit(X, y)
#print(clf.best_estimator_)
#print(clf.best_score_)
# Example: probability of all employees who have 10 days left today
# warning: date must be same format
prob = clf.best_estimator_.predict_proba([[10, 9, 11]])
print({'Jack': prob[0,0], 'Oliver': prob[0,1], 'Ruby': prob[0,2], 'Emily': prob[0,3]})
Результат
{'Ruby': 0.27545, 'Oliver': 0.15032,
'Emily': 0.28201, 'Jack': 0.29219}
N.B
Чтобы заставить относительно работать, вам нужен действительно большой набор данных!
Также это может быть лучше, чем второе, если в наборе данных есть другие информативные функции (например, состояние работника в этот день и т. Д.).
Второй вариант - создать модель для каждого сотрудника, здесь результат будет более точным и надежным, однако, если у вас слишком много сотрудников, это почти кошмар!
Для каждого сотрудника вы собираете все его отпуска за прошедшие годы и объединяете их в один файл, в этом случае вам необходимо заполнить все дни года, другими словами: за каждый день, когда этот сотрудник никогда не снимал его , этот день должен быть помечен как на (или численно говоря 1), а в выходные дни они должны быть помечены как off ( или численно говоря 0).
Очевидно, что в этом случае классы будут 0 и 1 (т.е. включаться и выключаться) для модели каждого сотрудника!
Например, рассмотрим этот пример набора данных для конкретного сотрудника Джек :
Пример 2
Тогда вы можете сделать, например:
import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV, RepeatedStratifiedKFold
# read dataset example
df = pd.read_csv('leaves_dataset2.csv')
# assign unique integer to every on and off (i.e. a class label)
mapping = {'off': 0, 'on': 1}
df.replace(mapping, inplace=True)
y = np.array(df[['Type']]).reshape(-1)
X = np.array(df[['Leaves Left', 'Day', 'Month']])
# create the model
parameters = {'penalty': ['l1', 'l2'], 'C': [0.1, 0.5, 1.0, 10, 100, 1000]}
lr = LogisticRegression(random_state=0)
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=2, random_state=0)
clf = GridSearchCV(lr, parameters, cv=cv)
clf.fit(X, y)
#print(clf.best_estimator_)
#print(clf.best_score_)
# Example: probability of the employee "Jack" who has 10 days left today
prob = clf.best_estimator_.predict_proba([[10, 9, 11]])
print({'Off': prob[0,0], 'On': prob[0,1]})
Результат
{'On': 0.33348, 'Off': 0.66651}
N.B в этом случае вы должны создать набор данных для каждого сотрудника + специальную модель обучения + заполнить все дни, которые никогда не были за последние годы выходными!
- В моем тренировочном наборе я обнаружил, что некоторые переменные непрерывно уменьшаются (например, не осталось листьев). Будет ли это создать какие-либо проблемы,
потому что я знаю, постоянно растущие или убывающие переменные
используется в линейной регрессии. Это правда?
Что ж, ничто не мешает вам использовать спорные значения в качестве признаков ( например, количество листьев ) в логистической регрессии; на самом деле это не имеет никакого значения, если он используется в линейной или логистической регрессии, но я думаю, что вы запутались между функциями и реакцией :
Дело в том, что дискретные значения должны использоваться в ответе Логистической регрессии, а непрерывные значения должны использоваться в ответе линейной регрессии (она же зависимая переменная или y
).