所有的在线旅行社都再努力满足亚马逊和Netflix制定的AI驱动的个性化标准。另外,世界各地的线上旅行系统竞争越发激烈,各个旅行商努力通过推荐、比较、匹配和分享来抓住我们的注意力和钱包。
在这篇文章中,我们意在为那些在Expedia订旅馆的用户创建一个合适的旅店推荐系统。我们将该问题定义为一个多分类问题,然后建立并融合SVM模型和决策树模型取预测哪个“hotel cluster”是用户最想定的,并给予他详细的搜索信息。

1. 数据

数据是匿名用户的,并且所有字段都是数字格式。数据可以在Kaggle中下载,train.csv中记录用户的行为,destinations.csv包含了用户的酒店信息。

图一: train.csv

图二: destinations.csv
import datetime
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier
from sklearn.pipeline import make_pipeline
from sklearn import preprocessing
from sklearn.preprocessing import StandardScaler
from sklearn import svm

为了能够在本地运行,我们随机选取了1%的数据,但仍然有24179条数据。

df = pd.read_csv('train.csv.gz', sep=',').dropna()
dest = pd.read_csv('destinations.csv.gz')
df = df.sample(frac=0.01, random_state=99)
df.shape

输出:(241179, 24)

2. 探索性分析

该系统的目的是要根据用户的搜索信息,预测用户将会预定哪种旅馆。总共有100种。换言之,我们是要处理一个100分类问题。

plt.figure(figsize=(12, 6))
sns.distplot(df['hotel_cluster'])

图三

可以看出每个类的分布很均匀。

3. 特征工程

Checkin和checkout列的数据是时间格式的数据,不能直接使用。我们将从中提取出年份和月份。通过定义一个函数取抽取,并将他们合并到destination.csv中。

from datetime import datetime
def get_year(x):if x is not None and type(x) is not float:try:return datetime.strptime(x, '%Y-%m-%d').yearexcept ValueError:return datetime.strptime(x, '%Y-%m-%d %H:%M:%S').yearelse:return 2013pass
def get_month(x):if x is not None and type(x) is not float:try:return datetime.strptime(x, '%Y-%m-%d').monthexcept:return datetime.strptime(x, '%Y-%m-%d %H:%M:%S').monthelse:return 1passdef left_merge_dataset(left_dframe, right_dframe, merge_column):return pd.merge(left_dframe, right_dframe, on=merge_column, how='left')

处理时间格式的列:

df['date_time_year'] = pd.Series(df.date_time, index = df.index)
df['date_time_month'] = pd.Series(df.date_time, index = df.index)
from datetime import datetime
df.date_time_year = df.date_time_year.apply(lambda x: get_year(x))
df.date_time_month = df.date_time_month.apply(lambda x: get_month(x))
del df['date_time']

处理srch_ci列:

df['srch_ci_year'] = pd.Series(df.srch_ci, index=df.index)
df['srch_ci_month'] = pd.Series(df.srch_ci, index=df.index)# convert year & months to int
df.srch_ci_year = df.srch_ci_year.apply(lambda x: get_year(x))
df.srch_ci_month = df.srch_ci_month.apply(lambda x: get_month(x))
# remove the srch_ci column
del df['srch_ci']

处理srch_co列:

df['srch_co_year'] = pd.Series(df.srch_co, index=df.index)
df['srch_co_month'] = pd.Series(df.srch_co, index=df.index)
# convert year & months to int
df.srch_co_year = df.srch_co_year.apply(lambda x: get_year(x))
df.srch_co_month = df.srch_co_month.apply(lambda x: get_month(x))
# remove the srch_co column
del df['srch_co']

4. 初步分析

在创建了一些新列和去除一些无用的列后,我们想要知道每一列跟类标是否有线性关系。这可以让我们更加关注一些特定的特征。

df.corr()["hotel_cluster"].sort_values()

图4

可以看出所有的列都基本跟类标没什么线性关系。这意味着刚才的那些方法对这个问题并不合适。

5. 策略

