1st Competition of Datawhale: the car price prediction

1st Competition of Datawhale: the car price prediction

  • Task1 参赛组队
  • Task 2 初步EDA,学习成果以blog的形式进行沉淀
    • 先说环境配置
    • 环境舒服了就开始过baseline
      • 坑一# 数据文件地址
    • 如何查看隐藏列
    • 坑二# 老版本pdf格式的文档代码查看不全。转战到天池的官方维护文档去。而且还是最新的版本五。
    • 理解missingno工具
    • 理解seaborn工具
    • 又遇到一个小插曲,关于显示行数。
    • 又遇到数学的坑(Johnson Su变换、Box-Cox等)
      • Johnson Su
      • Box-Cox
      • 关于峰度Kurtosis偏度Skewness
      • 关于箱型图和小提琴图科普
      • 最后出的报告
    • task2的总结
      • 以下是官方文档的2.4 经验总结(需要学习的部分加粗标出)
  • 参考资料:精通特征工程一书
  • 3月23号晚上直播内容知识
    • 关于 ML67 的讲座一
      • 1赛题理解
      • 2baseline
      • 3整体总结
    • 关于小雨姑娘的讲座
      • part1 探索性数据分析EDA
      • part2 Q&A
      • part3 代码实战
        • **data.describe()**
        • **data.info()**
        • **回执数据分布**
        • **统计数值变量相关性**
        • **统计特征的偏度与峰度**
        • **绘制特征之间的关系图**
  • task3 特征工程
    • 常见的特征工程包括:
      • xgboost学习
    • 代码学习阶段
    • 经验总结
  • 3月26日晚上直播
    • part1 特征工程
      • 数据理解
      • 数据清洗
    • 特征构造
    • 特征选择
    • 类别不平衡
    • part2
      • 代码实战
    • Part3 Q&A

这里将作为整个赛程的总结。其中会遇到很多沟沟坎坎。望努力,最后通关,自己得到提升。

Task1 参赛组队

第一步就是参加比赛,组成队伍,确定队名我自己的编号。

  1. 我在3群,编号113。
  2. 队长队友都很好,早早就把baseline贴出来了。但是无奈信息对于我这个新手来说还是太多了。
  3. 3-27更新:Markdown文本的格式说明

Task 2 初步EDA,学习成果以blog的形式进行沉淀

这里的问题就比较多了。先说目标吧。2天时间是要跑一遍的,我的进度已经被群里的大神们甩开了。接下来就记录下我遇到的 坑吧

先说环境配置

原先我用win10 + pycharm。结果遇到一行代码,就是baseline里的“%”。

warnings.filterwarnings('ignore')
%matplotlib inline

