Mercari数据集——机器学习&深度学习视角

本文详述了Mercari数据集在机器学习和深度学习中的应用,涉及回归问题、误差度量(RMSLE)、数据源、EDA、现有方法(如MLP、CNN、LGBM、GRU等)以及模型构建和优化过程。作者通过探索性数据分析发现价格、类别、品牌和描述等特征与目标变量的关系,并通过多种模型比较得出RidgeCV在机器学习中的优秀表现,以及深度学习模型(尤其是GRU集成)在处理文本特征方面的潜力。
摘要由CSDN通过智能技术生成

作者|Yogeeshwari S 编译|VK 来源|Towards Data Science

我很高兴与大家分享我的机器学习和深度学习经验,同时我们将在一个Kaggle竞赛得到解决方案。学习过程的分析也是非常直观,具有娱乐性和挑战性。希望这个博客最终能给读者一些有用的学习帮助。


目录

  1. 业务问题

  2. 误差度量

  3. 机器学习和深度学习在我们的问题中的应用

  4. 数据来源

  5. 探索性数据分析-EDA

  6. 现有方法

  7. 资料准备

  8. 模型说明

  9. 结果

  10. 我对改善RMSLE的尝试

  11. 未来的工作

  12. GitHub存储库

  13. 参考引用


1.业务问题

Mercari是一家在日本和美国运营的电子商务公司,其主要产品是Mercari marketplace的应用程序。人们可以使用智能手机轻松地出售或购买物品。

应用程序的用户可以自由选择价格,同时列出商品。然而,这里的风险更高,因为如果价格表与市场价格相比过高或过低,消费者和客户都会处于亏损状态。上述问题的解决方案是自动推荐商品价格,因此,最大的社区购物应用程序希望向卖家提供价格建议。

目前的问题是预测任何给定产品的价格,这说明这是一个回归问题。训练数据中的特征包括物品的train_id, name, item_condition_id, category_name, brand_name, price, shipping, item_description

除了目标变量价格之外,我们在测试数据中拥有所有其他特征。这些特征不仅是离散的和连续的,而且包含卖家提供的商品的文字描述。例如,女性配饰产品的文字说明如下:

我们可以看到,这两种产品的售价不同,第一种售价16美元,第二种售价9美元。

因此,这里的挑战是,我们需要建立一个模型,根据上图所示的描述,以及产品名称、品牌名称、商品状况等,来预测产品的正确价格。


2.误差度量

这个问题的误差度量是均方根对数误差(RMSLE)。请参阅此博客以了解有关度量的更多信息

https://medium.com/analytics-vidhya/root-mean-square-log-error-rmse-vs-rmlse-935c6cc1802a

度量计算公式如下图所示:

RMSLE计算代码如下:

def rmsle_compute(y_true, y_pred):
    #https://www.kaggle.com/gspmoreira/cnn-glove-single-model-private-lb-0-41117-35th
    assert len(y_true) == len(y_pred)
    score = np.sqrt(np.mean(np.power(np.log1p(y_pred) - np.log1p(y_true), 2)))
    return score

3.机器学习和深度学习在我们的问题中的应用

在这个人工智能(AI)时代,当我们想到AI的时候,有两个流行词分别是机器学习和深度学习。我们发现人工智能无处不在,它们现在是人类生活的一部分。无论是通勤(例如出租车预订)、医疗诊断、个人助理(如Siri、Alexa)、欺诈检测、犯罪侦查、在线客户支持、产品推荐、自动驾驶汽车,等等。利用先进的机器学习和深度学习算法,任何类型的预测问题都可以解决。

我们的问题是独特的,因为它是一个基于自然语言处理(NLP)的回归任务。NLP的第一步是将文本表示为数字,即将文本转换为数字向量表示,以构造回归函数。

解决价格预测问题的一种方法是利用向量化技术,如TF-IDF、BoW,并构建固定大小的稀疏向量表示,这些表示将被经典的机器学习算法(例如简单线性回归器、基于树的回归器等)使用。

另一种方法是使用深层NLP体系结构(例如CNN、LSTM、GRU或它们的组合),这些体系结构可以独立学习特征,可以得到密集向量。在当前的分析中,我们正在研究这两种方法。


4.数据来源

这个分析的数据集来自Kaggle,一个流行的在线社区或者数据科学家的数据平台。

了解数据

训练集由140多万件产品组成,第二阶段测试集由340多万件产品组成。

