繁体   English   中英

使用星期几,一天中的小时和媒体类型创建回归模型?

[英]Creating a regression model using Day of Week, Hour of Day, and Type of Media?

Jupyter笔记本中使用Python 3。 我正在尝试创建一个回归模型(等式)以预测Eng as % of Followers变量的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变量。 它们是数字,但我希望将它们视为类别。 例如,Hour 22可能会提高性能,但这并不意味着有关21或23小时。

我也很好奇我是否可以在“ Day of Week和“ Hour 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)

如果有人可以解决“小时创造”的问题,那将是一个不错的开始。...然后,不确定从那里去哪里。 我已经看到人们在这种情况下使用ols函数。 或来自sklearn的linear_model。 我在如何解释其中任何一个的结果上苦苦挣扎,尤其是在如何将这3个独立变量的数据框插入该模型的过程中苦苦挣扎。 如果有人可以提出建议,我会尝试解决。

编辑:包括我尝试创建此模型的几种方法。 这是第一个,我假设使用的小时数据不正确。 而且由于我要传递给它的数据帧甚至没有Eng作为跟随者的百分比作为列标题,所以我什至不确定它要预测什么。

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() 
  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. 你可以找出y_intercept使用reg.intercept_

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

  3. OLSsklearn进行的回归是相同的 OLS只是解决我们回归中的优化问题的一种方法。

希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM