前言
传统的机器算法一般处理的是结构化数据,而结构化数据中往往包含以下几种类别:
传统的机器学习算法
SVM,LR,lightgbm,xgboost等
结构化数据类别
Categorical,类别型变量
Numeric,连续型变量
Datetime,时间型时间变量
Timestamp, 时间戳型时间变量(本文不做讨论)
Longitude and latitude, 经纬度类型变量(本文不做讨论)
一、类别型变量
通常来说,传统的机器学习算法只能应对于连续型变量,也就是我们常说的全是数字的数据集,那对于类别型变量,我们需要做的是进行合理的编码(encode),将类别型变量转换成连续型变量即可。
而类别型变量其实又可以分为两种,如下所示:
任务背景1:比如我们需要通过分析高铁上乘客的一些特征数据,然后有选择性的给部分乘客推销***产品,其中有一维特征是乘坐的座位类型。
高铁座位 |
---|
三等座 |
二等座 |
一等座 |
特等座 |
对于座位等级来说,我们可以分为3,2,1,特等座四个类别,而且明显这类类别型的特征可以称之为有序型类型特征,我们可以简单的进行如下编码:
高铁座位 | 编码后座位 |
---|---|
三等座 | 0 |
二等座 | 1 |
一等座 | 2 |
特等座 | 3 |
直观的感受来看,我们可以认为高铁座位特征值越大,代表该乘客的购买能力相对更强。
任务背景2:通过分析学生的一些基本信息来选择性的给学生提供不同类型的上课方式(或老师),其中有一维特征是该生喜欢的颜色。
喜爱颜色 |
---|
红色 |
蓝色 |
绿色 |
粉色 |
心理学认为对不同颜色的喜好可以反应个体的不同性格特征,但是这里不同颜色之间明显就没有大小或者顺序关系,我们可以称之为无序性类别特征,对于这类型的特征,我们可以做one-hot编码,或者哑变量(dummy)编码
喜爱颜色 | one-hot编码 | 哑变量编码 |
---|---|---|
红色 | [1,0,0,0] | [0,0,0] |
蓝色 | [0,1,0,0] | [1,0,0] |
绿色 | [0,0,1,0] | [0,1,0] |
粉色 | [0,0,0,1] | [0,0,1] |
关于哑变量和热编码的差异可以自行百度。
二、时间型变量
时间类型的变量可以包含很多的信息,比如航班人流量就和月份有着非常强的联系,比如某一个火锅店的营业额就和星期几/中午/晚上有着强烈的联系,etc.
任务背景:通过分析历史某一立交桥的车流信息来预测未来某一时间段的车流情况,如果车流情况满足某一阈值,就提前发布拥堵信息给到指定vip客户.其中有一维特征是数据采集时间.
采集时间 |
---|
2021/11/23 09.00.00 |
2021/11/24 13.00.00 |
2021/11/24 18.30.00 |
2021/11/24 23.00.00 |
一般来说,车流量的大小和星期几,是否是假期,是否是早高峰,是否是晚高峰等有直接的关系,所以上面的原始特征我们可以进行如下转换:
采集时间_周几 | 采集时间_是否是节假日 | 采集时间_早中晚 | 采集时间_… |
---|---|---|---|
周二 | no | 早 | … |
周三 | no | 中 | … |
周三 | no | 晚 | … |
周三 | no | 凌晨 | … |
附:建模技巧
面对各种缤纷繁多的数据集,面对领导让你短时间分析这个需求是不是可以做,性能可能做到大概什么水平,面对模型调优耗时费力且无趣,你可以尝试一下hypergbm[https://github.com/DataCanvasIO/HyperGBM],简单两行代码就可以先完成个73%的任务进度。
##首先是安装hypergbm
#pip install hypergbm
from hypernets.tabular.datasets import dsutils
from sklearn.model_selection import train_test_split
from hypergbm import make_experiment
from sklearn.metrics import get_scorer
##采用自带的数据集为例
df = dsutils.load_bank()
df_train, df_test = train_test_split(df, test_size=0.2, random_state=623)
target = 'y'
## 两行代码,训练数据
exp = make_experiment(df_train,target=target,log_level='info')
estiamtor = exp.run()
##模型评估
scorer=get_scorer('accuracy')
score = scorer(estimator,df_test,df_test[target])
score
##out[]: 1
附2
这个数据含有较多类别型的特征,数据大小为(108504, 18),你可以尝试一下使用自己处理特征,自己建模的方式,看一下是否可以简单达到测试集准确度为1的结果。
All comments are more than welcome.