实践1使用XGB实现酒店信息消歧


XGB算法是决策树衍生出来的一种算法

场景:酒店的业务人员希望我们能够提供一个算法服务去为酒店信息做一个自动化的匹配,以通过算法的手段,找到那些确定相同的酒店和确定不同的酒店

以下代码为部分

理解业务

项目背景

当用户在马蜂窝打开一家选中的酒店时,不同供应商提供的预订信息会形成一个聚合列表准确地展示给用户。这样做首先避免同样的信息多次展示给用户影响体验,更重要的是帮助用户进行全网酒店实时比价,快速找到性价比最高的供应商,完成消费决策。

问题: 数据属性不同(比如酒店名有的是中文,有的英文,有的中英)、数据形态不同(比如有的是日语、韩语)、

数据量大,全部对比不现实、

消歧错误带来的风险

算法解决方案:

1.提供一个算法服务以计算两条数据是否属于同一家酒店

2.目标设定为提升运营效率,通过算法与运营人员的结合实现业务目标

3.计划先对中文的内容进行处理,而对其他语言暂时不做处理

准备数据与模型训练

#过滤掉最后面的英文字符,并进行数字转换(转换成阿拉伯数字),大小写转换(转成小写)
def ch2num(self,s)
  s = list(s)
  num = ['','','','','','','','','','']
  ch_num = ['','','','','','','','','','']
  i,last,flag = len(s)-1,len(s),True
  while i > -1:
     if s[i] >= u'\u4e00' and s[i] <= u'\u9fa5' and flag:
        last = i+1
        flag = False
     else:
        if s[i] in num:
           s[i] = num.index(s[i])
        elif s[i] in ch_num:
           s[i] = ch_num.index(s[i])
     i -= 1
  return ".join(str(it) for it in s[:last]).lower()

名称分词

地址分词

#三种距离计算方法
#计算Levenshtein距离
def levenshtein_vec(self,item1,item2):
  vec = []
  dist = Levenshtein()
  for i in range(len(item1)):
     vec.append(dist.distance(item1[i],item2[i]))
  return vec

#jarowinkler距离
def jarowinkler_vec(self,item1,item2):
  vec = []
  dist = jaroWinkler()
  for i in range(len(item1)):
     vec.append(dist.similarity(item1[i],item2[i]))
  return vec

#qgram距离
def qgram_vec(self,item1,item2):
  vec = []
  dist = QGram(len(item1) if len(item1) <= len(item2) else len(item2))
  for i in range(len(item1)):
     vec.append(dist.distance(item1[i],item2[i]))
  return vec

#经纬度距离相对特殊,使用haversine距离 专门处理经纬度与物理计算的
def haversine(self,item1,item2):     #[经度1,纬度1],[经度2,纬度2](十进制度数)
   '''
   Calculate the great circle distance between two points on the earth(specified in decimal degree)
   '''
#将十进制度数转化为弧度
lon1,lat1,lon2,lat2 = map(radians,[float(item1[0]),float(item1[1]),float(item2[0]),float(item2[1])])

#haveeersin公式
dlon = lon2 -lon1
dlat = lat2 - lat1
a = sin(dlat/2)**2 + cos(lat1)*cos(lat2)*sin(dlon/2)**2
c = 2asin(sqrt(a))
r = 6371 #地球半径,单位为公里
return [c*r*1000]

模型训练与评估

import xgboost as xgb
model = xgb.XGBClassifier(nthread=-1,max_depth=6,
n_estimators=30,learning_rate=0.01,colsample_bytree=.9,
gamma=1,reg_alpha=4,objective='binary:logistic',eta=0.2,silent=1,subsample=0.8).fit(X_train,Y_train)
fileObject = open('xgb_hotelmatch.pkl','wb')

#保存模型
pick.dump(model,fileObject,protocol=4)
fileObject.close()

#模型预测与混淆矩阵获取
prediction = model.predict(X_test)
cm = confusion_matrix(Y_test,prediction)

根据给出的“是”和“否”的概率值区间来判断是否足够置信

1.对于置信结果直接进入到合并或新增环节

2.对于不那么置信,仍然进入到人工审核环节进行二次校验