ML之特征工程进阶

本文详细介绍了特征工程的各个方面,包括特征设计、处理和选择。内容涵盖特征清洗、预处理、编码、填充和扩展,以及如何优雅高效地完成特征工程的步骤。特别强调了特征对模型效果的重要性,并提供了多种处理不同特征类型的方法,如数值、类别、文本和时间序列特征。此外,还讨论了特征存储和监控,以及特征工程在商品推荐系统中的应用。
摘要由CSDN通过智能技术生成

术语表

术语

释义

sklearn

fraternization

特征工程

Feature scaling

特征缩放

Feature Retrieval

特征检索

NLP

全称: Natural Language Processing 自然语言处理

Corpus

语料库

特征工程概述

定义

特征工程并非是一个问题,而是关于特征的一系列问题,主要包括:

  • 特征设计

    • 原始特征:从数据源直接获取到的特征

    • 模型特征:经过计算后输入给模型的特征

    • 模型特征转换:根据配置转换成可以直接输入给模型的数据格式

  • 特征获取

  • 特征处理

  • 特征监控

特征工程制约着模型效果,它决定了模型效果的上限。因此,提升模型效果的第一步,就是要做好特征工程。

 

特征设计

在针对特定推荐业务场景时,需围绕业务目标(优化目标)来确定特征;可以提取三大核心点:

  • 确定业务目标: 如当前推荐场景的目标是什么? 浏览深度/点击/时长

  • 用户在场景的状态:用户当前场景的状态、长短期兴趣偏好、设备和地域特征、用户上下文特征(之前看过什么?从哪里来的?)

  • 用户在场景所见/所得: item 呈现给用户的有哪些信息

特征分类

用户维度分类,

  1. item特征

  • 页面可见元素特征

  • 内容本身特征

  • 潜在特征

  1. User特征
  • 固有特征: 主要是用来刻画用户的长期或稳定的特征,如基础画像和短期画像
  • 行为偏好: 用来刻画用户在当前场景的行为特点
    • 行为偏好可以分为最近行为和负反馈两类,可以通过固定时间窗口来构建

  1. 上下文特征

按照数值分布,特征可分为如下几类:

  • 离散特征
  • 连续特征
  • 时序特征
  • 空间特征
  • 文本特征
  • 交叉特征

特征处理技巧

  1. 连续数值类特征
    1. 归一化,同一各个特征的量纲(标准归一化等)
    2. 离散化, 解决连续值带来的过拟合,以及特征分布不均匀的问题
    3. 线性函数的变换,通过变换转换为线性相关
  2. 类别型特征
    1. One-hot 编码
    2. Muti-hot 编码
    3. Embedding方法

连续特征

目的:连续特征离散化可以使模型更加稳健

连续特征经常是用户或者事物对应一些行为的统计值,常见的处理方法包括:

  • 归一化
  • 标准化
  • 离散化
  • 缺失值处理

特征处理

特征清洗

  • 样本清洗
  • 采样
    • 数据均衡问题
    • 样本权重

特征预处理

单个特征处理方法如下:

  • 归一化
  • 离散化: 通过确定分位数的形式将原来的连续值分桶,最终形成离散值
  • Dummy Coding
  • 缺失值
  • 数据变换
  1. Log
  2. 指数
  3. Box-cox

多个特征,常见处理方法如下:

  • 降维
    • PCA(Principal Component Analysis):主成分分析方法
    • LDA

特征选择

定义: 从原始数据中选择对于预测流水线而言最好的特征的过程

特征选择方法:

  • 基于统计的特征选择

定义:通过统计数据,我们可以快速,简单地解释定量和定性数据

  • 基于模型的特征选择
from sklearn.model_select import GridSearchCV

def get_best_model_and_accuracy(model, params, X, y):

    grid = GridSearchCV(model, params, error_scors=0.)

    #拟合模型和参数

    grid.fit(X, y)
    
    print("Best Accuracy:{}".format(grid.best_score_))

    print("Best Parameters:{}".format(grid.best_params_))

    print("Average Time to Fit(s):  {}".format(round(grid.cv_results_['mean_fit_time'].mean(), 3)))


from sklearn.linear_model import LogisticRegression

from sklearn.neighbors import KNeighborsClassifier

from sklearn.tree import DecisionTreeClassifier

from sklearn.ensemble import RandomForestClassifier

#逻辑回归

lr_params = {'C':[1e-1, 1e0, 1e1, 1e2], 'penalty':['11', '12']}

#KNN

knn_params = {'n_neighbors':[1,3,5,7]}

#决策树

tree_params = {'max_depth':[None, 1, 3, 5, 7]}

#随机森林

forest_params = {'n_estimators':[10. 50, 100], 'max_depth':[None, 1, 3, 5, 7]}

####

## pickle 是负责将python对象序列化和反序列化的模块;

# 保存模型

pickle.dump(model, open(modelPath, "wb"))

#加载模型

def loadModel(modelPath):

model = pickle.load(modelPath, "rb")

return model

  • Filter
    • 思路: 自变量和目标变量之间的关联
    • 相关系数
    • 卡方检验
    • 信息增益,互信息
  • Wrapper
    • 思路:通过目标函数来决定是否加入一个变量
  • Embedded
    • 思路:学习器自身自动选择特征
    • 正则化
      • Lasso
      • Ridge

特征填充

  • 自定义分类填充器
from sklearn.base import TransformerMixin

class CustomCategoryImputer(TransformerMixin):

    def __init__(self, cols=None):

        self.cols = cols

    def transform(self, df):

        x = df.copy()

        for col in self.cols:

        x[col].fillna(x[col].value_counts().index[0], inplace=True)

        return x

    def fit(self, *_):

        return self

##

cci = CustomCategoryImputer(cols=['city', 'boolean'])

cci.fit_transform(x)
  • 自定义定量填充器
from sklearn.preprocessing import Imputer

class CustomQuantitativeImputer(TransformerMixin):

    def __init__(self, cols=None, strategy='mean'):

        self.cols = cols

        self.strategy = strategy


    def transform(self, df):

        x = df.copy()

        impute = Imputer(strategy=self.strategy)

        for col in self.cols:

            x[col] = imputer.fit_transform(x[col])

        return x

    def fit(self, *_):

        return self

特征编码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值