使用星期几、一天中的小时数和媒体类型创建回归模型?
Creating a regression model using Day of Week, Hour of Day, and Type of Media?
在 Jupyter
笔记本中使用 Python 3。我正在尝试创建一个回归模型(方程式?)来预测 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
,但我不确定我是否正确地创建了 dummy variables
- 问题特别在于 Hour Created
变量。它们是数字,但我希望将它们视为类别。例如,第 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 作为关注者的百分比作为列 header,我什至不确定它试图预测什么......
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
相乘并创建您自己的特征将其作为模型的输入。
为了 understand/interpret 您的模型,您可以查看 weights/coefficients 不同的特征,从而了解每个特征如何对您的目标变量产生积极或消极的影响.
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 个数据点。
回答您的问题
您可以使用 reg.intercept_
找出 y_intercept
是的,您可以为 x 插入新值并使用 reg.predict(x)
获取目标变量,其中 x 是您的新输入。
OLS
和 sklearn
所做的回归是一个和 same。 OLS 只不过是解决我们在回归中遇到的优化问题的一种方法。
希望对您有所帮助!
在 Jupyter
笔记本中使用 Python 3。我正在尝试创建一个回归模型(方程式?)来预测 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
,但我不确定我是否正确地创建了 dummy variables
- 问题特别在于 Hour Created
变量。它们是数字,但我希望将它们视为类别。例如,第 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 作为关注者的百分比作为列 header,我什至不确定它试图预测什么......
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
相乘并创建您自己的特征将其作为模型的输入。为了 understand/interpret 您的模型,您可以查看 weights/coefficients 不同的特征,从而了解每个特征如何对您的目标变量产生积极或消极的影响.
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 个数据点。
回答您的问题
您可以使用
reg.intercept_
找出 是的,您可以为 x 插入新值并使用
reg.predict(x)
获取目标变量,其中 x 是您的新输入。OLS
和sklearn
所做的回归是一个和 same。 OLS 只不过是解决我们在回归中遇到的优化问题的一种方法。
y_intercept
希望对您有所帮助!