我有一个数据集,每个文档都有一个对应的分数/评级
dataset = [ {"text":"我不喜欢这个小设备", "rating":"2"}, {"text":"我真的很喜欢这个大设备", "rating":"5"}, ....]
此外,我还从同一数据集的text
变量中提取了一个类别(变量)的术语列表
x1 = [short, slim, small, shrink]x2 = [big,huge,large]
那么,我如何使用上述单词列表(或者表示对应术语列表中任何词汇存在性的变量,因为列表中的每个术语都是唯一的)作为多个独立变量
,以及评级作为因变量
来进行线性回归呢?换句话说
我如何用sklearn评估术语列表对评级的影响
我使用TfidfVectorizer
来导出文档-术语矩阵。如果可能的话,请提供一个简单的代码片段或示例。
回答:
根据评论中的讨论,似乎应该理解为,每个列表定义了一个二进制变量,其值取决于列表中的任何词是否出现在相关文本中。所以,我们首先要更改文本,使词汇实际出现:
dataset = [ {"text": "我不喜欢这个大设备", "rating": "2"}, {"text": "我真的很喜欢这个小设备", "rating": "5"}, {"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 x20 2 {this, large, don't, like, device, I} False True1 5 {this, small, love, Really, device} True False2 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)的案例。