大家好,我是小泽
预测分析·民宿价格预测比赛是和鲸社区与ChallengeHub联合举办的一场新手赛,本文旨在多角度构建特征工程来帮助选手快速比赛上手。
比赛链接
话不多说,直接开!

导入相关库

import time
import lightgbm as lgb
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
from sklearn import metrics
from sklearn.model_selection import KFold
from sklearn.preprocessing import LabelEncoder
from catboost import CatBoostRegressor, Pool#读取训练集与测试集并构建原始数据
train = pd.read_csv('./训练集.csv')
test = pd.read_csv('./测试集.csv')
df_features = train.append(test)

填充缺失值并且相关Encoding操作

df_features['洗手间数量'].fillna(-1, inplace=True)
df_features['床的数量'].fillna(-1, inplace=True)
df_features['卧室数量'].fillna(-1, inplace=True)
df_features['房主是否有个人资料图片'].fillna('na', inplace=True)
df_features['房主身份是否验证'].fillna('na', inplace=True)
df_features['房主回复率'].fillna('-1', inplace=True)
df_features['房主回复率'] = df_features['房主回复率'].astype(str).apply(lambda x: x.replace('%', ''))
df_features['房主回复率'] = df_features['房主回复率'].astype(int)
df_features['民宿周边'].fillna('na', inplace=True)
mean_score = df_features['民宿评分'].mean()
df_features['民宿评分'].fillna(mean_score, inplace=True)
df_features['邮编'].fillna('na', inplace=True)for feat in ['房主是否有个人资料图片', '房主身份是否验证', '民宿周边', '邮编']:lbl = LabelEncoder()lbl.fit(df_features[feat])df_features[feat] = lbl.transform(df_features[feat])def freq_enc(df, col):vc = df[col].value_counts(dropna=True, normalize=True).to_dict()df[f'{col}_freq'] = df[col].map(vc)return dffor feat in ['容纳人数', '洗手间数量', '床的数量', '床的类型','卧室数量', '取消条款', '所在城市', '清洁费','房主是否有个人资料图片', '房主回复率', '是否支持随即预订','民宿周边', '房产类型', '房型', '邮编']:df_features = freq_enc(df_features, feat)

对时间特征进行处理

# 时间特征处理
from tqdm import tqdm
df_features['首次评论日期'] = pd.to_datetime(df_features['首次评论日期']).values.astype(np.int64) // 10 ** 9
df_features['何时成为房主'] = pd.to_datetime(df_features['何时成为房主']).values.astype(np.int64) // 10 ** 9
df_features['最近评论日期'] = pd.to_datetime(df_features['最近评论日期']).values.astype(np.int64) // 10 ** 9df_features['timestamp_diff1'] = df_features['首次评论日期'] - df_features['何时成为房主']
df_features['timestamp_diff2'] = df_features['最近评论日期'] - df_features['首次评论日期']
df_features['timestamp_diff3'] = df_features['最近评论日期'] - df_features['何时成为房主']def brute_force(df, features, groups):for method in tqdm(['max', 'min', 'mean', 'median', 'std']):for feature in features:for group in groups:df[f'{group}_{feature}_{method}'] = df.groupby(group)[feature].transform(method)return dfdense_feats = ['timestamp_diff1', 'timestamp_diff2', 'timestamp_diff3']
cate_feats  = ['房型']df_features = brute_force(df_features, dense_feats, cate_feats)

其他简单业务特征

def f(x):if x>0:return 1else:return 0
df_features['if_bed'] = train['床的数量'].apply(f)
df_features['if_bedroom'] = train['卧室数量'].apply(f)
df_features['if_wc'] = train['洗手间数量'].apply(f)#交叉衍生特征
df_features['人均床数量'] = df_features['容纳人数'] / (df_features['床的数量'] + 1e-3)  # 1e-3 是为了避免 zero-divide
df_features['人均卧室量'] = df_features['容纳人数'] / (df_features['卧室数量'] + 1e-3)
df_features['卧室床均量'] = df_features['床的数量'] / (df_features['卧室数量'] + 1e-3)
df_features['经纬度平方根'] = (df_features['维度']*df_features['维度'] + df_features['经度']*df_features['经度'])**.5def get_features(df):features = [['人均床数量','人均卧室量'],['卧室床均量','人均卧室量']]for fea in features:df[f'{fea[0]}_{fea[1]}_std'] = df[fea].std(1)df[f'{fea[0]}_{fea[1]}_max'] = df[fea].max(1)df[f'{fea[0]}_{fea[1]}_min'] = df[fea].min(1)df[f'{fea[0]}_{fea[1]}_sub'] = df[fea[0]] - df[fea[1]]#df.loc[df[fea[0]] <= df[fea[1]],f'{fea[0]}_{fea[1]}_mark'] = 0#df.loc[df[fea[0]] > df[fea[1]],f'{fea[0]}_{fea[1]}_mark'] = 1 return dfdf_features = get_features(df_features)

