术语表
术语 |
释义 |
sklearn |
|
fraternization |
特征工程 |
Feature scaling |
特征缩放 |
Feature Retrieval |
特征检索 |
NLP |
全称: Natural Language Processing 自然语言处理 |
Corpus |
语料库 |
特征工程概述
定义
特征工程并非是一个问题,而是关于特征的一系列问题,主要包括:
-
特征设计
-
原始特征:从数据源直接获取到的特征
-
模型特征:经过计算后输入给模型的特征
-
模型特征转换:根据配置转换成可以直接输入给模型的数据格式
-
-
特征获取
-
特征处理
-
特征监控
特征工程制约着模型效果,它决定了模型效果的上限。因此,提升模型效果的第一步,就是要做好特征工程。
特征设计
在针对特定推荐业务场景时,需围绕业务目标(优化目标)来确定特征;可以提取三大核心点:
-
确定业务目标: 如当前推荐场景的目标是什么? 浏览深度/点击/时长
-
用户在场景的状态:用户当前场景的状态、长短期兴趣偏好、设备和地域特征、用户上下文特征(之前看过什么?从哪里来的?)
-
用户在场景所见/所得: item 呈现给用户的有哪些信息
特征分类
用户维度分类,
-
item特征
-
页面可见元素特征
-
内容本身特征
-
潜在特征
- User特征
- 固有特征: 主要是用来刻画用户的长期或稳定的特征,如基础画像和短期画像
- 行为偏好: 用来刻画用户在当前场景的行为特点
-
行为偏好可以分为最近行为和负反馈两类,可以通过固定时间窗口来构建
-
-
上下文特征
按照数值分布,特征可分为如下几类:
- 离散特征
- 连续特征
- 时序特征
- 空间特征
- 文本特征
- 交叉特征
特征处理技巧
- 连续数值类特征
- 归一化,同一各个特征的量纲(标准归一化等)
- 离散化, 解决连续值带来的过拟合,以及特征分布不均匀的问题
- 线性函数的变换,通过变换转换为线性相关
- 类别型特征
- One-hot 编码
- Muti-hot 编码
- Embedding方法
连续特征
目的:连续特征离散化可以使模型更加稳健
连续特征经常是用户或者事物对应一些行为的统计值,常见的处理方法包括:
- 归一化
- 标准化
- 离散化
- 缺失值处理
特征处理
特征清洗
- 样本清洗
- 采样
- 数据均衡问题
- 样本权重
特征预处理
单个特征处理方法如下:
- 归一化
- 离散化: 通过确定分位数的形式将原来的连续值分桶,最终形成离散值
- Dummy Coding
- 缺失值
- 数据变换
- Log
- 指数
- 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