回归模型熊猫

时间:2018-07-10 17:48:11

标签: python pandas scikit-learn regression

我目前正在为uni的数据分析课程做作业。我设法完成了前两部分而没有很多问题(EDA和文本处理)。我现在需要这样做:

  

建立一个回归模型,该模型将根据以下内容预测每个产品的评分   与评论中使用的一些非常常见的单词相对应的属性   (决定剩下多少个单词作为决定)。因此,对于每种产品   根据每个单词出现的次数,将具有较长的(ish)属性向量   在对该产品的评论中。您的目标变量是等级。

我发现自己对如何解决这个问题有些迷茫。 Here是我正在使用的数据集的链接。 Review2Review的去残化版本。

任何有关如何解决此问题的见解将不胜感激!

P.S:我不是在这里发布以获得完整的解决方案...只是朝着正确的方向推进


编辑:

这是我为Ordinal回归编写的代码(可能会有一些反馈):

# Create word matrix
bow = df.Review2.str.split().apply(pd.Series.value_counts)
rating = df['Rating']
df_rating = pd.DataFrame([rating])
df_rating = df_rating.transpose()
bow = bow.join(df_rating)

# Remove some columns and rows
bow = bow.loc[(bow['Rating'].notna()), ~(bow.sum(0) < 80)]

# Divide into train - validation - test
bow.fillna(0, inplace=True)
rating = bow['Rating']
bow = bow.drop('Rating', 1)
x_train, x_test, y_train, y_test = train_test_split(bow, rating, test_size=0.4, random_state=0)

# Run regression
regr = m.OrdinalRidge()
regr.fit(x_train, y_train)
y_pred = regr.predict(x_test)
scores = cross_val_score(regr, bow, rating, cv=5, scoring='accuracy'))

# Plot
pca = PCA(n_components = 1) 
pca.fit(x_validate)
x_validate = pca.transform(x_validate)

plt.scatter(x_validate, y_validate,  color='black')
plt.plot(x_validate, y_pred, color='blue', linewidth=1)
plt.show()

这是情节的样子(从here获取):

enter image description here

是否有可能对代码有一些反馈,并且有可能提供一种更好,更有用的方法来绘制结果(我并不真正了解回归是否执行得很好)

1 个答案:

答案 0 :(得分:3)

  

构建一个回归模型,该模型将预测每个模型的评分   基于与一些非常常见的单词相对应的属性的产品   评论中使用的语言(选择剩下多少个单词   决定)。因此,对于每种产品,您将有一个长(ish)向量   属性取决于每个单词出现在评论中的次数   这个产品。您的目标变量是评分。

让我们把它分成几块!

  

因此,对于每种产品,您都有一个较长的(ish)向量   属性取决于每个单词出现在评论中的次数   该产品。

这是一个词袋模型,这意味着您将必须为您的words列或review 2列创建一个矩阵表示(仍保留在pd.DataFrame中),并且存在一个问题,询问如何执行此操作在这里:

How to create a bag of words from a pandas dataframe

以下是如何使用Review2列创建矩阵的最小示例:

In [12]: import pandas as pd
In [13]: df = pd.DataFrame({"Review2":['banana apple mango', 'apple apple strawberry']})
In [14]: df
Out[14]: 
                  Review2
0      banana apple mango
1  apple apple strawberry

In [15]: df.Review2.str.split()
Out[15]: 
0        [banana, apple, mango]
1    [apple, apple, strawberry]
Name: Review2, dtype: object
In [16]: df = df.Review2.str.split().apply(pd.Series.value_counts) # this will produce the word count matrix
In [17]: df 
Out[17]: 
   apple  banana  mango  strawberry
0    1.0     1.0    1.0         NaN
1    2.0     NaN    NaN         1.0

“词袋”模型仅计算单词在感兴趣的文本中出现的频率,而无需考虑位置,而是以矩阵的形式表示一组文本,其中每个文本由一行表示,列显示所有单词的计数。

  

[...]基于与一些非常常见的单词相对应的属性   评论中使用的语言(选择剩下多少个单词   决定)。

现在您有了矩阵表示形式(行是乘积,列是每个唯一单词的计数),您可以将矩阵过滤为最常见的单词。我鼓励您看一下字数分布的外观。我们将为此使用seaborn并将其导入:

import seaborn as sns

鉴于拥有字数矩阵的pd.DataFrame称为df,sns.distplot(df.sum())应该可以解决问题。选择一些似乎可以保留大量计数但不包含许多计数较低的单词的分界线。它可以是任意的,现在并不重要。 您的字数矩阵是您的输入数据,也称为预测变量。在机器学习中,这通常称为输入矩阵或向量X

  

您的目标变量是评分。

输出变量或目标变量是评级列。在机器学习中,这通常称为输出向量y(请注意,有时它也可以是一个输出矩阵,但最常见的是输出一个向量)。

这意味着我们的模型会尝试调整其参数,以将每行的字数数据映射到相应的评级值。

Scikit-learn提供了许多机器学习模型,例如logistic regression,它们接受X和y的训练,并且具有非常统一的界面。 Jake Vanderplas's Python Data Science Handbook很好地解释了Scikit-learn界面,并向您展示了如何将其用于回归问题。

编辑:我们在这里使用逻辑回归,但是正如fuglede正确指出的那样,逻辑回归忽略了评分处于设定范围内。为此,您可以使用mord.OrdinalRidge,其API与scikit-learn的API非常相似。

在训练模型之前,应将数据集分为训练集,测试集和验证集-好的比例可能是60:20:20。 这样,您将能够在训练集上训练模型并评估其对测试数据集的预测程度,以帮助您调整模型参数。这样,您将知道模型何时过度拟合训练数据,何时真正为该任务生成了良好的通用模型。这种方法的问题在于,如果您经常调整模型参数,仍然可以过度拟合训练数据。

这就是为什么我们要有一个验证集的原因-确保我们不会在不知道的情况下也意外地将模型的参数过度拟合到我们的训练和测试集中。我们通常只对验证集进行一次测试,以免对其过度拟合,而且该验证集仅在最终模型评估步骤中使用。

Scikit-learn也具有此功能:train_test_split

但是,

train_test_split仅进行一次拆分,因此您将首先将数据集60:40拆分,然后将40:50:50拆分为测试和验证集。

您现在可以在训练数据上训练不同的模型,并使用模型在测试集上的预测功能对其进行测试。一旦您认为自己做得很好并且模型足够好,就可以在验证集上对其进行测试。