【Mathorcup杯大数据挑战赛复赛 A题 二手车估价】复赛思路及Python实现

本文涉及的产品
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: Mathorcup杯大数据挑战赛复赛A题“二手车估价”问题的解题思路和Python实现,包括数据预处理、特征工程、模型训练和预测结果的存储,主要使用了LightGBM模型进行交易周期的预测。

更新时间:2022年3月10号8:30
比赛已经结束,请查看比赛总结,此文章不再更新

1.png

题目

问题一:在初赛问题 2 的基础上,如果需要你们对车辆的成交周期进行准确预估,你们会采取什么方式建模?请你们使用附件 4“门店交易训练数据”构建交易周期预测模型,并对附件 5“门店交易验证数据”进行预测,并将预测结果保存在附件 6“门店交易模型结果”文件中,注意不要修改格式。其中附件 5“门店交易验证数据”只包括附件 4“门店交易训练数据”前 1 至 4 个字段。附件 5 的所有 carid 等相关信息都包含在附件2“估价验证数据”中。

问题二:车辆在门店售卖过程中,除了要对在库车辆未来成交周期准确预测,更需要对库存(假设门店在评估周期内场地和工作人员情况保持不变)进行有效管理,以保障在成本(车辆有资金占用成本,停车位占用成本)最小化的情况下,最大化门店的销售利润。车辆的价格是影响车辆成交非常重要的因素,门店在做库存管理时,需要根据在库车辆情况、新收车辆情况,对车辆进行销售定价或调价,一方面使得热销车辆以更合适的价格成交,保全门店利润,同时也要对滞销车辆进行降价促销,以避免更大的损失,基于此,假设你们是门店的店长,你们能决策的是何时对某个车辆是否进行调价,以及调整多大幅度,以保障门店的经营目标(最小化成本的情况下,最大化门店毛利润)达成,这里不考虑员工的人力成本等成本。请你们自己抽象问题的数学模型描述,构建门店经营模型,并给出模型的求解思路和算法步骤,这里假设经营目标一个月评估一次。

根据问题 1、2 的解答完善初赛论文,明确你们的思路、模型、方法和结果。

1 思路

1.1 第一问

是一个回归问题

用附件4作为训练集,附件5作为测试集,用LGB回归模型进行回归预测,预测出来的值向上取整。涉及交易周期的计算,这点需要注意,。。。请下载完整思路

回归模型的特征构造,除了以下我提供的baseline的特征交叉,还有其他特征构造方法。如下

参考:特征构造的方法

(1)单一变量的基础转换:x, x^2,sqrt x ,log x, 缩放

(2)如果变量的分布是长尾的,应用Box-Cox转换(用log转换虽然快但不一定是一个好的选择)

(3)你也可以检查残差(Residuals)或是log-odds(针对线性模型),分析是否是强非线性。

(4)对于基数比较大的数据,对于分类变量,创造一个表示每种类别发生频率的特征是很有用的。当然,也可以用占总量的比率或是百分比来表示这些类别。

(5)对变量的每一个可能取值,估计目标变量的平均数,用结果当做创造的特征。

(6)创造一个有目标变量比率的特征。

(7)选出最重要的两个变量,并计算他们相互之间、以及与其它变量之间的二阶交叉作用并放入模型中,比较由此产生的模型结果与最初的线性模型的结果。

(8)如果你想要的解决方案更平滑,你可以应用径向基函数核(Kadial Basis function kernel) 。这就相当应用一个平滑转换。

(9)如果你觉得你需要协变量(Covariates ),你可以应用多项式核,或者明确添加它们的协变量。

(10)高基数特征:在预处理阶段,通过out-of-fold平均转换成数值变量。

。。。。

1.2 第二问

题目要求:是否降价、降价幅度、降价时间三件事的数学模型

简单思考的话,也可以是一个回归问题,要做复杂的话,是一个规划问题。因为这题是没有数据的,要以规划来做的话,就是纯理论数学建模。以下我给出的思路及实现。
。。。略,请下载完整思路
问题二完整思路及Python实现代码 下载

2 实现

2.1 TXT转CSV

import scipy.stats as st
import pandas as pd 
import seaborn as sns
from pylab import mpl 
import numpy as np
import matplotlib.pyplot as plt
from tqdm import tqdm
tqdm.pandas()
import warnings

warnings.filterwarnings('ignore')
# plt.rcParams['font.sans-serif'] = ['STSong']
# mpl.rcParams['font.sans-serif'] = ['STSong'] # 指定默认字体 
mpl.rcParams['axes.unicode_minus'] = False
import csv
import os
import pickle



data = pd.read_csv('./data/附件5:门店交易验证数据.txt',sep ='\t',header=None)
data.columns=['carid','pushDate','pushPrice','updatePriceTimeJson']
data.to_csv('./data/file5.csv',index=0)

