【天池智慧海洋建设】Topline源码——特征工程学习

团队名称:天才海神号
链接:
https://github.com/fengdu78/tianchi_haiyang?spm=5176.12282029.0.0.5b97301792pLch

目录


前言

topline代码开源学习,仅关注特征工程部分,具体为输入,输出,作用、原理及部分个人理解。

I 数据部分

原始数据描述:

渔船ID:渔船的唯一识别,结果文件以此ID为标示
x: 渔船在平面坐标系的x轴坐标
y: 渔船在平面坐标系的y轴坐标
速度:渔船当前时刻航速,单位节
方向:渔船当前时刻航首向,单位度
time:数据上报时刻,单位月日 时:分
type:渔船label,三种作业类型(围网、刺网、拖网)

II 特征工程部分

方案优点

  • 简单高效,过拟合风险低。
  • 代码逻辑清晰简单,约200+行代码,可读性高,易于扩展和使用。
  • 在百万量级数据,只提取了100+有效特征,全程运行时间只有16分钟左右。
  • 特征工程中包含,时间,空间,速度,位移,相对值等各个维度的特征,全面且精简。
  • 符合现实世界中的使用要求。
    ——天才海神号团队

2.1 分箱特征

分箱特征,距离海岸线的近似值。

对v求分箱特征,等分为200份,求每一份的统计值
对x求分箱特征,1000份和10000份,求每一份的次数统计值,和每一个分箱对应不同id数目
对y求分箱特征,1000份和10000份,求每一份的次数统计值,和每一个分箱对应不同id数目
求x,y分箱后的组合特征做为分组,求对应的次数统计值,和对应的id的不同数目 根据x分组,求y距离最小y的距离 # 可以理解为距离海岸线距离
根据y分组,求x距离最小x的距离 # 可以理解为距离海岸线距离

速度进行 200分位数分箱

df['v_bin'] = pd.qcut(df['v'], 200, duplicates='drop')
df['v_bin'] = df['v_bin'].map(dict(zip(df['v_bin'].unique(), range(df['v_bin'].nunique())))) # 分箱后映射编码

x,y位置分箱1000

for f in ['x', 'y']:df[f + '_bin1'] = pd.qcut(df[f], 1000, duplicates='drop') df[f + '_bin1'] = df[f + '_bin1'].map(dict(zip(df[f + '_bin1'].unique(), range(df[f + '_bin1'].nunique()))))#编码df[f + '_bin2'] = df[f] // 10000 # 取整操作df[f + '_bin1_count'] = df[f + '_bin1'].map(df[f + '_bin1'].value_counts()) #x,y不同分箱的数量映射df[f + '_bin2_count'] = df[f + '_bin2'].map(df[f + '_bin2'].value_counts()) #数量映射df[f + '_bin1_id_nunique'] = df.groupby(f + '_bin1')['id'].transform('nunique')#基于分箱1 id数量映射df[f + '_bin2_id_nunique'] = df.groupby(f + '_bin2')['id'].transform('nunique')#基于分箱2 id数量映射

特征交叉x_bin1(2),y_bin1(2) 形成类别 统计每类数量映射到列

for i in [1, 2]:df['x_y_bin{}'.format(i)] = df['x_bin{}'.format(i)].astype('str') + '_' + df['y_bin{}'.format(i)].astype('str')df['x_y_bin{}'.format(i)] = df['x_y_bin{}'.format(i)].map(dict(zip(df['x_y_bin{}'.format(i)].unique(), range(df['x_y_bin{}'.format(i)].nunique()))))df['x_bin{}_y_bin{}_count'.format(i, i)] = df['x_y_bin{}'.format(i)].map(df['x_y_bin{}'.format(i)].value_counts())

统计x_bin1 y_bin1的最大最小值

for stat in ['max', 'min']:df['x_y_{}'.format(stat)] = df['y'] - df.groupby('x_bin1')['y'].transform(stat)df['y_x_{}'.format(stat)] = df['x'] - df.groupby('y_bin1')['x'].transform(stat)
df.head()

