具有非整数特征值的Logistic回归

时间:2018-11-09 09:42:38

标签: machine-learning regression linear-regression logistic-regression prediction

嗨,我正在学习Andrew Ng的机器学习课程。 我发现在回归问题中,特别是逻辑回归,他们使用整数值表示可以在图中绘制的特征。但是在很多情况下,特征值可能不是整数。

让我们考虑以下示例:

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

该人的姓名,星期几,到现在为止剩下的叶子数(这可能是一个连续递减的变量),等等。

这是基于上述的以下问题

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

  2. 在我的训练集中,我发现一些变量在不断减少(没有剩下的叶子)。这会造成任何问题,因为我知道线性回归中会使用不断增加或减少的变量。是真的吗?

我们非常感谢您的帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

嗯,您的问题中有很多遗漏的信息,例如,如果您提供了所有功能,就会更加清楚,但是我敢提出一些假设!


分类中的ML建模始终需要处理数字输入,并且您可以轻松地将每个唯一输入推断为整数,尤其是类!


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

  
      
  1. 如何为我的逻辑回归模型设计训练集。
  2.   

我如何看待,您有两个选择(都没有必要都是可行的,应该由您根据所拥有的数据集和问题来决定),或者您可以预测所有员工的概率在根据您拥有的历史数据(即以前的观察结果)在某天休假的公司中,在这种情况下,每位员工将代表一个班级(整数(从0到要包括的员工数量) )。 或者,您为每位员工创建一个模型,在这种情况下,课程将关闭(即请假)或打开(即当下)。

示例1

我创建了一个包含70个案例和 4 名员工的数据集示例,如下所示:

dataset 1

在这里,每个名字都与他们休假的日期和月份有关,这与剩下的年假有关!

实现(使用Scikit-Learn)将类似于以下内容( NB日期仅包含日期和月份):

现在我们可以执行以下操作:

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}

NB 要使此相对工作,您需要一个真正的大数据集!

如果数据集中还有其他 信息 功能(例如,当天员工的健康状况等),那么这可能比第二种更好。


第二种选择是为每个员工创建一个模型,这样结果会更准确,更可靠,但是,如果您有太多的员工,这几乎是一场噩梦!

对于每位员工,您都将过去几年中所有的叶子收集起来,并将它们合并为一个文件,在这种情况下,您必须完成一年中的所有工作日,换句话说:对于员工从未休假的每一天,则该天应标记为 on (或从数字上来说为1),休假日则应标记为 off < / strong>(或从数字上讲为0)。

很明显,在这种情况下,每个员工的模型的类别分别为 0 1 (即开和关)!

例如,考虑特定员工 Jack 的此数据集示例:

示例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}

NB ,在这种情况下,您必须为每个员工创建一个数据集+培训特殊模型+填补过去几年从未休假的所有日子!


  
      
  1. 在我的训练集中,我发现一些变量在不断减少(没有剩下的叶子)。那会带来什么问题吗?   因为我知道不断增加或减少变量是   用于线性回归。是真的吗?
  2.   

在Logistic回归中,没有什么可以阻止您使用有争议的值作为特征(例如,叶数);实际上,如果将其用于线性或逻辑回归并没有什么区别,但是我相信您在功能响应之间感到困惑:

问题是,在Logistic回归的 响应 中应使用离散值,在 响应中应使用连续值> (线性回归(也称为因变量或y)。