Логистическая регрессия с нецелым значением функции - PullRequest
0 голосов
/ 09 ноября 2018

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

Давайте рассмотрим следующий пример:

Я хочу построить модель, чтобы предсказать, уйдет ли сегодня какой-то конкретный человек или нет. Исходя из моих исторических данных, я могу найти следующие функции полезными для построения тренировочного набора.

Имя человека, День недели, Количество листьев, оставленных ему до сих пор (что может быть непрерывной убывающей переменной) и т. Д.

Итак, вот следующие вопросы, основанные на выше

  1. Как мне разработать учебный набор для моей модели логистической регрессии.

  2. В моем тренировочном наборе я обнаружил, что некоторые переменные постоянно уменьшаются (например, не осталось листьев). Будет ли это создавать какие-либо проблемы, потому что я знаю, что постоянно растущие или убывающие переменные используются в линейной регрессии. Это правда?

Любая помощь очень ценится. Спасибо!

1 Ответ

0 голосов
/ 09 ноября 2018

Ну, в вашем вопросе много недостающей информации, например, будет гораздо яснее, если вы предоставите все имеющиеся у вас функции, но позвольте мне высказать некоторые предположения!


ML Моделирование в классификации всегда требует работы с числовыми входами, и вы можете легко вывести каждый из уникальных входных данных как целое число, особенно классы!


Теперь позвольте мне ответить на ваши вопросы:

  1. Как мне разработать учебный набор для моей модели логистической регрессии.

На мой взгляд, у вас есть два варианта ( не обязательно, оба практичны, это вы должны решать в соответствии с вашим набором данных и проблемой ), либо вы прогнозируете вероятность всех сотрудников в компания, которая будет выходить в определенный день в соответствии с имеющимися у вас историческими данными (т.е. предыдущими наблюдениями), в этом случае каждый сотрудник будет представлять класс ( целое число от 0 до числа сотрудников, которое вы хотите включить ). Или вы создаете модель для каждого сотрудника, в этом случае классы будут либо выключены (т.е. оставить), либо включены (т.е. присутствовать).

Пример 1

Я создал пример набора данных из 70 дел и 4 сотрудников, который выглядит следующим образом:

dataset 1

Здесь каждое имя связано с днем ​​и месяцем, который они сняли, относительно того, сколько им осталось ежегодных листьев!

Реализация (с использованием 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

dataset 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 в этом случае вы должны создать набор данных для каждого сотрудника + специальную модель обучения + заполнить все дни, которые никогда не были за последние годы выходными!


  1. В моем тренировочном наборе я обнаружил, что некоторые переменные непрерывно уменьшаются (например, не осталось листьев). Будет ли это создать какие-либо проблемы, потому что я знаю, постоянно растущие или убывающие переменные используется в линейной регрессии. Это правда?

Что ж, ничто не мешает вам использовать спорные значения в качестве признаков ( например, количество листьев ) в логистической регрессии; на самом деле это не имеет никакого значения, если он используется в линейной или логистической регрессии, но я думаю, что вы запутались между функциями и реакцией :

Дело в том, что дискретные значения должны использоваться в ответе Логистической регрессии, а непрерывные значения должны использоваться в ответе линейной регрессии (она же зависимая переменная или y).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...