1. 概述:上节咱们说了特征工程是机器学习的一个核心内容。然后咱们已经学习了特征工程中的基础内容,分别是missing value handling和categorical data encoding的一些方法技巧。但是光会前面的一些内容,还不足以应付实际的工作中的很多情况,例如如果咱们的原始数据的features太多,咱们应该选择那些features作为咱们训练的features?或者咱们的features太少了,咱们能不能利用现有的features再创造出一些新的与咱们的target有更加紧密联系的features呢?这些都是咱们feature engineering中经常遇到的场景,这里涉及到的一些常用技术也是每一个做机器学习或是数据分析的工程师必须要掌握的。上面提到的技术,咱们通常叫做:feature generation和feature selection。下面咱们就来说一说这两个技术点吧
  2. Feature generation。对于这个技术点,其实没有什么诀窍,就是一个,深刻理解咱们的数据的意义再加上一点点创造力。大家是不是很懵逼,哈哈,这就完啦????哈哈当然不是啦,但是这一块缺失没有一个统一的模式,具有一定的随机性。但是通过总结,咱们可以总结一下常用的模式,方便大家在应用的时候参考。                                                                                        2.1 Interaction。这个其实就是相当于交叉的意思,咱们可以将几个features直接的拼接在一起,形成一个“有意思”的新的feature,记住一定要有意义的,否则你不但白搞了,甚至原来好好的数据都被你搞砸了,不要为了装逼而装逼,咱要装逼于无形之中。那么这个有什么意义呢?首先它能将多个columns装换成一个column,方便咱们的数据处理;其次在有些特定的数据中,这种interaction更加能反映出数据的本质。具体怎么操作了,咱们通过一个简单的代码来展示,注意我只截取了我代码的一部分,默认数据都已经加载完毕,所以不要纠结我的代码的变量和数据哈,大家主要看过程和思路
    interactions = data_raw["category"]+"_"+data_raw["country"]
    baseline_data = baseline_data.assign(category_country = label_encoder.fit_transform(interactions))

    上面的第一句代码就是咱们interaction的部分,第二句是讲interaction过后的数据label encoding并且加入到咱们的数据集里面,简单明了。上面是将原始数据中的category 和 country连接在一起从而形成一个新的feature                                       2.2 numerical transforming。这是什么意思呢,对于有些numerical data的columns,他们的数据分布是很不均匀的,或者说他们的数值太大或者太小,有的时候不适合咱们的数据的训练,可能会出现vanishing gradient或者gradient explode的情况。具体啥叫vanishing gradient和gradient exploding,咱们在后面的内容在慢慢解释。暂时只需要知道这是个很麻烦的事情就好了,会导致咱们训练的模型不那么牛逼就行了。那么咱们通过什么方法解决呢?这里主要通过一些常见的数学的方式来解决,例如用log 或者 sqrt等等方式。咱们可以通过下面的代码来简单的展示一下

    np.sqrt(baseline_data['goal'])
    np.log(baseline_data['goal'])

    从上面咱们可以看出,这里咱们主要还是通过numpy里面提供的API进行处理的,非常简单,简单跟1一样,好了这里就说到这了。    对了,忘记一个事儿,就是numerical transforming在tree-based模型中没有什么卵用的,因为tree-based的所有模型都是scale invariant的,就是tree-based模型都是不care数据的大小分布的。                                                                           2.3 rolling。这个就比较高级一点啦(相比前两种方式),首先咱们先要明白rolling的概念,其实rolling就是相当于在咱们的数据(series)上面卡上一个fixed-size的小window,然后对于这个window覆盖的数据进行一些简单的计算,例如:counting,mean,sum等等。如果大家还是觉得不懂,我把它的官方链接贴在这里,大家自己去看看,里面还有很多实例:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.rolling.html#pandas.Series.rolling 。那么我先写一个简单的小例子给大家参考一下哈

    launched = pd.Series(data_raw.index,data_raw.launched,name="count_7_days").sort_index()
    count_7_days = launched.rolling('7d').count()
    count_7_days.index = launched.values
    count_7_days = count_7_days.reindex(data_raw.index)

    我先简单解释一下上面代码的意思哈,第一句是让时间作为这个series的index,第二句rolling是计算最近7天的的数量,第三第四句是讲数据还原到之前的index的顺序,房间重新join到原来的数据集中。那么rolling这种方式一般在什么情况下用呢?一般在你的数据有datetime的时候,或者前面数据会影响到后面的结果的时候,大家可以考虑一下下,但是这个是不一定的,还是需要大家有一定的creativity的。例如上面的例子就是统计最近7天一共上传的APP的数量,来判断某一个APP是否被下载的应用场景。一般情况下,最近上传的APP数量太多,被下载的概率就越低,所以他们还是有一定关联关系的。所以我generate一个新的feature还是有一定道理的。                                                                                                                                                       2.4 Time delta。从这个命名中咱们可以知道,这个跟time肯定有关系,这个大家猜的很对。time delta也是有一定随机性的,有时需要有时也不需要,也是要根据实际的数据的特性来决定的,甚至是根据工程师自己来决定的,跟上面的rolling有点相似。为了方便解释这其中的细节,我也是直接来一个例子然后慢慢解释

    def time_since_last_project_same_category(series):
    return series.diff().dt.total_seconds()/3600
    df = data_raw[['category','launched']].sort_values('launched')
    group_category = df.groupby('category')
    timedeltas = group_category.transform(time_since_last_project_same_category)
    timedeltas = timedeltas.fillna(timedeltas.mean()).reindex(baseline_data.index)

    上面前两行是一个计算相邻datatime之间的相差多少个小时,第三行创建一个按照排序好的launched time为index的dataframe, 第四行是按照category的条件来group前面创建的df, 第五行是计算group里面相邻数据之间的time delta,并且返回一个series, 第六行是填充这些空数据,并且按照原始数据的方式index重新排序方便加入到原始数据。流程就这样结束了。上面的场景是计算同一个category相邻app上传的时间差,这个其实也是会影响到咱们的APP是否被下载的因素。所以这个也是咱们的一个creativity,实际情况中千变万化,一定要根据实际情况来定,不能为了装逼而装逼,一定要根据实际的业务需要,否则适得其反。 好了,其实关于feature generation还有很多种方式,例如有些事计算两个columns之间的差值,取模等等,这里没有统一的标准,唯一的捷径和key就是咱们一定得理解咱们每一个columns和dataset的实际业务的意思,否则再牛逼的generation也拯救不了你。下面咱们进入到这一章的最后一节feature selection吧。

  3. Feature selection。当咱们吧missing value, categorical data handling, feature generation这个繁杂的步骤都走完了,咱们就来到了feature engineering的最后一步了,那就是feature selection。根据意思就是咱们到底咱们最后选择哪些数据来训练咱们的模型,数据选的好,模型的适用范围,效率,准确性都更好,否则咱们前面的努力可能会毁于一旦。关于feature selection我个人觉得是个人经验和一些selection技术的结合,才能选出最好的features作为训练的样本。个人经验,就是工程师自己对于数据的理解程度,有些features一看就和target没有半毛钱的关系,咱们肯定直接排除这些features,例如咱们的手机设备号和手机价格一看就一点关系都没有,咱们肯定直接删除手机设备号这个feature;有些features一看就和target有很强的关系,例如手机内存大小和手机的价格一看就有很强的关联性,所以咱们肯定要选择这个内存的feature。个人经验之外还有很多模棱两可的features怎么办呢?就跟我前面说的那样,咱们还可以用一些技术手段来选择。下面咱们来介绍两种常用的feature selection的技术。                                                                                                                                                   3.1 F-classification method。这种方式是单独计算每一个column和target的关联性,然后选出关联性最强的f个columns,这里f的值是咱们自定义的。具体的实现细节咱们不需要了解的那么深,因为sklearn已经帮助咱们造好轮子了,从下面的代码,咱们来感受一下它的魅力吧
    from sklearn.feature_selection import SelectKBest, f_classif
    selector = SelectKBest(score_func = f_classif, k = 5)
    train,valid,test = get_data_splits(baseline_data, 0.1)
    feature_cols = train.columns.drop("outcome")
    X_new = selector.fit_transform(train[feature_cols],train["outcome"] )

    #get back to the features we kept
    features = pd.DataFrame(selector.inverse_transform(X_new), index = train.index, columns = feature_cols)
    #drop the columns that the values are all 0s
    feature_cols_final = features.columns[features.var()!=0]
    features_final = features[feature_cols_final]

    从上面的代码咱们可以看出来,首先得从sklearn.feature_selection这个模块中引进SelectKBest和f_classif两个子模块;第二步就是创建一个Selector实例对象,这个selector最终返回多少个features是通过咱们的参数K来控制的,selector的最终选择哪些features也是通过f_classif这个函数来控制的;最后就是这个selector的transform了,将features和target作为参数分别传递给他,他会自动搞定,并且返回K个features, 然后再将numpy array返回到dataframe的格式。这种方式的只能计算出每一个feature和target的linear dependency,并不能一次性包括所有的features进行关联性计算。                                                       3.2 L1 Regression。L1 Regression可以直接包括所有的features一次性的计算这个columns和target的关联性。关联性越强,数值越大。它不需要制定最后返回多少个features,它是根据L1的结果自动帮助咱们features。但是它的运行速度要远远慢于上面k-classif的方法,可是好处就是一般情况下L1 Regression的运行结果要好于K-classif, 但也不一定澳,只能说大部分情况是这样的。

    from sklearn.linear_model import LogisticRegression
    from sklearn.feature_selection import SelectFromModel
    train,valid,test = get_data_splits(baseline_data, 0.1)
    X, y = train[train.columns.drop("outcome")], train["outcome"]
    logistic_model = LogisticRegression(C=1, penalty="l1", random_state=7).fit(X,y)
    selector = SelectFromModel(logistic_model,prefit=True)
    X_new = selector.transform(X)
    features = pd.DataFrame(selector.inverse_transform(X_new),index = train.index, columns = feature_cols)
    feature_cols_final = features.columns[features.var()!=0]

    总结:上面就是一般的的特征工程的feature selection和feature generation的一般方法,咱们上面讲了很多种的方式,实际情况中具体选择哪一种还是要根据实际情况,一定不要死读书。feature generation一般就是interaction,numerical generation,rolling和time delta四种方式。feature selection一般用到的技术手段就是就是f-classif和L1 regression几种方式。