在快速的进行谷歌搜索之后,我们不难发现将目的地、旅馆国家、旅馆超市结合起来能够更加准确的帮助我们找到对应的类标。

pieces = [df.groupby(['srch_destination_id','hotel_country','hotel_market','hotel_cluster'])['is_booking'].agg(['sum','count'])]
agg = pd.concat(pieces).groupby(level=[0,1,2,3]).sum()
agg.dropna(inplace=True)
agg.head()

图五
agg['sum_and_cnt'] = 0.85*agg['sum'] + 0.15*agg['count']
agg = agg.groupby(level=[0,1,2]).apply(lambda x: x.astype(float)/x.sum())
agg.reset_index(inplace=True)
agg.head()

图六
agg_pivot = agg.pivot_table(index=['srch_destination_id','hotel_country','hotel_market'], columns='hotel_cluster', values='sum_and_cnt').reset_index()
agg_pivot.head()

图七
df = pd.merge(df, dest, how='left', on='srch_destination_id')
df = pd.merge(df, agg_pivot, how='left', on=['srch_destination_id','hotel_country','hotel_market'])
df.fillna(0, inplace=True)
df.shape

输出:(241179, 276)

6. 实现算法

我们只对预定的样本有兴趣:

df = df.loc[df['is_booking'] == 1]

得到特征和类标:

X = df.drop(['user_id', 'hotel_cluster', 'is_booking'], axis=1)
y = df.hotel_cluster

朴素贝叶斯:

from sklearn.naive_bayes import GaussianNB
clf = make_pipeline(preprocessing.StandardScaler(), GaussianNB(priors=None))
np.mean(cross_val_score(clf, X, y, cv=10))

0.10347912437041926

KNN:

from sklearn.neighbors import KNeighborsClassifier
clf = make_pipeline(preprocessing.StandardScaler(), KNeighborsClassifier(n_neighbors=5))
np.mean(cross_val_score(clf, X, y, cv=10, scoring='accuracy'))

0.25631461834732266

随机森林:

clf = make_pipeline(preprocessing.StandardScaler(), RandomForestClassifier(n_estimators=273,max_depth=10,random_state=0))
np.mean(cross_val_score(clf, X, y, cv=10))

0.24865023372782996

多分类逻辑回归:

from sklearn.linear_model import LogisticRegression
clf = make_pipeline(preprocessing.StandardScaler(), LogisticRegression(multi_class='ovr'))
np.mean(cross_val_score(clf, X, y, cv=10))

0.30445543572367767
支持向量机:很耗时,但是效果更好。

from sklearn import svm
clf = make_pipeline(preprocessing.StandardScaler(), svm.SVC(decision_function_shape='ovo'))
np.mean(cross_val_score(clf, X, y, cv=10))

0.3228727137315005

看起来我们需要做更多的特征工程去优化结果。接下来将会进一步调优。

源代码在Github中找到。公众号后台回复 “1224” 获得Github直达链接。