2.2 间隔空间位移特征

根据id分组,对x求,上一个x,下一个x,间隔2个x的距离
根据id分组,对y求,上一个y,下一个y,间隔2个y的距离
根据上述距离,求上一时刻,下一时刻,间隔2个时刻的面积,相对值
g = df.groupby('id')
for f in ['x', 'y']:#对x,y坐标进行时间平移 1 -1 2df[f + '_prev_diff'] = df[f] - g[f].shift(1)df[f + '_next_diff'] = df[f] - g[f].shift(-1)df[f + '_prev_next_diff'] = g[f].shift(1) - g[f].shift(-1)## 三角形求解上时刻1距离  下时刻-1距离 2距离
df['dist_move_prev'] = np.sqrt(np.square(df['x_prev_diff']) + np.square(df['y_prev_diff']))
df['dist_move_next'] = np.sqrt(np.square(df['x_next_diff']) + np.square(df['y_next_diff']))
df['dist_move_prev_next'] = np.sqrt(np.square(df['x_prev_next_diff']) + np.square(df['y_prev_next_diff']))
df['dist_move_prev_bin'] = pd.qcut(df['dist_move_prev'], 50, duplicates='drop')# 2时刻距离等频分箱50
df['dist_move_prev_bin'] = df['dist_move_prev_bin'].map(dict(zip(df['dist_move_prev_bin'].unique(), range(df['dist_move_prev_bin'].nunique())))
) #上一时刻映射编码

2.3 空间位移的文本特征

空间位移的文本特征,提取Word2Vec,具有前后关系

根据id分组,以xy网格特征编号作为单词,求文本特征,Word2Vec,窗口大小为10,提取10维的特征
## 前后重复提除
def get_loc_list(x):prev = ''res = []for loc in x:loc = str(loc)if loc != prev:res.append(loc)prev = locreturn res## word2Vec
size = 10
sentence = df.groupby('id')['x_y_bin1'].agg(get_loc_list).tolist()
model = Word2Vec(sentence, size=size, window=20, min_count=1, sg=1, workers=12, iter=10)
emb = []
for w in df['x_y_bin1'].unique():vec = [w]try:vec.extend(model[str(w)])except:vec.extend(np.ones(size) * -size)emb.append(vec)
emb_df = pd.DataFrame(emb)
emb_cols = ['x_y_bin1']
for i in range(size):emb_cols.append('x_y_bin1_emb_{}'.format(i))
emb_df.columns = emb_cols
emb_df.head()

同样的Word2vec方法使用,以’x_y_bin1’进行构造词向量

2.4 常见统计特征,相对值

根据v_bin和dist_move_prev_bin分组,求其他列的常见统计特征
'id': ['count'], 'x_bin1': [mode], 'y_bin1': [mode], 'x_bin2': [mode], 'y_bin2': [mode], 'x_y_bin1': [mode],
'x': ['mean', 'max', 'min', 'std', np.ptp, start, end],
'y': ['mean', 'max', 'min', 'std', np.ptp, start, end],
'v': ['mean', 'max', 'min', 'std', np.ptp], 'dir': ['mean'],
'x_bin1_count': ['mean'], 'y_bin1_count': ['mean', 'max', 'min'],
'x_bin2_count': ['mean', 'max', 'min'], 'y_bin2_count': ['mean', 'max', 'min'],
'x_bin1_y_bin1_count': ['mean', 'max', 'min'],
'dist_move_prev': ['mean', 'max', 'std', 'min', 'sum'],
'x_y_min': ['mean', 'min'], 'y_x_min': ['mean', 'min'],
'x_y_max': ['mean', 'min'], 'y_x_max': ['mean', 'min'],
def start(x):try:return x[0]except:return Nonedef end(x):try:return x[-1]except:return Nonedef mode(x):try:return pd.Series(x).value_counts().index[0]except:return Nonedf = df[df['flag'] == 1].reset_index(drop=True)
for f in ['dist_move_prev_bin', 'v_bin']:# 上一时刻类别 速度类别映射处理df[f + '_sen'] = df['id'].map(df.groupby('id')[f].agg(lambda x: ','.join(x.astype(str))))# 一系列基本统计量特征 每列执行相应的操作
g = df.groupby('id').agg({'id': ['count'], 'x_bin1': [mode], 'y_bin1': [mode], 'x_bin2': [mode], 'y_bin2': [mode], 'x_y_bin1': [mode],'x': ['mean', 'max', 'min', 'std', np.ptp, start, end],'y': ['mean', 'max', 'min', 'std', np.ptp, start, end],'v': ['mean', 'max', 'min', 'std', np.ptp], 'dir': ['mean'],'x_bin1_count': ['mean'], 'y_bin1_count': ['mean', 'max', 'min'],'x_bin2_count': ['mean', 'max', 'min'], 'y_bin2_count': ['mean', 'max', 'min'],'x_bin1_y_bin1_count': ['mean', 'max', 'min'],'dist_move_prev': ['mean', 'max', 'std', 'min', 'sum'],'x_y_min': ['mean', 'min'], 'y_x_min': ['mean', 'min'],'x_y_max': ['mean', 'min'], 'y_x_max': ['mean', 'min'],
}).reset_index()
g.columns = ['_'.join(col).strip() for col in g.columns] #提取列名
g.rename(columns={'id_': 'id'}, inplace=True) #重命名id_
cols = [f for f in g.keys() if f != 'id'] #特征列名提取
g