机器学习-特征工程-Feature generation 和 Feature selection的更多相关文章

  1. 机器学习-特征工程-Missing value和Category encoding

    好了,大家现在进入到机器学习中的一块核心部分了,那就是特征工程,洋文叫做Feature Engineering.实际在机器学习的应用中,真正用于算法的结构分析和部署的工作只占很少的一部分,相反,用于特 ...

  2. 2022年Python顶级自动化特征工程框架⛵

    作者:韩信子@ShowMeAI 机器学习实战系列:https://www.showmeai.tech/tutorials/41 本文地址:https://www.showmeai.tech/artic ...

  3. 特征工程(Feature Enginnering)学习记要

     最近学习特征工程(Feature Enginnering)的相关技术,主要包含两块:特征选取(Feature Selection)和特征抓取(Feature Extraction).这里记录一些要点 ...

  4. 特征工程(Feature Engineering)

    一.什么是特征工程? "Feature engineering is the process of transforming raw data into features that bett ...

  5. 使用sklearn做单机特征工程(Performing Feature Engineering Using sklearn)

    本文转载自使用sklearn做单机特征工程 目录 目录 特征工程是什么 数据预处理 1 无量纲化 11 标准化 12 区间缩放法 13 标准化与归一化的区别 2 对定量特征二值化 3 对定性特征哑编码 ...

  6. 想搞机器学习,不会特征工程?你TM逗我那!

    原文:http://dataunion.org/20276.html 作者:JasonDing1354 引言 在之前学习机器学习技术中,很少关注特征工程(Feature Engineering),然而 ...

  7. Feature Engineering and Feature Selection

    首先,弄清楚三个相似但是不同的任务: feature extraction and feature engineering: 将原始数据转换为特征,以适合建模. feature transformat ...

  8. Python机器学习笔记 使用sklearn做特征工程和数据挖掘

    特征处理是特征工程的核心部分,特征工程是数据分析中最耗时间和精力的一部分工作,它不像算法和模型那样式确定的步骤,更多的是工程上的经验和权衡,因此没有统一的方法,但是sklearn提供了较为完整的特征处 ...

  9. 谷歌大规模机器学习:模型训练、特征工程和算法选择 (32PPT下载)

    本文转自:http://mp.weixin.qq.com/s/Xe3g2OSkE3BpIC2wdt5J-A 谷歌大规模机器学习:模型训练.特征工程和算法选择 (32PPT下载) 2017-01-26  ...

