你好,我在跟随Andrew Ng的机器学习课程学习。我发现,在回归问题中,尤其是逻辑回归中,他们使用了整数值作为特征,这些特征可以绘制在图表上。但在很多情况下,特征值可能不是整数。
让我们考虑以下示例:
我想建立一个模型来预测某个人今天是否会请假。通过我的历史数据,我可能会发现以下特征有助于构建训练集。
人的姓名,星期几,他至今剩余的假期数量(这可能是一个持续减少的变量)等。
基于上述内容,以下是几个问题
-
我该如何设计我的逻辑回归模型的训练集?
-
在我的训练集中,我发现有些变量是持续减少的(例如剩余假期数量)。这会造成任何问题吗?因为我知道持续增加或减少的变量在线性回归中使用。这是真的吗?
任何帮助都非常感激。谢谢!
回答:
嗯,你的问题中缺少很多信息,例如,如果你提供了所有你拥有的特征,情况会更加清晰,但让我大胆地做一些假设吧!
分类中的机器学习建模总是需要处理数值输入,你可以很容易地将每个唯一的输入推断为整数,特别是类别!
现在让我尝试回答你的问题:
- 我该如何设计我的逻辑回归模型的训练集?
在我看来,你有两个选择(*并非都实用,你应该根据你拥有的数据集和问题来决定*),要么你根据历史数据(即之前的观察)预测公司中所有将在某一天休假的员工的概率,在这种情况下,每个员工将代表一个类别(*从0到你想要包含的员工数量的整数*)。*或者*你为每个员工创建一个模型,在这种情况下,类别将是休假(即请假)或上班(即出勤)。
示例1
我创建了一个包含70个案例和*4*个员工的数据集示例,看起来像这样:
这里每个名字都与他们休假的日期和月份相关联,显示他们剩余的年假数量!
实现(使用Scikit-Learn)会是这样的(*注意:日期仅包含日和月*):
现在我们可以这样做:
import mathimport pandas as pdimport numpy as npfrom sklearn.linear_model import LogisticRegressionfrom sklearn.model_selection import GridSearchCV, RepeatedStratifiedKFold# read dataset exampledf = 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 modelparameters = {'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 formatprob = 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}
注意要使这个*相对*有效,你需要一个真正大的数据集!
如果数据集中有其他*信息量大的*特征(例如,员工当天的健康状况等),这也可能比第二个选项更好。
第二个选项是为每个员工创建一个模型,在这种情况下,结果将更准确,更可靠,但如果员工数量太多,这几乎是一个噩梦!
对于每个员工,你收集他们过去几年所有的假期数据并将它们合并到一个文件中,在这种情况下,你必须补全一年中的所有日期,换句话说:对于员工从未休过的每一天,那天应该被标记为*上班*(或数值上讲为1),而对于休假的日子,它们应该被标记为*休假*(或数值上讲为0)。
显然,在这种情况下,每个员工的模型的类别将是*0*和*1*(即上班和休假)!
例如,考虑这个特定员工*Jack*的数据集示例:
示例2
然后你可以这样做,例如:
import pandas as pdimport numpy as npfrom sklearn.linear_model import LogisticRegressionfrom sklearn.model_selection import GridSearchCV, RepeatedStratifiedKFold# read dataset exampledf = 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 modelparameters = {'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 todayprob = clf.best_estimator_.predict_proba([[10, 9, 11]])print({'Off': prob[0,0], 'On': prob[0,1]})
结果
{'On': 0.33348, 'Off': 0.66651}
注意在这种情况下,你必须为每个员工创建一个数据集 + 训练特定的模型 + 将过去几年从未休过的所有天数填充为休假!
- 在我的训练集中,我发现有些变量是持续减少的(例如剩余假期数量)。这会造成任何问题吗?因为我知道持续增加或减少的变量在线性回归中使用。这是真的吗?
嗯,没有什么能阻止你将连续值(*例如假期数量*)用作逻辑回归中的特征;实际上,无论是在线性回归还是逻辑回归中使用它都没有区别,但我相信你对*特征*和*响应*感到困惑了:
关键是,逻辑回归的*响应*(也称为依赖变量或y
)应该使用离散值,而线性回归的*响应*应该使用连续值。