2.5 行程特征

行程特征

总行程距离
每一步行程的占比
将'dist_move_prev_bin_sen', 'v_bin_sen'转化为onehot稀疏特征
df = df.drop_duplicates('id')[['id', 'label', 'dist_move_prev_bin_sen', 'v_bin_sen']].sort_values('id').reset_index(drop=True)
df = df.sort_values('label').reset_index(drop=True)# 去重以及排序
sub = df[df['label'] == -1].reset_index(drop=True)[['id']] #测试提交df
test_num = sub.shape[0]
labels = df[df['label'] != -1]['label'].values
df = df.merge(g, on='id', how='left') # 依据id合并特征
df[cols] = df[cols].astype('float32') # 特征列转换数据类型
df['dist_total'] = np.sqrt(np.square(df['x_end'] - df['x_start']) + np.square(df['y_end'] - df['y_start']))#总航海距离
df['dist_rate'] = df['dist_total'] / (df['dist_move_prev_sum'] + 1e-8)  #总距离/id航行量
df = df.merge(emb_df, left_on='x_y_bin1_mode', right_on='x_y_bin1', how='left') #合并emb_df
df_values = sparse.csr_matrix(df[cols + emb_cols[1:] + ['dist_total', 'dist_rate']].values)
for f in ['dist_move_prev_bin_sen', 'v_bin_sen']:cv = CountVectorizer(min_df=10).fit_transform(df[f].values)df_values = sparse.hstack((df_values, cv), 'csr')
test_values, train_values = df_values[:test_num], df_values[test_num:]
# del df, df_values
gc.collect()

#总航海距离 特征是某一渔船xy区域的面积值