没见过啊,internet后发现是Jupyter的代码。于是考虑后期的更改,跟大家同步的话,果断开始配置Jupyter。

  • 导入了一些没有的库,如lightgbm xgboost missingno;
  • 360浏览器默认打开Jupyter让我很不爽,更改为chrome (https://cloud.tencent.com/developer/article/1420759)
  • Jupyter原来配色太刺眼,添加theme,并修改字体
    • pip install --upgrade jupyterthemes
    • jt -t oceans16 -f fira -fs 12 -cellw 90% -ofs 10 -dfs 11 -T (修改了一堆没用过的参数)
  • IPython 因为导入不正确又用terminal导入了一遍。
  • Jupyter的快捷键链接

环境舒服了就开始过baseline

坑一# 数据文件地址

copy代码进去发现两个错误:出现了FileNotFoundError

Train_data = pd.read_csv('datalab/231784/used_car_train_20200313.csv', sep=' ')
TestA_data = pd.read_csv('datalab/231784/used_car_testA_20200313.csv', sep=' ')
```-
回去找datalab,看不懂了。没见到Jupyter环境里有个datalab的库或者文件夹。
```javascript
# 查看数据文件目录 list datalab files
!ls datalab/

链接: 知乎上有关于这个"!"感叹号的说明。这里埋伏了shell与IDLE的交互问题
datalab的问题,是队长找到了datalab是天池上数据的文件夹名称,是对于天池参赛队伍的。
我后来反应过来,感觉像是服务器实验室之类的数据空间,供大家调用之类的。

前期队长down下来了csv数据。这里就把地址更改为本地地址。(主要是我的Jupyter的工作目录页比较深)

## 通过Pandas对于数据进行读取 (pandas是一个很友好的数据读取函数库)
Train_data = pd.read_csv('C:/Users/***/Desktop/DataWhale/Jupyter_datawhale/used_car_train_20200313.csv', sep=' ')
TestA_data = pd.read_csv('C:/Users/***/Desktop/DataWhale/Jupyter_datawhale/used_car_testA_20200313.csv', sep=' ')

如何查看隐藏列

然后顺利看到下图,等一等,省略内容没显示全。没关系,设置一下。
1st Competition of Datawhale: the car price prediction_第1张图片
添加以下命令,设定显示列数为31。这里捎带修改了行数,多看了5行。

pd.set_option('max_column', 31)  # 31 is optional
Train_data.head(n=10)  # display 10 rows

1st Competition of Datawhale: the car price prediction_第2张图片

坑二# 老版本pdf格式的文档代码查看不全。转战到天池的官方维护文档去。而且还是最新的版本五。

理解missingno工具

msno.matrix(Train_data.sample(250)) 
  • 无效矩阵的数据密集显示,理解了中间黑色的部分意思是满的,白色部分是缺失的。同时右侧的The sparkline(迷你图) at right summarizes the general shape of the data completeness and points out the rows with the maximum and minimum nullity(无效[数] 零度;退化阶数) in the dataset.
  • This visualization will comfortably accommodate up to 50 labelled variables. Past that range labels begin to overlap or become unreadable, and by default large displays omit them.最多显示50列,超出会隐藏。
  • 经过讨论,sample带有shuffle性质,及时每次n=250显示的图也不一样。说明抽样250个,而非抽取前250个。去掉sample()函数后,显示的图就一样了。
msno.bar(Train_data.sample(1000)) 

msno.bar is a simple visualization of nullity by column.

  • Train_data[‘notRepairedDamage’].replace(’-’, np.nan, inplace=True)
    inplace参数的理解: 当修改一个对象时:
    inplace=True:不创建新的对象,直接对原始对象进行修改;
    inplace=False:对数据进行修改,创建并返回新的对象承载其修改结果。

理解seaborn工具

seaborn简单介绍

又遇到一个小插曲,关于显示行数。

1st Competition of Datawhale: the car price prediction_第3张图片
1st Competition of Datawhale: the car price prediction_第4张图片

网上的回答是:
pd.set_option()不能这么用,set_option的内部方法是这样的:

set_option = CallableDynamicDoc(_set_option, _set_option_tmpl)

CallableDynamicDoc的声明如下:

class CallableDynamicDoc:
    def __init__(self, func, doc_tmpl):
        self.__doc_tmpl__ = doc_tmpl
        self.__func__ = func 
    def __call__(self, *args, **kwds):
        return self.__func__(*args, **kwds)
 
    @property
    def __doc__(self):
        opts_desc = _describe_option("all", _print_desc=False)
        opts_list = pp_options_list(list(_registered_options.keys()))
        return self.__doc_tmpl__.format(opts_desc=opts_desc, opts_list=opts_list)

第二个参数不是最多可以查看的行数,是内部设置的一个模板参数。默认填None就行了。
感觉进坑了,先出来,mark一下吧~回头有空了,问问作者小雨姑娘是咋配置的。

又遇到数学的坑(Johnson Su变换、Box-Cox等)

先说看到基础知识
机器学习中分类与回归问题的区别与联系
【机器学习小常识】“分类” 与 “回归”的概念及区别详解

Johnson Su

链接: 维密之维基的秘密.
链接: 经典比较篇之九:数据不正态怎么办(续)? - 张自达的文章 - 知乎
有个问题(知乎作者也提了这个问题):在进行比较分析时遇到数据不正态寻求变换是一个常规动作,但是变换后的比较结果与常规的比 较是等效的吗?我没有答案,也没有找到类似的资料,希望能够有人为我解惑。

Box-Cox

使用Box-Cox转换的益处
Box-Cox变换的目的是为了让数据满足线性模型的基本假定,即线性、正态性及方差齐性,然而经Box-Cox变换后数据是否同时满足了以上假定,仍需要考察验证。

第一,数据变换并不能解决所有非正态性的问题。
第二,对数据进行变换后,重新进行原来计划的统计检验,其意义会发生变化。

关于峰度Kurtosis偏度Skewness

学习连接
Seaborn-05-Pairplot多变量图

关于箱型图和小提琴图科普

1st Competition of Datawhale: the car price prediction_第5张图片
箱型图和小提琴图

plt.boxplot(all_data,
   notch=True,  # box instead of notch shape  中位数线两侧会出现剪切 
        # notch n.等级;档次;位阶;(表面或边缘的)V形刻痕,圆形切口 v.
              赢取;获得;(在表面或边缘)V形痕,刻下切口
   sym='rs',  # red squares for outliers	颜色形状
   vert=True)  # vertical box aligmnent   竖版

5分钟包你搞懂箱形图分析!

  • 在上文中,有箱型图四分位数的计算公式
    (1)确定四分位数的位置。Qi所在位置=i(n+1)/4,其中i=1,2,3。n表示序列中包含的项数。
    (2)根据位置,计算相应的四分位数。(相邻两数要求平均,如下四分位数位置为3.75,则下四分位数=0.25第三项+0.75第四项)
  • 着重注意异常值的划分区间,即箱型图的上下限。上限=Q3+1.5IQR;下限=Q1-1.5IQR
  • 文中提到的箱型图的价值3点,以及对应的缺点。(其中有一条是数据抗性,定性理解。)

最后出的报告

学习的最后安装pandas-profiling总是失败,更改了镜像源为国内,秒成,真酸爽。以下是命令。

pip install -i https://mirrors.aliyun.com/pypi/simple/ pandas-profiling

生成报告的时间很久,大概跑了一个小时多。但是报告内容还是很多。报告warnings里里有很多信息和结论,包括那几个值相关程度是多少,都有了一些初步结论。

task2的总结

在Jupyter Notebook中,如果使用Matplotlib绘图,有时是弹不出图像框的,此时,可以在开头加入%matplotlibinline

以下是官方文档的2.4 经验总结(需要学习的部分加粗标出)

所给出的EDA步骤为广为普遍的步骤,在实际的不管是工程还是比赛过程中,这只是最开始的一步,也是最基本的一步。接下来一般要结合模型的效果以及特征工程等来分析数据的实际建模情况,根据自己的一些理解,查阅文献,对实际问题做出判断和深入的理解。最后不断进行EDA与数据处理和挖掘,来到达更好的数据结构和分布以及较为强势相关的特征。

数据探索在机器学习中我们一般称为EDA(Exploratory Data Analysis):

是指对已有的数据(特别是调查或观察得来的原始数据)在尽量少的先验假定下进行探索,通过作图、制表、方程拟合、计算特征量等手段探索数据的结构和规律的一种数据分析方法。

数据探索有利于我们发现数据的一些特性,数据之间的关联性,对于后续的特征构建是很有帮助的。

对于数据的初步分析(直接查看数据,或.sum(), .mean(),.descirbe()等统计函数)可以从:样本数量,训练集数量,是否有时间特征,是否是时许问题,特征所表示的含义(非匿名特征),特征类型(字符类似,int,float,time),特征的缺失情况(注意缺失的在数据中的表现形式,有些是空的有些是”NAN”符号等),特征的均值方差情况。

分析记录某些特征值缺失占比30%以上样本的缺失处理,有助于后续的模型验证和调节,分析特征应该是填充填充方式是什么,均值填充,0填充,众数填充等),还是舍去,****还是先做样本分类用不同的特征模型去预测。

