使用 sklearn - python 具有分类特征的多元线性回归

Posted

技术标签:

【中文标题】使用 sklearn - python 具有分类特征的多元线性回归【英文标题】:Multiple linear regression with categorical features using sklearn - python 【发布时间】:2019-04-07 11:10:40 【问题描述】:

我有一个数据集,其中每个文档都有相应的分数/评级

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 推导出文档术语矩阵。如果可能,请提供简单的代码 sn-p 或示例。

【问题讨论】:

x1x2text的值有什么关系?单词之间似乎没有重叠。 从文本变量中提取的那些单词(超过 10.000 个样本),这些单词列表存在于文本变量中,@fuglede 那么你是说在你的回归中,你只想考虑那些词?如果是这样,我认为您真的希望 x1 + x2 显示为特征? 是的,但是一个列表作为一个自变量,因为每个列表都有它的命名(类别),比如“大尺寸”,所以我想探索这些类别对评级@fuglede 的影响 如何将列表归结为变量?您能否提供一些文本及其相应编码的示例? 【参考方案1】:

鉴于 cmets 中的讨论,似乎解释应该是每个列表定义一个二进制变量,其值取决于列表中的任何单词是否出现在相关文本中。因此,让我们首先更改文本,以便实际出现单词:

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

正如 cmets 中也提到的,这个东西最多会产生四个评级,x1x2 的组合分别是 TrueFalse。在这种情况下,碰巧所有可能的输出都是整数,但一般来说,它们不需要,也不需要限制在感兴趣的区间内。鉴于评级的顺序性质,这确实是某种ordinal regression 的情况(参见例如mord)。

【讨论】:

非常感谢,对我的论文项目很有帮助 不客气。如果这是您正在寻找的答案,您可以accept it。 还有一个问题,由于 skleanr 不提供解释 LinerRegression 的摘要,我如何使用 statsmodel 实现相同的功能以获得摘要表? sm.OLS(df.rating, df[['x1', 'x2']].astype(int)).fit().summary()

以上是关于使用 sklearn - python 具有分类特征的多元线性回归的主要内容,如果未能解决你的问题,请参考以下文章

具有分类输出的逻辑回归 sklearn

使用具有不同分类器的 sklearn precision_recall_curve 函数

训练具有多个特征的 sklearn 分类器

无法使用 Keras 和 Sklearn 将字符串列转换为分类矩阵

python分类预测模型的特点

具有 PredefinedSplit 评分的 Sklearn GridSearch 与独立分类器不匹配