Создание регрессионной модели с использованием дня недели, часа дня и типа носителя? - PullRequest
0 голосов
/ 06 июля 2019

Работа с 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)

Если бы кто-то мог помочь с проблемой Создания часа, это было бы отличным началом ... А потом, не уверен, куда идти дальше. Я видел, как люди используют функцию ols в этой ситуации. Или linear_model от sklearn. Я борюсь с тем, как интерпретировать результаты обоих, и особенно борюсь с тем, как бы я включил в эту модель фрейм данных этих 3 независимых переменных. Если кто-то может сделать предложение, я постараюсь использовать его.

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

3 голосов
/ 06 июля 2019
  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 - это не что иное, как способ решения проблемы оптимизации, которую мы имеем в регрессии.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...