对“便利设施”特征进行挖掘

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.decomposition import TruncatedSVD
df_features['便利设施数量']=df_features['便利设施'].apply(lambda x:len(x.lstrip('{').rstrip('}').split(',')))
df_features['便利设施'] = df_features['便利设施'].apply(lambda x: x.replace('{', '').replace('}', '').replace('"', '').replace(':', '').replace(',', ' '))
# df_features['便利设施'] = df_features['便利设施'].str.lower()n_components = 12X = list(df_features['便利设施'].values)
tfv = TfidfVectorizer(ngram_range=(1,1), max_features=10000)
tfv.fit(X)
X_tfidf = tfv.transform(X)
svd = TruncatedSVD(n_components= n_components)
svd.fit(X_tfidf)
X_svd = svd.transform(X_tfidf)for i in range(n_components):df_features[f'便利设施_tfidf_{i}'] = X_svd[:, i]

获取特征和标签数据

df_train = df_features[~df_features['价格'].isnull()]
df_train = df_train.reset_index(drop=True)
df_test = df_features[df_features['价格'].isnull()]no_features = ['数据ID', '价格', '便利设施']
# 输入特征列
features = [col for col in df_train.columns if col not in no_features]X = df_train[features] # 训练集输入
y = df_train['价格'] # 训练集标签
X_test = df_test[features] # 测试集输入

五折Catboost模型