一文带你搭建简单的酒店推荐系统(附代码演练)相关推荐

  1. 一文弄懂元学习 (Meta Learing)(附代码实战)《繁凡的深度学习笔记》第 15 章 元学习详解 (上)万字中文综述

    <繁凡的深度学习笔记>第 15 章 元学习详解 (上)万字中文综述(DL笔记整理系列) 3043331995@qq.com https://fanfansann.blog.csdn.net ...

  2. python编程例子 输入 输出-推荐 :手把手教你用Python创建简单的神经网络(附代码)...

    原标题:推荐 :手把手教你用Python创建简单的神经网络(附代码) 作者:Michael J.Garbade:翻译:陈之炎:校对:丁楠雅 本文共2000字,9分钟. 本文将为你演示如何创建一个神经网 ...

  3. 基于FPGA的一维卷积神经网络CNN的实现(三)训练网络搭建及参数导出(附代码)

    训练网络搭建 环境:Pytorch,Pycham,Matlab. 说明:该网络反向传播是通过软件方式生成,FPGA内部不进行反向传播计算. 该节通过Python获取训练数据集,并通过Pytorch框架 ...

  4. 一文带你熟悉简单实用的Python科学计算库NumPy

    Python科学计算库NumPy 安装 数组的创建 array创建 **arange** 创建 **随机数创建** 方法numpy.random.random(size=None) 方法numpy.r ...

  5. 独家 | 一文带你上手卷积神经网络实战(附数据集学习资料)

    原文标题:Understanding deep Convolutional Neural Networks with a practical use-case in Tensorflow and Ke ...

  6. 一文带你入门图论和网络分析(附Python代码)

    作者:Srivatsa 翻译:和中华 校对:丁楠雅 本文约6300字,建议阅读20+分钟. 本文从图的概念以及历史讲起,并介绍了一些必备的术语,随后引入了networkx库,并以一个航班信息数据集为例 ...

  7. python推荐系统酒店_PCA实现一个简单的酒店推荐系统(附Python源码)

    微信公众号 关键字全网搜索最新排名 [机器学习算法]:排名第一 [机器学习]:排名第二 [Python]:排名第三 [算法]:排名第四 PCA前言 众所周知,PCA 的主要目的是降维,同时也可以起到分 ...

  8. Wayfair面向中国卖家开放入驻,一文带你抢跑Wayfair平台(内附福利)

    近日,麒麟君得知,美国最大的家居电商平台Wayfair,传来了一个令许多卖家精神振奋的好消息--Wayfair面向中国卖家开放入驻! Wayfair是美国最大的家居电商平台,作为当下家居垂直类电商平台 ...

  9. 独家 | 手把手教你用Python创建简单的神经网络(附代码)

    作者:Michael J.Garbade 翻译:陈之炎 校对:丁楠雅 本文共2000字,建议阅读9分钟. 本文将为你演示如何创建一个神经网络,带你深入了解神经网络的工作方式. 了解神经网络工作方式的最 ...

最新文章

  1. 分享几个用 Python 给图片添加水印的方法,简单实用
  2. Windows phone 8 学习笔记(8) 定位地图导航
  3. 顺序、二分查找文本数据
  4. tableau必知必会之通过 Tableau 计算挖掘数据真相
  5. Powershell管理系列(十一)Exchange完全访问权限邮箱的设置
  6. netty系列之:Event、Handler和Pipeline
  7. 不同磁盘目录共享linux,linux下实现磁盘共享(mount)
  8. 注解(一)- 基础知识与运行时注解
  9. 经典网络分析 - Very Deep Convolutional Networks for Large-Scale Image Recognition(VGG)
  10. 如何使用计算机实现fft,快速傅立叶变换(FFT)的计算机实现..doc
  11. 使用 Microsoft.UI.Xaml 解决 UWP 控件和对老版本 Windows 10 的兼容性问题
  12. 直博人数远大于硕士人数,清华计算机系到底有多强?
  13. 知识兔课程揭秘2021抖音卖货代运营的新骗局,你中招了吗?
  14. ubuntu系统启动项的修改
  15. [VBA][EXCEL]插入分页符
  16. ssh配置和多平台ssh配置
  17. Numpy的tile函数
  18. 翌加:抖音账号被限流了如何解决
  19. 2021(ICPC)-Jiangxi_Continued Fraction
  20. 《AlgoPlus使用手册》之全天候模拟测试

热门文章

  1. 精益六西格玛的营运改良案例 -- 优思学院
  2. XT交易所Websocket API
  3. [原创]微信双开代码
  4. 可穿戴式脑电图传感器在室内热舒适度测量中的应用
  5. android 蓝牙4.0 ble,Android 蓝牙4.0开启Notification 和 Indication
  6. idea加入python遇到的问题
  7. 饥荒如何解锁机器人_饥荒怎么解锁人物
  8. 一文读懂K-Means原理与Python实现
  9. 苹果电脑取证?先搞定APFS文件系统再说!
  10. Gridea 配置Gitalk 的异常:Error Bad credentials 和 Error Not Found