好吧,您的问题中缺少很多信息,例如,如果您提供了您拥有的所有功能,它会变得更加清晰,但是让我敢于提出一些假设!
分类中的 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}
注意
要让这个相对工作,你需要一个真正的大数据集!
如果数据集中还有其他信息性特征(例如员工当天的健康状况等),这也可能比第二个更好.
第二种选择是为每个员工创建一个模型,这里的结果会更准确,更可靠,但是如果员工太多,这几乎是一场噩梦!
对于每个员工,您收集他们过去几年的所有休假并将它们连接到一个文件中,在这种情况下,您必须完成一年中的所有天数,换句话说:对于该员工从未休假的每一天,那一天应该标记为 on(或数字上来说是 1),而对于休息日,它们应该标记为 off(或从数字上讲是 0)。
显然,在这种情况下,每个员工的模型的类将是 0 和 1(即打开和关闭)!
例如,考虑这个特定员工 Jack 的数据集示例:
示例 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}
注意在这种情况下,您必须为每个员工创建一个数据集 + 培训特殊模型 + 将过去几年中从未有过的所有日子都填满!
- 在我的训练集中,我发现一些变量在不断减少(例如剩下的叶子数)。会不会造成任何问题,
因为我知道不断增加或减少的变量是
用于线性回归。这是真的吗?
嗯,没有什么可以阻止您在逻辑回归中使用有争议的值作为特征(例如叶子数);实际上,如果在线性或逻辑回归中使用它并没有任何区别,但我相信你对 features 和 response 感到困惑:
问题是,逻辑回归的响应中应使用离散值,响应中应使用连续值> 的线性回归(又名因变量或y)。