Datawhale 智慧海洋建设-Task3 特征工程

本文介绍了Datawhale智慧海洋建设任务3的特征工程,包括特征工程的概念、赛题背景、分箱特征(如v、x、y的分箱)以及DataFrame的count计数值等。强调了特征工程在机器学习中的重要性,是提升模型性能的关键步骤。
摘要由CSDN通过智能技术生成

Datawhale 智慧海洋建设-Task3 特征工程

这里说声抱歉,这部分内容对于初学者的我来说难度有些大,内容有点多,只看了大约一半,还有一半会继续学习,待学完会及时补充笔记。
DataWhale

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

“数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已”——机器学习界;

类似的,吴恩达曾说过:“特征工程不仅操作困难、耗时,而且需要专业领域知识。应用机器学习基本上就是特征工程。”

赛题:智慧海洋建设

特征工程的目的:

特征工程是一个包含内容很多的主题,也被认为是成功应用机器学习的一个很重要的环节。如何充分利用数据进行预测建模就是特征工程要解决的问题! “实际上,所有机器学习算法的成功取决于如何呈现数据。” “特征工程是一个看起来不值得在任何论文或者书籍中被探讨的一个主题。但是他却对机器学习的成功与否起着至关重要的作用。机器学习算法很多都是由于建立一个学习器能够理解的工程化特征而获得成功的。”——ScottLocklin,in “Neglected machine learning ideas”
数据中的特征对预测的模型和获得的结果有着直接的影响。可以这样认为,特征选择和准备越好,获得的结果也就越好。这是正确的,但也存在误导。预测的结果其实取决于许多相关的属性:比如说能获得的数据、准备好的特征以及模型的选择。
上分!😃 毫不夸张的说在基本的数据挖掘类比赛中,特征工程就是你和topline的距离。
项目地址:https://github.com/datawhalechina/team-learning-data-mining/tree/master/wisdomOcean

比赛地址:https://tianchi.aliyun.com/competition/entrance/231768/introduction?spm=5176.12281957.1004.8.4ac63eafE1rwsY

学习目标

1.学习特征工程的基本概念
2.学习topline代码的特征工程构造方法,实现构建有意义的特征工程
3.完成相应学习打卡任务

内容介绍

1.特征工程概述

2.题特征工程

特征,根据先验知识进行专业性的特征构建

3.特征
v、x、y的分箱特征
x、y分箱后并构造区域
4.taFramte特征
count计数值
shift偏移量
统计特征
5.bedding特征
Word2vec构造词向量
NMF提取文本的主题分布

特征工程概述

特征工程大体可分为3部分,特征构建、特征提取和特征选择。

特征构建
“从数学的角度讲,特征工程就是将原始数据空间变换到新的特征空间,或者说是换一种数据的表达方式,在新的特征空间中,模型能够更好地学习数据中的规律。因此,特征抽取就是对原始数据进行变换的过程。大多数模型和算法都要求输入是维度相同的实向量,因此特征工程首先需要将原始数据转化为实向量。” 其主要包含内容有:

  • 探索性数据分析
  • 数值特征
  • 类别特征
  • 时间特征
  • 文本特征

特征提取和特征选择
特征提取和特征选择概念上来说很像,其实特征提取指的是通过特征转换得到一组具有明显物理或统计意义的特征。而特征选择就是在特征集里直接挑出具有明显物理或统计意义的特征。

与特征提取是从原始数据中构造新的特征不同,特征选择是从这些特征集合中选出一个子集。特征选择对于机器学习应用来说非常重要。特征选择也称为属性选择或变量选择,是指为了构建模型而选择相关特征子集的过程。特征选择的目的有如下三个。

+ 简化模型,使模型更易于研究人员和用户理解。可解释性不仅让我们对模型效果的稳定性有更多的把握,而且也能为业务运营等工作提供指引和决策支持。

+ 改善性能。特征选择的另一个作用是节省存储和计算开销。

+ 改善通用性、降低过拟合风险。特征的增多会大大增加模型的搜索空间,大多数模型所需要的训练样本数目随着特征数量的增加而显著增加,特征的增加虽然能更好地拟合训练数据,但也可能增加方差。

import gc
import multiprocessing as mp
import os
import pickle
import time
import warnings
from collections import Counter
from copy import deepcopy
from datetime import datetime
from functools import partial
from glob import glob

