【问题标题】:Creating a regression model using Day of Week, Hour of Day, and Type of Media?使用星期几、星期几和媒体类型创建回归模型?
【发布时间】:2019-11-16 13:52:19
【问题描述】:

Jupyter 笔记本中使用 Python 3。我正在尝试创建一个回归模型(方程?)来预测 Eng as % of Followers 变量。我会得到Media TypeHour CreatedDay of Week。这些都应该被视为分类变量。

这是我过去的一些数据。

    Media Type  Eng as % of Followers   Hour Created    Day of Week
0   Video   0.0136  23  Tuesday
1   Video   0.0163  22  Wednesday
2   Video   0.0163  22  Tuesday
3   Video   0.0196  22  Friday
4   Video   0.0179  20  Thursday
5   Photo   0.0087  14  Wednesday

我已经使用pd.get_dummies 创建了dummy variables,但我不确定我是否正确 - 问题出在Hour Created 变量上。它们是数字,但我希望它们被视为类别。例如,第 22 小时可能会提高性能,但这并不意味着第 21 小时或第 23 小时。

我也很好奇我是否可以在 Day of WeekHour Created 之间的交互中使用我的模型因素(也许 22 小时在大多数情况下是一个推动因素,但 22-周五会导致下降)就像我看到的那样完成了 patsy... 但那可能是我变得贪婪了。

这是我创建虚拟变量的方法,这使我能够解决将Hour Created 作为定量变量而不是定性变量的问题。此外,我现在使用的 Vars 数据框并没有我想要预测的东西。这可能是对的吗?

Vars = Training[['Hour Created','Day of Week','Media Type']]
Result = Training['Eng as % of Followers']
Vars = pd.get_dummies(data=Vars, drop_first=True)

如果有人可以帮助解决 Hour Created 问题,那将是一个很好的开始......然后,不知道从那里去哪里。我见过人们在这种情况下使用 ols 功能。或者来自 sklearn 的 linear_model。我正在为如何解释两者的结果而苦苦挣扎,尤其是在如何将这 3 个自变量的数据框插入该模型中。如果有人可以提出建议,我会尝试执行。

编辑: 包括我尝试创建此模型的几种方法。这是第一个,我假设它错误地使用了我的 Hour 数据。由于我传递给它的数据框甚至没有 Eng as % of Followers 作为列标题,我什至不确定它试图预测什么......

Vars_train, Vars_test, Result_train, Result_test = train_test_split(Vars, Result, test_size = .20, random_state = 40)
regr = linear_model.LinearRegression() 
regr.fit(Vars_train, Result_train)
predicted = regr.predict(Vars_test)

当我尝试如下使用 ols 方法时,我得到一个无效的语法错误。我尝试了不同的变化无济于事。

fit1 = ols('Eng as % of Followers ~ C(Day of Week) + C(Hour Created) + C(Media Type)', data=Training).fit() 

【问题讨论】:

  • 您使用的是 Python 2 还是 Python 3?另请粘贴您收到的完整错误消息。
  • Python 3. 已编辑。
  • 请完整复制并粘贴错误信息。

标签: python regression categorical-data dummy-variable


【解决方案1】:
  1. 确保正确进行虚拟编码的一种方法是将列转换为str 类型。在您的情况下,您希望将 Hour Created 视为分类,尽管它本质上是数字,因此最好在进行虚拟编码之前将它们转换为字符串。

  2. 为了捕获 Day of WeekHour Created 之间的交互,进行特征工程并通过将 Day of WeekHour Created 相乘来创建您自己的特征,并将其作为输入提供给您的模型。

  3. 为了理解/解释您的模型,您可以查看不同特征的权重/系数,从而了解每个特征如何正面或负面地影响您的目标变量。

import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

df 

Media   Type    Eng_as_%_of_Followers   Hour_Created    Day_of_Week
0   0   Video   0.0136                  23              Tuesday
1   1   Video   0.0163                  22              Wednesday
2   2   Video   0.0163                  22              Tuesday
3   3   Video   0.0196                  22              Friday
4   4   Video   0.0179                  20              Thursday
5   5   Photo   0.0087                  14              Wednesday 

df["Hour_Created"] = df["Hour_Created"].astype(str)
df["Interaction"] = df["Hour_Created"] + "_" +df["Day_of_Week"] 

X = df.drop("Eng_as_%_of_Followers", axis=1)
Y = df["Eng_as_%_of_Followers"]

X_encoded = pd.get_dummies(X)

X_train, X_test, y_train, y_test = train_test_split(
    X_encoded, Y, test_size=0.33, random_state=42)

reg = LinearRegression().fit(X_train, y_train)

coef_dict = dict(zip(X_encoded.columns, reg.coef_))

coef_dict

{'Day_of_Week_Friday': 0.0012837455830388678,
 'Day_of_Week_Thursday': 0.0007424028268551229,
 'Day_of_Week_Tuesday': -0.0008084805653710235,
 'Day_of_Week_Wednesday': -0.0012176678445229678,
 'Hour_Created_14': -0.0012176678445229678,
 'Hour_Created_20': 0.0007424028268551229,
 'Hour_Created_22': 0.0004752650176678456,
 'Hour_Created_23': 0.0,
 'Interaction_14_Wednesday': -0.0012176678445229678,
 'Interaction_20_Thursday': 0.0007424028268551229,
 'Interaction_22_Friday': 0.0012837455830388678,
 'Interaction_22_Tuesday': -0.0008084805653710235,
 'Interaction_22_Wednesday': 0.0,
 'Interaction_23_Tuesday': 0.0,
 'Media': -0.0008844522968197866,
 'Type_Photo': -0.0012176678445229708,
 'Type_Video': 0.0012176678445229685}

当然,这里的结果可能不是很有趣,因为我只处理了 6 个数据点。

回答您的问题

  1. 您可以使用reg.intercept_找到y_intercept

  2. 是的,您可以为 x 插入新值并使用 reg.predict(x) 获取目标变量,其中 x 是您的新输入。

  3. OLSsklearn 完成的回归是1 和same。 OLS 只不过是解决我们在回归中遇到的优化问题的一种方法。

希望这会有所帮助!

【讨论】:

  • 非常感谢!不过,我在几件事上迷路了。 (1) 在哪里可以找到回归公式的 y 截距? (2) 然后我是否能够将值插入此回归模型以预测新的参与值百分比? (3) 这与 OLS 方法有多大不同(如果有的话) - 你知道为什么我的执行(在我的问题详细信息中)没有执行吗?错误显示:文件“”,第 1 行 C(创建时间)^ SyntaxError:无效语法
  • 如果您认为上述答案回答了您的问题,我请求您接受它作为经过验证的答案,以便它可以帮助其他可能会访问此问题的人。
猜你喜欢
  • 2015-05-13
  • 2022-08-10
  • 2013-12-31
  • 1970-01-01
  • 2013-01-09
  • 2011-08-23
  • 1970-01-01
  • 2016-10-22
  • 2021-06-29
相关资源
最近更新 更多