对于异常值做专门的分析,分析特征异常的label是否为异常值(或者偏离均值较远或者事特殊符号),异常值是否应该剔除,还是用正常值填充,是记录异常,还是机器本身异常等。

对于Label做专门的分析,分析标签的分布情况等。

进步分析可以通过对特征作图,特征和label联合做图(统计图,离散图),直观了解特征的分布情况,通过这一步也可以发现数据之中的一些异常值等,通过箱型图分析一些特征值的偏离情况,对于特征和特征联合作图,对于特征和label联合作图,分析其中的一些关联性。
以上段落对我而言有抽象的部分,我个人还无法完全理解。需要对于“特征”所缺失的知识和视角做一个总结,方便后期入坑:
1数学知识上打基础,主要是大体概念和性质用途,如各个统计指标以及响应的统计图表知识,方便后期清洗数据;
2对于pandas,seaborn等库工具的运用,方便得到各种特征以及数据变化;
3需要加深对数据特征的理解:这个主要是train集中的数据的特征的学习,知道有哪些特征可以怎么用,代表什么,怎么样去变换等
4花一部分时间去思考模型:怎么洗数据,洗白后怎么去构造算法模型(贪心算法,竞争算法,神经网络,随机森林算法啊,~~后两个我都不懂(⊙_⊙)?)

