非整数特征值的逻辑回归

你好,我在跟随Andrew Ng的机器学习课程学习。我发现,在回归问题中,尤其是逻辑回归中,他们使用了整数值作为特征,这些特征可以绘制在图表上。但在很多情况下,特征值可能不是整数。

让我们考虑以下示例:

我想建立一个模型来预测某个人今天是否会请假。通过我的历史数据,我可能会发现以下特征有助于构建训练集。

人的姓名,星期几,他至今剩余的假期数量(这可能是一个持续减少的变量)等。

基于上述内容,以下是几个问题

  1. 我该如何设计我的逻辑回归模型的训练集?

  2. 在我的训练集中,我发现有些变量是持续减少的(例如剩余假期数量)。这会造成任何问题吗?因为我知道持续增加或减少的变量在线性回归中使用。这是真的吗?

任何帮助都非常感激。谢谢!


回答:

嗯,你的问题中缺少很多信息,例如,如果你提供了所有你拥有的特征,情况会更加清晰,但让我大胆地做一些假设吧!


分类中的机器学习建模总是需要处理数值输入,你可以很容易地将每个唯一的输入推断为整数,特别是类别!


现在让我尝试回答你的问题:

  1. 我该如何设计我的逻辑回归模型的训练集?

在我看来,你有两个选择(*并非都实用,你应该根据你拥有的数据集和问题来决定*),要么你根据历史数据(即之前的观察)预测公司中所有将在某一天休假的员工的概率,在这种情况下,每个员工将代表一个类别(*从0到你想要包含的员工数量的整数*)。*或者*你为每个员工创建一个模型,在这种情况下,类别将是休假(即请假)或上班(即出勤)。

示例1

我创建了一个包含70个案例和*4*个员工的数据集示例,看起来像这样:

dataset 1

这里每个名字都与他们休假的日期和月份相关联,显示他们剩余的年假数量!

实现(使用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

dataset 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}

注意在这种情况下,你必须为每个员工创建一个数据集 + 训练特定的模型 + 将过去几年从未休过的所有天数填充为休假!


  1. 在我的训练集中,我发现有些变量是持续减少的(例如剩余假期数量)。这会造成任何问题吗?因为我知道持续增加或减少的变量在线性回归中使用。这是真的吗?

嗯,没有什么能阻止你将连续值(*例如假期数量*)用作逻辑回归中的特征;实际上,无论是在线性回归还是逻辑回归中使用它都没有区别,但我相信你对*特征*和*响应*感到困惑了:

关键是,逻辑回归的*响应*(也称为依赖变量或y)应该使用离散值,而线性回归的*响应*应该使用连续值。

Related Posts

在使用k近邻算法时,有没有办法获取被使用的“邻居”?

我想找到一种方法来确定在我的knn算法中实际使用了哪些…

Theano在Google Colab上无法启用GPU支持

我在尝试使用Theano库训练一个模型。由于我的电脑内…

准确性评分似乎有误

这里是代码: from sklearn.metrics…

Keras Functional API: “错误检查输入时:期望input_1具有4个维度,但得到形状为(X, Y)的数组”

我在尝试使用Keras的fit_generator来训…

如何使用sklearn.datasets.make_classification在指定范围内生成合成数据?

我想为分类问题创建合成数据。我使用了sklearn.d…

如何处理预测时不在训练集中的标签

已关闭。 此问题与编程或软件开发无关。目前不接受回答。…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注