作者|Yogeeshwari S 编译|VK 来源|Towards Data Science
我很高兴与大家分享我的机器学习和深度学习经验,同时我们将在一个Kaggle竞赛得到解决方案。学习过程的分析也是非常直观,具有娱乐性和挑战性。希望这个博客最终能给读者一些有用的学习帮助。
目录
业务问题
误差度量
机器学习和深度学习在我们的问题中的应用
数据来源
探索性数据分析-EDA
现有方法
资料准备
模型说明
结果
我对改善RMSLE的尝试
未来的工作
GitHub存储库
参考引用
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