参考资料:精通特征工程一书

1.2 我们不被这些杂乱的工具与系统所迷惑,就能够发现这个过程包括两个构成机器学习基础的数学实体:模型和特征。

3月23号晚上直播内容知识

这一部分对于我来说第一次接触,我仅能从概念上给我的队长们提供一些思路,更多的是见识更宽广的数据世界。一种淹没在数据海洋的感觉。而python啊,numpy啊,pandas等就是我的装备。我要不断学习他们,升级他们,让我能更好的在数据中遨游。

关于 ML67 的讲座一

1赛题理解

注意很重要的问题,数据很脏,要洗数据。
对于匿名特征的处理要点多尝试,筛选~如多项式运算等;对于显性特征就可以多做一些组合。
理解评测标准,MAE还是比较好理解的。(对于二类分类器算法评价指标:accuracy,precision,recall,f-score,pr曲线,roc-auc曲线;对于多类分类器算法评价指标:accuracy,宏平均和微平均,f-score。这些指标都需要再查看资料消化理解。)
对于回归类预测常见指标:MAE,MSE,MAPE,RMSE,R2.后三个需要去了解其数学表达式。
xgb,lgb,catboost做比赛常用工具包 pandas,numpy,matplotlib,seabon,sklearn,keras灯常用库和框架
EDA = exploratory data analysis
对于回归问题,注意两个问题:对数据的分析,构建特征;选择一个好的模型达到效果。
赛题理解究竟理解什么:问题分类,回归问题。
有了赛题理解能做啥:读取数据,看分布。
赛题北京中可能潜在隐藏的条件:漂移,清洗,ctr,购买行为逻辑。AB用户是不是有关系。

2baseline

先写baseline,看得分。然后修修补补,加减特种,优化提升。最后组队出精品。

  • step1:导入函数工具箱
  • step2:读取数据(小EDA)
  • step3:特征与标签构建。(做了一部分粗糙的特征筛选。后续可以做很多扩充。缺省值填补,对特征标签的eda)理论概念不足,要补很多。
  • step4:模型训练与预测:xgb五折交叉验证(防止数据过拟合的方式)(xgb,lgb最常用的)(时间够的话,用网格搜索的方式,调配各个参数,得到最好的参数组合。)(切分数据集4:1方式切分,训练集和验证集。)(模型融合。加权等方式。)
  • step5:结果输出

3整体总结

有个很大的思维导图

关于小雨姑娘的讲座

part1 探索性数据分析EDA

