Множественная линейная регрессия с категориальными признаками с использованием sklearn - python - PullRequest
0 голосов
/ 03 ноября 2018

У меня есть набор данных, в котором каждому документу присвоен соответствующий балл / рейтинг

dataset = [
   {"text":"I don't like this small device", "rating":"2"},
   {"text":"Really love this large device", "rating":"5"},
   ....
]

Кроме того, у меня есть категория (переменная) списков терминов, извлеченных из text переменных из того же набора данных

x1 = [short, slim, small, shrink]
x2 = [big,huge,large]

Итак, как я могу сделать линейную регрессию с multiple independent variables в качестве списков слов ( или переменная, представляющая существование любого слова из соответствующего списка терминов, потому что каждый термин в списках уникален ) выше и dependent variable as a rating. Другими словами

как я могу оценить влияние списков терминов на рейтинг с помощью sklearn

Я использовал TfidfVectorizer для получения матрицы термина документа. Если возможно, предоставьте простой фрагмент кода или пример

1 Ответ

0 голосов
/ 03 ноября 2018

Учитывая обсуждение в комментариях, кажется, что интерпретация должна состоять в том, что каждый список определяет двоичную переменную, значение которой зависит от того, появляются ли какие-либо слова из списка в рассматриваемом тексте. Итак, давайте сначала изменим тексты так, чтобы слова действительно появлялись:

dataset = [
   {"text": "I don't like this large device", "rating": "2"},
   {"text": "Really love this small device", "rating": "5"},
   {"text": "Some other text", "rating": "3"}
]

Чтобы упростить нашу работу, мы затем загрузим эти данные во фрейм данных, изменим оценки на целые и создадим соответствующие переменные:

df = pd.DataFrame(dataset)
df['rating'] = df['rating'].astype(int)
df['text'] = df['text'].str.split().apply(set)
x1 = ['short', 'slim', 'small', 'shrink']
x2 = ['big', 'huge', 'large']
df['x1'] =  df.text.apply(lambda x: x.intersection(x1)).astype(bool)
df['x2'] =  df.text.apply(lambda x: x.intersection(x2)).astype(bool)

То есть на данный момент df является следующим фреймом данных:

   rating                                   text     x1     x2
0       2  {this, large, don't, like, device, I}  False   True
1       5    {this, small, love, Really, device}   True  False
2       3                    {other, Some, text}  False  False

С помощью этого мы можем создать соответствующую модель и проверить, каковы будут коэффициенты:

model = LinearRegression()
model.fit(df[['x1', 'x2']], df.rating)
print(model.coef_)  # array([ 2., -1.])
print(model.intercept_)  # 3.0

Как также упоминалось в комментариях, эта вещь будет давать не более четырех оценок, по одному для каждой из комбинаций x1 и x2, равных True или False. В этом случае просто так получается, что все возможные выходные данные являются целыми числами, но в общем случае они не должны быть и не должны ограничиваться интересующим интервалом. Учитывая порядковый характер рейтингов, это действительно случай некоторой порядковой регрессии (см., Например, mord ).

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