n_fold = 5
folds = KFold(n_splits=n_fold, shuffle=True, random_state=1314)oof = np.zeros(len(X))
prediction = np.zeros(len(X_test))
for fold_n, (train_index, valid_index) in enumerate(folds.split(X)):X_train, X_valid = X[features].iloc[train_index], X[features].iloc[valid_index]y_train, y_valid = y[train_index], y[valid_index]cate_features=['房主是否有个人资料图片','房主身份是否验证','是否支持随即预订','房产类型','房型','if_bed','if_bedroom','if_wc']train_pool = Pool(X_train, y_train, cat_features=cate_features)eval_pool = Pool(X_valid, y_valid, cat_features=cate_features)cbt_model = CatBoostRegressor(iterations=10000, # 注:baseline 提到的分数是用 iterations=60000 得到的,但运行时间有点久learning_rate=0.1, # 注:事实上好几个 property 在 lr=0.1 时收敛巨慢。后面可以考虑调大eval_metric='SMAPE',use_best_model=True,random_seed=42,logging_level='Verbose',#task_type='GPU',devices='0',gpu_ram_part=0.5,early_stopping_rounds=400)cbt_model.fit(train_pool,eval_set=eval_pool,verbose=1000)y_pred_valid = cbt_model.predict(X_valid)y_pred = cbt_model.predict(X_test)oof[valid_index] = y_pred_valid.reshape(-1, )prediction += y_pred
prediction /= n_foldfrom sklearn.metrics import mean_squared_error
score = mean_squared_error(oof, df_train['价格'].values, squared=False)
print(score)test['价格'] = prediction
test[['数据ID', '价格']].to_csv('./sub_cat.csv'.format(score), index=None)

最后线上RMSE可以达到5.3以内,目前可以排到top10左右。
本文主要参考了官方的baseline以及恒哥的代码思路

如果本文可以帮助到大家,欢迎点个关注!

预测分析·民宿价格预测baseline相关推荐

  1. 预测分析·民宿价格预测【和鲸社区】

    预测分析·民宿价格预测 赛题&数据 赛题 民宿这一名词,是日语中"Minshuku"的音译.我国第一部关于民宿的旅游行业标准<旅游民宿基本要求与评价>已从201 ...

  2. 民宿价格预测分析(和鲸社区)

    比赛介绍 关于新人赛比赛介绍见链接:https://www.heywhale.com/home/competition/605c426d21e3f6003b56a920 处理过程 导入需要的包 imp ...

  3. 预测分析·商品评论情感预测-基于PaddleNLP的京东商品评论情感分析竞赛

    一.预测分析·商品评论情感预测 竞赛地址: https://www.heywhale.com/home/competition/609cc718ca31cd0017835fdc/content/1 希 ...

  4. 第三届山东大数据-威海赛区-民宿空置预测-排行榜

  5. 预测分析 Python ARIMA模型预测(学习笔记)

    import numpy as np import pandas as pd import matplotlib.pyplot as plt import statsmodels.api as sm# ...

  6. 8大预测分析工具比较

    什么是预测分析工具? 预测分析工具融合了人工智能和业务报告.这些工具包括用于从整个企业收集数据的复杂管道,添加统计分析和机器学习层以对未来进行预测,并将这些见解提炼成有用的摘要,以便业务用户可以对此采 ...

  7. BP神经网络南瓜价格相关性研究与价格预测模型设计

    随着全国脱贫攻坚战的全面胜利, "三农"工作重心已转移到全面推进乡村振兴上来.2021年作为巩固脱贫攻坚成果同乡村振兴有效衔接的第一年,自治区有关部门正在积极谋划与开展乡村振兴战略 ...

  8. 【编译原理笔记05】语法分析:FIRST集和FOLLOW集的计算,[非]递归的预测分析法,预测分析中的错误处理

    本次笔记内容: 4-4 FIRST集和FOLLOW集 4-5 递归的预测分析法 4-6 非递归的预测分析法 4-7 预测分析法中的错误处理 本节课幻灯片,见于我的 GitHub 仓库:第5讲 语法分析 ...

  9. 4.2.5 预测分析法与预测分析表的构造

    4.2.5 预测分析法与预测分析表的构造 预测分析法也称为 LL ( 1 )分析法.这种分析法是确定的自上而下分析的另一种方法,采用这种方法进行语法分析要求描述语言的文法是 LL ( 1 )文法. 一 ...

最新文章

  1. linux系统中的文件传输
  2. 图像降噪算法——Variance Stabilizing Transform / Generalization Anscombe Transform算法
  3. codevs 3054 高精度练习-文件操作
  4. 生产者-消费者模式的实现
  5. 表单组件中state依赖props
  6. php-fpm 进程数和 cpu,关于PHP的 PHP-FPM进程CPU 100%的分析和解决
  7. 在ccs中添加芯片_985博导团队重大成果,涉及隐私保护领域,已在腾讯与京东、快手的业务中应用...
  8. 服务器内存 知乎_服务器内存和普通内存有什么区别?可以通用吗?
  9. 手把手教你整合最优雅SSM框架
  10. java微服务实战.pdf_Spring微服务实战 ([美]约翰·卡内尔) 中文完整pdf扫描版[172MB]...
  11. 计算机上没有系统软件应用软件也一样能使用,2010判断题一般双击桌面上的程序图标可以打开该程序...
  12. Python学习教程:爬虫分析了京东内衣销售记录,哪个size最多?
  13. Veritas Backup Exec 21.3 Multilingual (Windows)
  14. 疯狂的程序员 21-30
  15. 图像处理:图像灰度化
  16. 用java求两个数的最大公因数_Java求两个数的最大公约数及最小公倍数、求多个数的最大公约数及最小公倍数...
  17. 初次软件开发(总结篇 之二)_-Chaz-_新浪博客
  18. 最近很火的养猫小程序—365赚钱宝小程序源码
  19. 前端基于excljs导出xlsx时图片资源的处理及踩坑实录
  20. PL_SQL模块学习之十六、记录

热门文章

  1. 叶子结点和分支节点_结点数和叶子结点数有什么区别
  2. 基于CKEditor网页富文本编辑工具转PDF文件的技术预研分析报告
  3. 微软游戏服务器断网,惊了!Win10出现断网问题,微软居然让你自己解决?
  4. 趣节点:互联网信息大爆炸时代,企业品牌口碑营销需要注意什么?
  5. 使用Python爬取CSDN历史博客文章列表,并生成目录
  6. C# 特性Description的值的获取
  7. swagger2 description is deprecated
  8. 开发工程师的人生是这样的
  9. J2SE自学(二)——开发工具Eclipse
  10. 过年回家和小朋友玩什么