eda的5个目标:
1,look at data to see what it seems to say
2,uncover underlying structures
3,isolate important variables
4,detect outliers (异类; 异常值; 离群值; 局外人; 离群点)and other anomalies(异常事物; 反常现象英[əˈnɒməliz])
5,suggest suitable models for conventional statistics.
绘图方法:
时序图,散点图,直方图,小提琴图,箱型图
特征一块画出来,对比异同。
量化方法:
特征的统计性表述:偏度,峰度,方差,均值。取值范围;分布;
相关性分析
1定类变量:名义型变量;性别,车品牌
2定序变量:不仅分类,还按照某种特性排序;两值的差无意义;教育程度。
3定距变量:可比较大小、差有意义的变量。

------- 定类 定序 定距
定类 卡方类测量(信息熵) 卡方类测量(信息熵) Eta系数
定序 spearman相关数;同序-异序对测量 spearman相关系数
定距 pearson相关系数

独立性分析
当两个变量之间不独立时,不一定相关。
当他们相关的时候,他们一定不独立。
变量间无线性相关,还可能存在非线性关联。
github里,附成了一个python包

part2 Q&A

正态分布,随机森林模型,特征工程,指数分布,求log,筛选特征先做eda,

part3 代码实战

data.describe()

统计量,个数count,平均值mean,方差std,最小值min,中位数25,50,75%,以及最大值max

data.info()

了解数据每列的type,有助于了解是否存在除了nan以外的特殊符号异常。
[1]^ NaN(Not a Number,非数)是计算机科学中数值数据类型的一类值,表示未定义或不可表示的值。常在浮点数运算中使用。首次引入NaN的是1985年的IEEE 754浮点数标准。
non-null -
is_null函数查看缺失。

回执数据分布

seaborn johnson su方法

统计数值变量相关性

画出热力图heatmap() (带来一个复共线性的问题,考虑剔除某些特征。如果用高级模型如随机森林,不需要剔除。)

统计特征的偏度与峰度

绘制特征之间的关系图

画图比定量分析要明显。可以考虑独立性验证方法。
匿名特征可以用PCA降维吗?尽量不要,会损失信息。
object是pandas预定好的类。

task3 特征工程

常见的特征工程包括:

1异常处理:

  • 通过箱线图(或 3-Sigma)分析删除异常值;(这个已经有概念,但是代码操作)
  • BOX-COX 转换(处理有偏分布);
  • 长尾截断;
    2特征归一化/标准化:
  • 标准化(转换为标准正态分布);
  • 归一化(抓换到 [0,1] 区间);
  • 针对幂律分布,可以采用公式: log[(1+x)/(1+median)]
    3数据分桶:
  • 等频分桶;
  • 等距分桶;
  • Best-KS 分桶(类似利用基尼指数进行二分类);
  • 卡方分桶;
    4缺失值处理:
  • 不处理(针对类似 XGBoost 等树模型);
  • 删除(缺失数据太多);
  • 插值补全,包括均值/中位数/众数/建模预测/多重插补/压缩感知补全/矩阵补全等;
  • 分箱,缺失值一个箱;
    5特征构造:
  • 构造统计量特征,报告计数、求和、比例、标准差等;
  • 时间特征,包括相对时间和绝对时间,节假日,双休日等;
  • 地理信息,包括分箱,分布编码等方法;
  • 非线性变换,包括 log/ 平方/ 根号等;
  • 特征组合,特征交叉;
  • 仁者见仁,智者见智。
    6特征筛选
  • 过滤式(filter):先对数据进行特征选择,然后在训练学习器,常见的方法有 Relief/方差选择发/相关系数法/卡方检验法/互信息法;
  • 包裹式(wrapper):直接把最终将要使用的学习器的性能作为特征子集的评价准则,常见方法有 LVM(Las Vegas Wrapper) ;
  • 嵌入式(embedding):结合过滤式和包裹式,学习器训练过程中自动进行了特征选择,常见的有 lasso 回归;
    7降维
  • PCA/ LDA/ ICA;
  • 特征选择也是一种降维。

xgboost学习

xgboost浅析
xgboost详解,有点太详细,太数学了,留着看吧
https://www.bilibili.com/video/BV1mZ4y1j7UJ?from=search&seid=450600465213253658

代码学习阶段