随机推荐

  1. H3C 多区域OSPF配置示例

  2. word 筛选过的网页,网页,单个文件网页

    1)筛选过的网页:保存后会生成 xxx.htm和xxx.files文件夹,删除了还原成Word文档所需的格式标记和功能,也就是说存为纯网页了,文件尺寸小:2)网页:保存后会生成 xxx.htm和xxx ...

  3. H5 网络状态接口

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. git如何移除某文件的版本控制

    1:还没有加到版本控制中 (1)还没有git  add 在   .gitignore中添加 (2)已经git add 先   git  rm  -r  --cached   文件 在   .gitig ...

  5. 关于POSTMAN做并发压测

    一开始我个人在做测试时用到了POSTMAN,用了两种方式做测试, 第一种: 测试发现这种方式是阻塞排队,我让接口睡两秒,这100次请求间隔就是2秒,是串行执行 于是想到第二种,在一个collectio ...

  6. 一排盒子,jq鼠标移入的盒子动画移出停止动画,css动画

    css .category > div.active { animation: servicetobig 0.5s ease 1 forwards; } @keyframes serviceto ...

  7. vue-learning:0 - 目录

    Vue-learning vue.js学习路径 Vue的API地图 点击查看vue的API地图 视图层 点击可直接到达详情页面 指令 {{ }} / v-html v-if / v-else / v- ...

  8. 原生js实现继承

    在多数语言中继承都很重要.JavaScript是一个基于原型的语言,这意味着对象可以直接从其他对象继承.以下列出几种常见的js继承方式. 原型链继承 function Father(){ this.s ...

  9. 与正则有关的JS方法结合其在项目中的应用

    与正则有关的JS方法结合其在项目中的应用 前言 最近项目中用到正则匹配比较多,因此打算深入理解和总结下各个与正则有关的方法,再结合在项目中使用的情况.与正则有关的JS方法共有7个,分别是RegExp对 ...

  10. PLsql下载官网下载地址

    https://www.allroundautomations.com/registered/plsqldev.html