2.2 数据预处理

df4 = pd.read_csv('./data/file4.csv')
df5 = pd.read_csv('./data/file5.csv')

(1)计算交易周期

# 去除没卖出的样本
df_trans = df4[df4.withdrawDate.notna()]

。。。。略,请下载完整代码 https://mianbaoduo.com/o/bread/YpiXlpZx

train_cols = ['pushDate','pushPrice','transcycle']
df_train = df_trans[train_cols]
test_cols = ['pushDate','pushPrice']
df_test = df5[test_cols]
df_train

2.png

import scipy.stats as st
import seaborn as sns 
import matplotlib.pyplot as plt 

plt.figure(figsize=(14, 5))
plt.subplot(122)
plt.title('正态分布拟合-已处理', fontsize=20)
sns.distplot(np.log1p(df_train['pushPrice']), kde=False, fit=st.norm)
plt.xlabel('上架价格', fontsize=20)
plt.subplot(121)
plt.title('正态分布拟合-未处理', fontsize=20)
sns.distplot(df_train['pushPrice'], kde=False, fit=st.norm)
plt.xlabel('上架价格', fontsize=20)
plt.savefig('img/上架价格正态分布拟合.png',dpi=300)

3.png

(2)提取时间特征

# # 时间处理(提取年月日)
df_train['pushDate'] = pd.to_datetime(df_train['pushDate'])
df_test['pushDate'] = pd.to_datetime(df_test['pushDate'])
df_train['pushDate_year'] = df_train['pushDate'].dt.year
df_train['pushDate_month'] = df_train['pushDate'].dt.month
df_train['pushDate_day'] = df_train['pushDate'].dt.day

df_test['pushDate_year'] = df_test['pushDate'].dt.year
df_test['pushDate_month'] = df_test['pushDate'].dt.month
df_test['pushDate_day'] = df_test['pushDate'].dt.day

del df_train['pushDate']
del df_test['pushDate']

(3)数据分布的转换

df_train['pushPrice'] = np.log1p(df_train['pushPrice'])
df_test['pushPrice'] = np.log1p(df_test['pushPrice'])
df_train.columns

Index([‘pushPrice’, ‘update_price’, ‘barging_times’, ‘barging_price’, ‘transcycle’, ‘pushDate_year’, ‘pushDate_month’, ‘pushDate_day’], dtype=‘object’)

(4)特征交叉

#定义交叉特征统计
def cross_cat_num(df, num_col, cat_col):
    for f1 in tqdm(cat_col):
        g = df.groupby(f1, as_index=False)
        for f2 in tqdm(num_col):
            feat = g[f2].agg({
                '{}_{}_max'.format(f1, f2): 'max', '{}_{}_min'.format(f1, f2): 'min',
                '{}_{}_median'.format(f1, f2): 'median',
                '{}_{}_sum'.format(f1, f2): 'sum',
                '{}_{}_mad'.format(f1, f2): 'mad',
            })
            df = df.merge(feat, on=f1, how='left')
    return(df)
### 用数值特征 与类别特征做交叉
cross_num = ['pushPrice']

cross_cat = ['pushDate_year', 'pushDate_month','pushDate_day']
data_train = cross_cat_num(df_train, cross_num, cross_cat)  # 一阶交叉
data_test = cross_cat_num(df_test, cross_num, cross_cat)  # 一阶交叉
data_train.shape

(8000, 20)

2.3 模型训练

(1)模型训练

from sklearn import metrics
from sklearn.model_selection import KFold
import lightgbm as lgb
import pandas as pd
from sklearn.model_selection import KFold

import numpy as np
from sklearn.preprocessing import StandardScaler

from sklearn.preprocessing import StandardScaler
train = data_train
test = data_test
train_y = train['transcycle']
del train['transcycle']
scaler = StandardScaler()
train_x = scaler.fit_transform(train)
test_x = scaler.fit_transform(test)

from sklearn import metrics

params = {
    'boosting_type': 'gbdt',
    'objective': 'regression_l1',
    'metric': 'mae',
    'num_leaves': 31,
    'learning_rate': 0.05,
    'feature_fraction': 0.9,
    'bagging_fraction': 0.8,
    'bagging_freq': 5,
    'verbose': -1,
}

def MAE_metric(y_true, y_pred):
    return metrics.mean_absolute_error(y_true, y_pred)