所有的代码都执行顺利直到这一条。因为没有安装好mlxtend。因为task2中的学习,我更换了国内镜像,安装成功了。但是却出现了错误。

# k_feature 太大会很难跑,没服务器,所以提前 interrupt 了
# !pip install mlxtend  # 不要点,下载速度很慢
 from mlxtend.feature_selection import SequentialFeatureSelector as SFS
from sklearn.linear_model import LinearRegression
sfs = SFS(LinearRegression(),
           k_features=10,
           forward=True,
           floating=False,
           scoring = 'r2',
           cv = 0)
x = data.drop(['price'], axis=1)
x = x.fillna(0)
y = data['price']
sfs.fit(x, y)
sfs.k_feature_names_ 

ValueError: Input contains NaN, infinity or a value too large for dtype(‘float64’).
经过群里讨论,大家的意见是:city有个str类型的空值或nan值,他这里应该是用的回归的模块,回归模块的数据里面不能有nan的,要不处理不了,树模型的可以有。这个留到以后理解~~

经验总结

(以下摘自教材)
特征工程是比赛中最至关重要的的一块,特别的传统的比赛,大家的模型可能都差不多,调参带来的效果增幅是非常有限的,但特征工程的好坏往往会决定了最终的排名和成绩。

特征工程的主要目的还是在于将数据转换为能更好地表示潜在问题的特征,从而提高机器学习的性能。比如,异常值处理是为了去除噪声,填补缺失值可以加入先验知识等。

特征构造也属于特征工程的一部分,其目的是为了增强数据的表达。

有些比赛的特征是匿名特征,这导致我们并不清楚特征相互直接的关联性,这时我们就只有单纯基于特征进行处理,比如装箱,groupby,agg 等这样一些操作进行一些特征统计,此外还可以对特征进行进一步的 log,exp 等变换,或者对多个特征进行四则运算(如上面我们算出的使用时长),多项式组合等然后进行筛选。由于特性的匿名性其实限制了很多对于特征的处理,当然有些时候用 NN 去提取一些特征也会达到意想不到的良好效果。

对于知道特征含义(非匿名)的特征工程,特别是在工业类型比赛中,会基于信号处理,频域提取,丰度,偏度等构建更为有实际意义的特征,这就是结合背景的特征构建,在推荐系统中也是这样的,各种类型点击率统计,各时段统计,加用户属性的统计等等,这样一种特征构建往往要深入分析背后的业务逻辑或者说物理原理,从而才能更好的找到 magic。

当然特征工程其实是和模型结合在一起的,这就是为什么要为 LR NN 做分桶和特征归一化的原因,而对于特征的处理效果和特征重要性等往往要通过模型来验证。

总的来说,特征工程是一个入门简单,但想精通非常难的一件事。

说一下我的理解,特征工程应该是深度挖掘数据的数学特点,后期的拟合和过拟合也是基于数据的特点,找出可能的趋势。判别模型好坏,群里有人一般用learning curve,因为其包含交叉验证,并且可以判别欠拟合和过拟合情况,从而反过来指导特征工程;也有同学每次改特征工程,跑模型,搞到最后,代码越来越混乱,都不知道哪个模型效果好了的情况发生。

3月26日晚上直播

part1 特征工程

数据理解

目的:探索数据,了解数据,主要在 EDA 阶段完成。

  1. 定性数据:描述性质
    a) 定类:按名称分类——血型、城市
    b) 定序:有序分类——成绩(A B C)
  2. 定量数据:描述数量
    a) 定距:可以加减——温度、日期
    b) 定比:可以乘除——价格、重量

四个层次:结论,解读,描述,数据。

数据清洗

