这里将作为整个赛程的总结。其中会遇到很多沟沟坎坎。望努力,最后通关,自己得到提升。
第一步就是参加比赛,组成队伍,确定队名我自己的编号。
这里的问题就比较多了。先说目标吧。2天时间是要跑一遍的,我的进度已经被群里的大神们甩开了。接下来就记录下我遇到的 坑吧
原先我用win10 + pycharm。结果遇到一行代码,就是baseline里的“%”。
warnings.filterwarnings('ignore')
%matplotlib inline
没见过啊,internet后发现是Jupyter的代码。于是考虑后期的更改,跟大家同步的话,果断开始配置Jupyter。
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=' ')
然后顺利看到下图,等一等,省略内容没显示全。没关系,设置一下。
添加以下命令,设定显示列数为31。这里捎带修改了行数,多看了5行。
pd.set_option('max_column', 31) # 31 is optional
Train_data.head(n=10) # display 10 rows
msno.matrix(Train_data.sample(250))
msno.bar(Train_data.sample(1000))
msno.bar is a simple visualization of nullity by column.
seaborn简单介绍
网上的回答是:
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一下吧~回头有空了,问问作者小雨姑娘是咋配置的。
先说看到基础知识
机器学习中分类与回归问题的区别与联系
【机器学习小常识】“分类” 与 “回归”的概念及区别详解
链接: 维密之维基的秘密.
链接: 经典比较篇之九:数据不正态怎么办(续)? - 张自达的文章 - 知乎
有个问题(知乎作者也提了这个问题):在进行比较分析时遇到数据不正态寻求变换是一个常规动作,但是变换后的比较结果与常规的比 较是等效的吗?我没有答案,也没有找到类似的资料,希望能够有人为我解惑。
使用Box-Cox转换的益处
Box-Cox变换的目的是为了让数据满足线性模型的基本假定,即线性、正态性及方差齐性,然而经Box-Cox变换后数据是否同时满足了以上假定,仍需要考察验证。
第一,数据变换并不能解决所有非正态性的问题。
第二,对数据进行变换后,重新进行原来计划的统计检验,其意义会发生变化。
学习连接
Seaborn-05-Pairplot多变量图
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分钟包你搞懂箱形图分析!
学习的最后安装pandas-profiling总是失败,更改了镜像源为国内,秒成,真酸爽。以下是命令。
pip install -i https://mirrors.aliyun.com/pypi/simple/ pandas-profiling
生成报告的时间很久,大概跑了一个小时多。但是报告内容还是很多。报告warnings里里有很多信息和结论,包括那几个值相关程度是多少,都有了一些初步结论。
在Jupyter Notebook中,如果使用Matplotlib绘图,有时是弹不出图像框的,此时,可以在开头加入%matplotlibinline
所给出的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 我们不被这些杂乱的工具与系统所迷惑,就能够发现这个过程包括两个构成机器学习基础的数学实体:模型和特征。
这一部分对于我来说第一次接触,我仅能从概念上给我的队长们提供一些思路,更多的是见识更宽广的数据世界。一种淹没在数据海洋的感觉。而python啊,numpy啊,pandas等就是我的装备。我要不断学习他们,升级他们,让我能更好的在数据中遨游。
注意很重要的问题,数据很脏,要洗数据。
对于匿名特征的处理要点多尝试,筛选~如多项式运算等;对于显性特征就可以多做一些组合。
理解评测标准,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用户是不是有关系。
先写baseline,看得分。然后修修补补,加减特种,优化提升。最后组队出精品。
有个很大的思维导图
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包
正态分布,随机森林模型,特征工程,指数分布,求log,筛选特征先做eda,
统计量,个数count,平均值mean,方差std,最小值min,中位数25,50,75%,以及最大值max
了解数据每列的type,有助于了解是否存在除了nan以外的特殊符号异常。
[1]^ NaN(Not a Number,非数)是计算机科学中数值数据类型的一类值,表示未定义或不可表示的值。常在浮点数运算中使用。首次引入NaN的是1985年的IEEE 754浮点数标准。
non-null -
is_null函数查看缺失。
seaborn johnson su方法
画出热力图heatmap() (带来一个复共线性的问题,考虑剔除某些特征。如果用高级模型如随机森林,不需要剔除。)
画图比定量分析要明显。可以考虑独立性验证方法。
匿名特征可以用PCA降维吗?尽量不要,会损失信息。
object是pandas预定好的类。
1异常处理:
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,因为其包含交叉验证,并且可以判别欠拟合和过拟合情况,从而反过来指导特征工程;也有同学每次改特征工程,跑模型,搞到最后,代码越来越混乱,都不知道哪个模型效果好了的情况发生。
目的:探索数据,了解数据,主要在 EDA 阶段完成。
四个层次:结论,解读,描述,数据。
目的:提高数据质量,降低算法用错误数据建模的风险
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. 过滤式(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) 将小类视为异常点,并用异常检测建模。
删除异常值
特征构造
数据分桶
在评论里的是one–hot编码的优点
归一化
要用训练集的最大值,而不是所有数据的最大值。
one-hot编码
特征选择:过滤式
用sperman,没用另一个是因为它要求服从正太分布
特征选择:包裹式
Q:Xgboost处理分类特征时要做one-hot编码吗,尤其是对于汽车品牌这种很
重要的特征,但one-hot编码后特征维度却很高,导致运行速度超级慢,有固
定的方法吗?还是说要分别进行一次编码和一次不编码,每遇到一次这个问
题都要自己试一遍?
A:决策树模型不推荐对离散特征进行 one-hot。 主要有两个原因:
• 会产生样本切分不平衡问题:本来特征是红的白的绿的,现在变为是否红的、是否白的、
是否绿的。只有少量样本为 1,大量样本为 0。这种特征的危害是:
• 本来节点的划分增益还可以,但是拆分后的特征,占总样本的比例小的特征,所以
无论增益多大,乘以该比例之后会很小,
• 占比例大的特征其增益也几乎为 0,影响模型学习;
• 影响决策树学习:决策树依赖的是数据的统计信息,one-hot 会把数据切分到零散的小空
间上,在这些零散的小空间上,统计信息是不准确的,并且围绕小部分数据展开,有过拟
合倾向。
其本质在于,特征的预测能力被人为的拆分成多份,每一份与其他特征竞争最优划分节点时都
会失败,所以特征的重要性会比实际值低。
PS:如果类别特征比较多的话,可以去使用 CatBoost;
如果想用one-hot试验的话可以使用别数量小的。
(to be continue)需要等到有回放的时候再细化补充。ppt也还没来得及看