Создание регрессионной модели с использованием дня недели, часа дня и типа носителя?

Работа с Python 3 в блокноте Jupyter. Я пытаюсь создать модель регрессии (уравнение?), чтобы предсказать переменную 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

Я создал dummy variables с помощью pd.get_dummies, но я не уверен, что сделал это правильно - проблема именно в переменной Hour Created. Это числа, но я хочу, чтобы их рассматривали как категории. Например, 22-й час может повысить производительность, но это не должно говорить о 21-м и 23-м часах.

Мне также любопытно, могу ли я использовать свой модельный фактор во взаимодействии между Day of Week и Hour Created (возможно, 22-й час — это повышение в большинстве дней, но 22-пятница вызывает падение), как я видел с патси... но это может быть я получаю жадный.

Вот как я создал свои фиктивные переменные, что ставит меня перед проблемой использования 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 в этой ситуации. Или linear_model из sklearn. Я борюсь с тем, как интерпретировать результаты любого из них, и особенно борюсь с тем, как подключить фрейм данных этих трех независимых переменных к этой модели. Если кто-то может сделать предложение, я попытаюсь запустить его.

Редактировать: включая несколько способов, которыми я пытался создать эту модель. Вот первое, которое, как я предполагаю, неправильно использует мои данные Hour. И поскольку в кадре данных, который я передаю, даже нет 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() 

person Cornel Westside    schedule 06.07.2019    source источник
comment
Вы используете Python 2 или 3? Также, пожалуйста, вставьте полное сообщение об ошибке, которое вы получаете.   -  person FatihAkici    schedule 06.07.2019
comment
Python 3. Отредактировано.   -  person Cornel Westside    schedule 06.07.2019
comment
Пожалуйста, скопируйте и вставьте сообщение об ошибке полностью.   -  person FatihAkici    schedule 06.07.2019


Ответы (1)


  1. Один из способов убедиться, что вы правильно выполняете фиктивное кодирование, — преобразовать столбцы в типы str. В вашем случае вы хотите рассматривать Hour Created как категориальное, хотя оно носит числовой характер, поэтому лучше преобразовать их в строки, прежде чем выполнять фиктивное кодирование.

  2. Чтобы зафиксировать взаимодействие между Day of Week и Hour Created, выполните проектирование функций и создайте свою собственную функцию, умножив Day of Week и Hour 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. Да, вы можете подставить новые значения для x и получить целевую переменную, используя reg.predict(x), где x — ваш новый ввод.

  3. Регрессия, выполненная OLS и sklearn, является одной и одинаковой. OLS — это не что иное, как способ решения проблемы оптимизации, которую мы имеем в регрессии.

Надеюсь это поможет!

person Parthasarathy Subburaj    schedule 06.07.2019
comment
Цените это тонну! Я потерял на пару вещей, хотя. (1) Где я могу найти точку пересечения оси Y в моей формуле регрессии? (2) Смогу ли я затем вставить значения в эту регрессионную модель, чтобы предсказать новые значения % вовлеченности? (3) Насколько это отличается от метода OLS, если вообще отличается, и знаете ли вы, почему мое выполнение (в деталях моего вопроса) не выполняется? Ошибка гласит: Файл ‹неизвестен›, строка 1 C(час создания) ^ SyntaxError: неверный синтаксис - person Cornel Westside; 06.07.2019
comment
Если вы считаете, что приведенный выше ответ отвечает на ваши вопросы, я прошу вас принять его как проверенный ответ, чтобы он мог помочь другим, кто может посетить этот вопрос в будущем. - person Parthasarathy Subburaj; 07.07.2019