目的:提高数据质量,降低算法用错误数据建模的风险
1.特征变换:模型无法处理或不适合处理
a) 定性变量编码:Label Encoder;Onehot Encoder;Distribution coding;
b) 标准化和归一化:z分数标准化(标准正太分布)、min-max 归一化;
2.缺失值处理:增加不确定性,可能会导致不可靠输出
a) 不处理:少量样本缺失;
b) 删除:大量样本缺失;
c) 补全:(同类)均值/中位数/众数补全高维映射(One-hot);模型预测;最邻近补全;矩阵补全(R-SVD)
3.异常值处理:减少脏数据
a)简单统计:如describe()的统计描述;散点图等
b)3 ∂ 法则(正太分布)/箱型图删除、截断;
c) 利用模型进行离群点检测:聚类、K近邻、One Class SVM、Isolation Forest;

4.其他:删除无效列/更改dtypes/删除列中的字符串/将时间戳从字符串转换为日期时间格式等

特征构造

目的:增加数据表达,添加先验知识。

  1. 统计量特征:
    a) 计数、求和、比例、标准差;
  2. 时间特征:
    a) 绝对时间、相对时间、节假日、双休日;
  3. 地理信息:
    a) 分桶
  4. 非线性变换:
    a) 取 log/平方/根号;
  5. 数据分桶:
    a) 等频/等距分桶、Best-KS 分桶、卡方分桶;
  6. 特征组合

特征选择

目的:平衡预测能力和计算复杂度;降低噪声,增强模型预测性能。
1. 过滤式(Filter):先用特征选择方法对初识特征进行过滤然后再训练学习器,特征
选择过程与后续学习器无关。
a) Relief/方差选择/相关系数/卡方检验/互信息法
2. 包裹式(Wrapper):直接把最终将要使用的学习器的性能作为衡量特征子集的评
价准则,其目的在于为给定学习器选择最有利于其性能的特征子集。
a) Las Vegas Wrapper(LVM)
3. 嵌入式(Embedding):结合过滤式和包裹式方法,将特征选择与学习器训练过程
融为一体,两者在同一优化过程中完成,即学习器训练过程中自动进行了特征选择。
a) LR+L1或决策树

类别不平衡

缺点:少类别提供信息太少,没有学会如何判别少数类。
1.扩充数据集
2.尝试其他评价指标:AUC等。
3.调整θ值。
4重采样:过采样/欠采样
5合成样本:SMOTE
6 选择其他模型:决策树等。
7加权少类别的样本错分代价;
8创新:a) 将大类分解成多个小类;b) 将小类视为异常点,并用异常检测建模。

part2

代码实战

删除异常值

特征构造

数据分桶
在评论里的是one–hot编码的优点

归一化
要用训练集的最大值,而不是所有数据的最大值。

one-hot编码
特征选择:过滤式

用sperman,没用另一个是因为它要求服从正太分布

特征选择:包裹式

Part3 Q&A

Q:Xgboost处理分类特征时要做one-hot编码吗,尤其是对于汽车品牌这种很
重要的特征,但one-hot编码后特征维度却很高,导致运行速度超级慢,有固
定的方法吗?还是说要分别进行一次编码和一次不编码,每遇到一次这个问
题都要自己试一遍?
A:决策树模型不推荐对离散特征进行 one-hot。 主要有两个原因:
• 会产生样本切分不平衡问题:本来特征是红的白的绿的,现在变为是否红的、是否白的、
是否绿的。只有少量样本为 1,大量样本为 0。这种特征的危害是:
• 本来节点的划分增益还可以,但是拆分后的特征,占总样本的比例小的特征,所以
无论增益多大,乘以该比例之后会很小,
• 占比例大的特征其增益也几乎为 0,影响模型学习;
• 影响决策树学习:决策树依赖的是数据的统计信息,one-hot 会把数据切分到零散的小空
间上,在这些零散的小空间上,统计信息是不准确的,并且围绕小部分数据展开,有过拟
合倾向。
其本质在于,特征的预测能力被人为的拆分成多份,每一份与其他特征竞争最优划分节点时都
会失败,所以特征的重要性会比实际值低。
PS:如果类别特征比较多的话,可以去使用 CatBoost;
如果想用one-hot试验的话可以使用别数量小的。

(to be continue)需要等到有回放的时候再细化补充。ppt也还没来得及看

你可能感兴趣的:(1st Competition of Datawhale: the car price prediction)