【问题标题】:Logistic Regression with Non-Integer feature value具有非整数特征值的逻辑回归
【发布时间】:2019-04-12 21:03:13
【问题描述】:

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

让我们考虑以下示例:

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

人名、星期几、到现在为止留给他的树叶数(可能是一个连续递减的变量)等。

所以这里是基于以上问题的以下问题

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

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

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

【问题讨论】:

  • 我认为这更像是数据科学堆栈交换datascience.stackexchange.com 的问题,因为您不需要代码方面的帮助。
  • 好的,我会把它贴在那里

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


【解决方案1】:

好吧,您的问题中缺少很多信息,例如,如果您提供了您拥有的所有功能,它会变得更加清晰,但是让我敢于提出一些假设!


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


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

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

我怎么看,你有两个选择(不一定都是实用的,你应该根据你拥有的数据集和问题来决定),要么你预测所有员工的概率根据您拥有的历史数据(即之前的观察)在某天将要下班的公司中,在这种情况下,每个员工将代表一个类(从 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}

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


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

嗯,没有什么可以阻止您在逻辑回归中使用有争议的值作为特征(例如叶子数);实际上,如果在线性或逻辑回归中使用它并没有任何区别,但我相信你对 features 和 response 感到困惑:

问题是,逻辑回归的响应中应使用离散值,响应中应使用连续值> 的线性回归(又名因变量或y)。

【讨论】:

  • 我得到了你的答案。对于这个用例,我可能选择了名称作为错误的功能。让我以这种方式重新表述我的问题 - 假设一个模型想要预测一个人的性别。选择的特征是名称和国家(有时同一个名字在不同的国家有不同的性别)。所以一个训练集(其中 y (i)= { 0 ,1} 和 X (i) = {somename, somecountry},对于第 i 个训练集),我将如何绘制图表以便我可以可视化决策边界?
  • 写到原始问题我想预测给定的名字 X(1),离开 X(2),第 X(3) 天这个人休假的概率是多少。但我知道在这种情况下,名称 X(1) 应该是类本身,或者我为每个名称构建了一个模型。
  • 完成。谢谢您的帮助。我读到了一种热编码作为解决上述问题的方法之一。
猜你喜欢
  • 2021-11-22
  • 2019-01-21
  • 2014-01-19
  • 2021-06-10
  • 1970-01-01
  • 2017-08-18
  • 2016-12-27
  • 1970-01-01
  • 2018-12-03
相关资源
最近更新 更多