列出训练/测试数据中的字段名:

  • train_id 或者test_id — 列表的唯一id
  • name — 卖方提供的产品名称。请注意,为避免数据泄漏,此字段中的价格被删除并表示为[rm]
  • item_condition_id — 这里卖家提供物品条件
  • category_name — 每个物品的类别列表
  • brand_name — 每个商品所属的相应品牌
  • price — 这是我们的目标变量,以美元表示(不在测试集中)
  • shipping — 1,如果运费由卖方支付,否则为0
  • item_description — 此处给出了每个物品的描述,价格被删除并表示为[rm]

以下数据的部分截图:


5.探索性数据分析-EDA

EDA是数据科学过程中的一个重要步骤,是一种统计方法,通常使用可视化方法从数据集中获得更多的见解。在深入研究EDA之前,让我们快速查看数据以了解更多信息。下面是检查空值的代码段:

print(train.isnull().sum())

从上面的输出中,我们发现三列,即类别名称(category name)、品牌名称(brand name)和物品描述(item description)携带空值。其中,品牌名称包含了很多缺失的值(632k)。列类别名称包含6.3k个空值,而物品描述只有4个空值。让我们稍后在创建模型时再处理它们,现在我们逐个深入研究EDA特性。

5.1 类别名称的单变量分析

训练数据集中共有1287个类别。下面是用于计数的代码段:

category_count = train['category_name'].value_counts()

类别计数图如下所示:

上面的条形图显示了出现频率最高的10个类别。人们会注意到,女装在所有群体中占据着制高点。

每个类别名称由3个子部分组成,用“/”分隔,并有主类别/子类别1/子类别2名称。重要的是要将它们分开,并将它们作为新的特征包含进来,这样我们的模型就能做出更好的预测。

划分类别

在我们的分析中,我们使用以下函数将每个类别的名称划分为主类别、子类别1、子类别2。

def split_categories(category):
    '''
    函数在数据集中划分类别列并创建3个新列:
    'main_category','sub_cat_1','sub_cat_2'
    '''
    try:
      sub_cat_1,sub_cat_2,sub_cat_3 = category.split("/")
      return sub_cat_1,sub_cat_2,sub_cat_3
    except:
      return ("No label","No label","No label")

def create_split_categories(data):
    '''
    使用split_categories函数创建3个新列的函数
    : 'main_category','sub_cat_1','sub_cat_2'
    '''
    #https://medium.com/analytics-vidhya/mercari-price-suggestion-challenge-a-machine-learning-regression-case-study-9d776d5293a0
    data['main_category'],data['sub_cat_1'],data['sub_cat_2']=zip(*data['category_name'].\
                                                                  apply(lambda x: split_categories(x)))

此外,使用下面的代码行计算三列中每个列中的类别数:

main_category_count_te = test['main_category'].value_counts()
sub_1_count_te = test['sub_cat_1'].value_counts()
sub_2_count_te = test['sub_cat_2'].value_counts()

上述分析表明,训练数据中有11个主要类别,这些类别又分为114个子类别(子类别1),这些子类别又被进一步分配到865个特定类别(子类别2)。绘制类别的代码如下所示:

def plot_categories(category,title):
  '''
  这个函数接受一个类别和标题作为输入,并绘制条形图。
  '''
  #https://seaborn.pydata.org/generated/seaborn.barplot.html
  sns.set(style="darkgrid")
  sns.barplot(x=category[:10].values, y=category[:10].index)
  plt.title(title)
  plt.xlabel('Counts', fontsize=12)
  plt.show()
#https://www.datacamp.com/community/tutorials/categorical-data

plot_categories(category_count,"Frequency Distribution of top 10 categories")

拆分后该类别每列前10项的条形图如下:

5.2品牌名称的单变量分析

共有4807个品牌,其中最常出现的前10个品牌如下图所示:

绘图代码在这里:

#https://www.datacamp.com/community/tutorials/categorical-data
sns.barplot(x=brand_count[:10].values, y=brand_count[:10].index)
plt.title('Frequency Distribution of top 10 brand names')
plt.xlabel('Counts', fontsize=12)
plt.show()

值得注意的是PINK 和NIKE 品牌,紧随其后的是维多利亚的秘密。

5.3价格单变量分析

由于价格是数值的,所以我们使用describe()函数来查看摘要。下面是代码片段:

train.price.describe()

任何产品的最高价格为2009美元,最低价格为0。还应注意的是,75%的产品价格低于29美元,50%的产品价格低于17美元,而25%的产品价格低于10美元。平均价格区间为26.7美元。

价格变量分布

目标的分布

plt.title("Distribution of Price variable")
plt.xlabel("Price(USD)")
plt.ylabel("No. of products")
plt.h
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值