import geopandas as gpd
import lightgbm as lgb
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
from gensim.models import FastText, Word2Vec
from gensim.models.doc2vec import Doc2Vec, TaggedDocument
from pyproj import Proj
from scipy import sparse
from scipy.sparse import csr_matrix
from sklearn import metrics
from sklearn.cluster import DBSCAN
from sklearn.decomposition import NMF, TruncatedSVD
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.metrics import f1_score, precision_recall_fscore_support
from sklearn.model_selection import StratifiedKFold
from sklearn.preprocessing import LabelEncoder
from tqdm import tqdm

os.environ['PYTHONHASHSEED'] = '0'
warnings.filterwarnings('ignore')
d:\anaconda\envs\zkw\lib\site-packages\gensim\similarities\__init__.py:15: UserWarning: The gensim.similarities.levenshtein submodule is disabled, because the optional Levenshtein package <https://pypi.org/project/python-Levenshtein/> is unavailable. Install Levenhstein (e.g. `pip install python-Levenshtein`) to suppress this warning.
  warnings.warn(msg)
def get_data(file_path,max_lines = 2000):
    paths = os.listdir(file_path)
    tmp = []
    for t in tqdm(range(len(paths))):
        if len(tmp) > max_lines:break
            
        p = paths[t]
        with open('{}/{}'.format(file_path, p), encoding='utf-8') as f:
            next(f)
            for line in f.readlines():
                tmp.append(line.strip().split(','))
                if len(tmp) > max_lines:break
                    
    tmp_df = pd.DataFrame(tmp)
    tmp_df.columns = ['渔船ID', 'x', 'y', '速度', '方向', 'time', 'type']
    return tmp_df

TRAIN_PATH = "E:/百度云下载/智慧海洋组队文件/hy_round1_train_20200102/hy_round1_train_20200102/"
# 采样数据行数
max_lines = 2000
df = get_data(TRAIN_PATH,max_lines=max_lines)
  0%|                                                                                 | 6/7000 [00:00<07:22, 15.80it/s]
label_dict1 = {
   '拖网': 0, '围网': 1, '刺网': 2}
label_dict2 = {
   0: '拖网', 1: '围网', 2: '刺网'}
name_dict = {
   '渔船ID': 'id', '速度': 'v', '方向': 'dir', 'type': 'label'}

df.rename(columns = name_dict, inplace = True)
df['label'] = df['label'].map(label_dict1)
cols = ['x','y','v']
for col in cols:
    df[col] = df[col].astype('float')
df['dir'] = df['dir'].astype('int')
df['time'] = pd.to_datetime(df['time'], format='%m%d %H:%M:%S')
df['date'] = df['time'].dt.date
df['hour'] = df['time'].dt.hour
df['month'] = df['time'].dt.month
df['weekday'] = df['time'].dt.weekday
df.head()
id x y v dir time label date hour month weekday
0 0 6.152038e+06 5.124873e+06 2.59 102 1900-11-10 11:58:19 0 1900-11-10 11 11 5
1 0 6.151230e+06 5.125218e+06 2.70 113 1900-11-10 11:48:19 0 1900-11-10 11 11 5
2 0 6.150421e+06 5.125563e+06 2.70 116 1900-11-10 11:38:19 0 1900-11-10 11 11 5
3 0 6.149612e+06 5.125907e+06 3.29 95 1900-11-10 11:28:19 0 1900-11-10 11 11 5
4 0 6.148803e+06 5.126252e+06 3.18 108 1900-11-10 11:18:19 0 1900-11-10 11 11 5
  • id:渔船ID,整数
  • x:记录位置横坐标,浮点数
  • y:记录位置纵坐标,浮点数
  • v:记录速度,浮点数
  • dir:记录航向,整数
  • time:时间,文本
  • label:需要预测的标签,整数

赛题特征工程

#构造各点的(x、y)坐标与特定点(6165599,5202660)的距离
df['x_dis_diff'] = (df['x'] - 6165599).abs()
df['y_dis_diff'] = (df['y'] - 5202660).abs()
df['base_dis_diff'] = ((df['x_dis_diff']**2)+(df['y_dis_diff']**2))**0.5    
del df['x_dis_diff'],df['y_dis_diff'] 
df['base_dis_diff'].head()
0    78959.780945
1    78763.845006
2    78577.185266
3    78399.867568
4    78231.955018
Name: base_dis_diff, dtype: float64
df['day_nig'] = 0
df.loc[(df['hour'] > 5) & (df['hour'] < 20),
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值