folds = 5
kfold = KFold(n_splits=folds, shuffle=True, random_state=5421)
preds_lgb = np.zeros(len(test_x))
for fold, (trn_idx, val_idx) in enumerate(kfold.split(train_x, train_y)):
    import lightgbm as lgb
    print('-------fold {}-------'.format(fold))
    x_tra, y_trn, x_val, y_val = train_x[trn_idx], train_y.iloc[trn_idx], train_x[val_idx], train_y.iloc[val_idx]

    train_set = lgb.Dataset(x_tra, y_trn)
    val_set = lgb.Dataset(x_val, y_val)
    # lgb
    lgbmodel =。。。。略,请下载完整代码

    val_pred_xgb = lgbmodel.predict(
        x_val, predict_disable_shape_check=True)
    preds_lgb += lgbmodel.predict(test_x,
                                    predict_disable_shape_check=True) / folds
    val_mae = MAE_metric(y_val, val_pred_xgb)
    print('lgb val_mae {}'.format(val_mae))

-------fold 0------- lgb val_mae 0.808706443185115 -
------fold 1------- lgb val_mae 0.955760771009792
-------fold 2------- lgb val_mae 0.897388380375197
-------fold 3------- lgb val_mae 0.883798531878621
-------fold 4------- lgb val_mae 0.878992579304203

(2)将预测结果存储为TXT

import math
file5 = pd.read_csv('./data/file5.csv')
submit_file  = pd.DataFrame(columns=['id'])
submit_file['id'] = file5['carid']
# 向上取整
submit_file['transcycle'] = [math.ceil(i) for i in list(preds_lgb)]
submit_file['transcycle'].astype(int)

i = 0
with open('./submit/附件6:门店交易模型结果.txt','a+', encoding='utf-8') as f:
    for line in submit_file.values:
        if i==0:
            i += 1
            continue
        else:
            i += 1
            f.write((str(line[0])+'\t'+str(line[1])+'\n'))
相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
目录
相关文章
|
1月前
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【10月更文挑战第4天】在大数据时代,算法效率至关重要。本文从理论入手,介绍时间复杂度和空间复杂度两个核心概念,并通过冒泡排序和快速排序的Python实现详细分析其复杂度。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1);快速排序平均时间复杂度为O(n log n),空间复杂度为O(log n)。文章还介绍了算法选择、分而治之及空间换时间等优化策略,帮助你在大数据挑战中游刃有余。
57 4
|
7天前
|
并行计算 数据挖掘 大数据
Python数据分析实战:利用Pandas处理大数据集
Python数据分析实战:利用Pandas处理大数据集
|
1月前
|
机器学习/深度学习 数据可视化 大数据
驾驭股市大数据:Python实战指南
【10月更文挑战第1天】随着信息技术的发展,投资者现在能够访问到前所未有的海量金融数据。本文将指导您如何利用Python来抓取当前股市行情的大数据,并通过分析这些数据为自己提供决策支持。我们将介绍从数据获取到处理、分析以及可视化整个流程的技术方法。
87 2
|
2月前
|
存储 大数据 索引
解锁Python隐藏技能:构建高效后缀树Suffix Tree,处理大数据游刃有余!
通过构建高效的后缀树,Python程序在处理大规模字符串数据时能够游刃有余,显著提升性能和效率。无论是学术研究还是工业应用,Suffix Tree都是不可或缺的强大工具。
48 6
|
2月前
|
机器学习/深度学习 数据挖掘 大数据
大数据时代的“淘金术”:Python数据分析+深度学习框架实战指南
在大数据时代,数据被视为新财富源泉,而从海量信息中提取价值成为企业竞争的核心。本文通过对比方式探讨如何运用Python数据分析与深度学习框架实现这一目标。Python凭借其强大的数据处理能力及丰富库支持,已成为数据科学家首选工具;而TensorFlow和PyTorch等深度学习框架则为复杂模型构建提供强有力的技术支撑。通过融合Python数据分析与深度学习技术,我们能在各领域中发掘数据的无限潜力。无论是商业分析还是医疗健康,掌握这些技能都将为企业和社会带来巨大价值。
90 6
|
1月前
|
大数据 关系型数据库 数据库
python 批量处理大数据写入数据库
python 批量处理大数据写入数据库
97 0
|
3月前
|
大数据 机器人 数据挖掘
这个云ETL工具配合Python轻松实现大数据集分析,附案例
这个云ETL工具配合Python轻松实现大数据集分析,附案例
|
3月前
|
关系型数据库 MySQL 大数据
教你使用Python玩转MySQL数据库,大数据导入不再是难题!
教你使用Python玩转MySQL数据库,大数据导入不再是难题!
|
3月前
|
分布式计算 大数据 API
|
3月前
|
数据采集 数据可视化 大数据
【优秀python大屏案例】基于python flask的前程无忧大数据岗位分析可视化大屏设计与实现
本文介绍了一个基于Python Flask框架的前程无忧大数据岗位分析可视化大屏系统,该系统通过爬虫技术采集招聘数据,利用机器学习算法进行分析,并以可视化大屏展示,旨在提高招聘市场数据分析的效率和准确性,为企业提供招聘决策支持和求职者职业规划参考。
146 2