【天池智慧海洋建设】Topline源码——特征工程学习(天才海神号)相关推荐

  1. 【天池智慧海洋建设】Topline源码——特征工程学习(总结)

    [天池智慧海洋建设]Topline源码--特征工程学习 目录 [天池智慧海洋建设]Topline源码--特征工程学习 前言 学习来源 部分解释 学习目标 内容介绍 I 特征工程概述 I 数据部分 II ...

  2. 【天池智慧海洋建设】Topline源码——特征工程学习(大白)

    [天池智慧海洋建设]Topline源码--特征工程学习 团队名称:大白 链接: https://github.com/Ai-Light/2020-zhihuihaiyang 目录 [天池智慧海洋建设] ...

  3. 智慧海洋建设——Task1 地理数据分析常用工具学习心得

    地理数据分析常用工具 一.shapely shapely是python中可以处理笛卡尔坐标系中几何对象(点.线.面)的一个库.其功能非常复杂,可以简化我们平时许多操作,下面来说一下我的一些学习理解. ...

  4. 物联网智慧城市建设系统源码

    射频识别(RFID)技术 物联网技术发展中十大核心技术之一:射频识别技术,是一种非接触式的自动识别技术,它通过射频信号自动识别目标对象并获取相关数据,识别工作不需要人工的干预,RFID技术的特点有:防 ...

  5. 2020数字中国 天池——智慧海洋建设 Top1%

    文章目录 Solution 总结 这是前段时间参加的天池比赛,最终成绩:18/3275. 下面先给出我的solution,最后再写一点总结. Solution # coding: utf-8# In[ ...

  6. 【算法实战篇】时序多分类赛题-2020数字中国创新大赛-智慧海洋建设top5方案(含源码)

        Hi,大家好!这里是AILIGHT!AI light the world!这次给大家带来的是2020数字中国创新大赛-数字政府赛道-智能算法赛:智慧海洋建设的算法赛复赛赛道B top5的方案以 ...

  7. 【算法竞赛学习】数字中国创新大赛智慧海洋建设-Task5模型融合

    智慧海洋建设-Task5 模型融合 5.1 学习目标 学习融合策略 完成相应学习打卡任务 5.2 内容介绍 https://mlwave.com/kaggle-ensembling-guide/ ht ...

  8. 【时序多分类赛题】2020数字中国创新大赛-智慧海洋建设top5方案(含源码)

       这次给大家带来的是2020数字中国创新大赛-数字政府赛道-智能算法赛:智慧海洋建设的算法赛复赛赛道B top5的方案以及代码开源.比赛传送门:https://tianchi.aliyun.com ...

  9. 【算法竞赛学习】数字中国创新大赛智慧海洋建设-Task3特征工程

    智慧海洋建设-Task3 特征工程 此部分为智慧海洋建设竞赛的特征工程模块,通过特征工程,可以最大限度地从原始数据中提取特征以供算法和模型使用.通俗而言,就是通过X,创造新的X'以获得更好的训练.预测 ...

最新文章

  1. [通告]Nuget服务宕机,出现 503 Server Unavailable 错误无法编译及解决方法
  2. Android基础(八) – Service AIDL
  3. 从家书到小票!看到海尔智家的转型是真的
  4. JSP基础(4)-JavaBean
  5. 视网膜脱落相关知识(持续更新中)
  6. linux 将远程mysql复制,在线备份MySQL及远程copy到远程备份服务器shell脚本
  7. python调用github_Pycharm中使用GitHub
  8. Pytorch 中 matmul 广播
  9. imageloader图片基本加载
  10. 微信小程序,小游戏sockect报错修复集合
  11. 算法应用-百钱买百鸡
  12. Kubernetes 小白学习笔记(22)--kubernetes的运维-管理Namespace
  13. Go程序设计语言导读
  14. 蓝牙耳机测试软件apk_蓝牙5.0手机如何测试检测分辨?这款免费APP帮大忙
  15. Vue中用到jeDate日期控件,Vue对象中的值滞后,总是滞后当前选择的值
  16. 完整安装PX4/PX4-Autopilot,无需科学上网。
  17. 南京大学计算机系2019复试离散题目-逻辑与推理
  18. 深入浅出空间曲线的切线方程和法平面方程
  19. STM32的USART1用DMA方式发送数据
  20. win10 注册表无法删除项

热门文章

  1. 把二进制流图片转换成MultipartFile文件
  2. 【跟着ChatGPT学深度学习】ChatGPT带我入门NLP
  3. 服务器意外断电MySQL无法启动
  4. CentOS 7系统安装配置图解教程
  5. 清北计算机专业研究生在哪里读研,本科清北去普通985甚至211读研,你会反向读研吗?...
  6. 苹果关闭无线服务器,使用苹果手机一定要关闭这四大功能,让手机更加省电、更加流畅...
  7. 使用Python基于OpenCV+MediaPipe追踪手势并控制音量
  8. SuperBenchmarker 压测工具
  9. 怎样设计一个好的数据库
  10. 黑马程序员----0704期java基础班心得