[英]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 Type
, Hour Created
和Day 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()
确保正确进行伪编码的一种方法是将列转换为str
类型。 在您的情况下,尽管本质上是数字型的,但您希望将“ Hour Created
视为类别,因此最好在进行虚拟编码之前将它们转换为字符串。
为了捕获Day of Week
和Hour Created
之间的交互作用,请进行要素工程设计,并通过乘以Day of Week
和Hour Created
自己的要素,并将其作为模型的输入。
为了理解/解释您的模型,您可以查看不同特征的权重/系数,从而了解每个特征如何正面或负面地影响目标变量。
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个数据点。
回答你的问题
你可以找出y_intercept
使用reg.intercept_
是的,您可以使用reg.predict(x)
插入x的新值并获取目标变量,其中x是您的新输入。
OLS
和sklearn
进行的回归是相同的 。 OLS只是解决我们回归中的优化问题的一种方法。
希望这可以帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.