6.more_about_feature_engineering_and_selection

1.数据处理、特征工程、特征选择内容

  • 数据处理

    • 分析数据的分布模式 - 发现异常值/噪声(boxplot,quantile)
    • pandas工具库:数据类型(时间型读成字符串),数字形态的类别型(userid, 没有大小关系),数据类型优化
    • 缺失值(数值型/类别型,缺失比例)
    • 时间序列:趋势分析
    • 单维度(连续值distplot、类别型countplot/value_counts)、关联维度(corr, heatmap)
    • 业务数据中做建模:最有效的特征通常是统计特征(怎么做统计,有哪些类别型的列可以做为groupby的对象,有哪些数值型的列可以用于统计聚合),特别留意置信度(总数很小的时候,统计值不稳定,比例型特征稳定度高于绝对值)
  • 特征工程

    • 数值型
      • 幅度缩放(最大最小值缩放、归一化...)
      • 离散化/分箱分桶(等距pd.cut、等频pd.qcut)(非线性/加速/特征交叉/健壮性)
      • 统计值(max min quantile)
      • 四则运算(加减乘除)
      • 幅度变化(有一些模型对于输入数据有分布假设,线性回归假设输入连续值特征符合正态分布,log1p/exp)
      • 监督学习分箱(用决策树建模,用决策树学习连续值划分方式,把决策树中间节点取出来作为组合特征) sklearn dt apply
    • 类别型
      • OneHot-encoding
      • label-encoding
      • binary-encoding
      • category-encoding
    • 时间型
      • 时间点/时间段(星期几、几点钟)
      • 时间分组/分段(工作日、周末、法定节假日...)
      • 时间间隔(距离当前为止...)
      • 和数值型一起做统计特征的时候,会选取不同的时间窗...
      • 组合...
    • 文本型
      • 词袋模型
      • tf-idf
      • lda
      • word2vec/word embedding
      • ...
  • 特征选择

    • 过滤型(filter)
    • 包裹型(wrapper)
    • 嵌入型(embedded)
    • 基于树模型去判断特征的重要度,做实验去筛选

1.0.1数据载入

import pandas as pd
df_train =pd.read_csv('train.csv')

1.0.2了解数据

  • head()
  • info()
  • describe()
df_train.head()
1
df_train.shape
2
df_train.info()
3
df_train.describe()
4

1.1基本数据处理

1.1.1 0缺失值处理

  • pandas fillna
  • sklearn Imputer

1.1.1.1 可以用pandas的fillna函数

df_train['Age'].head(10)
5
df_train['Age'].fillna(value = df_train['Age'].mean()).head(10)
6

1.1.1.2 借助sklearn中的Imputer

from sklearn.preprocessing import Imputer
imp = Imputer(missing_values = 'NaN' , strategy = 'mean' ,axis = 0)
age = imp.fit_transform(df_train[['Age']].values)
df_train.loc[: , 'Age'] = df_train['Age'].fillna(value = df_train['Age'].mean())
df_train.head(10)
7
df_train.info()
8

1.2常见的特征工程

1.2.1 数值型

1.2.1.1 幅度缩放

  • apply+numpy
  • preprocessing scaler
#取对数等变换
import numpy as np
log_age = df_train['Age'].apply(lambda x:np.log(x))
df_train.loc[:,'log_age'] = log_age
df.train.head(10)
9
#幅度缩放,最大值最小值缩放
from sklearn.propressing import MinMaxScaler
mm_scaler = MinMaxScaler()
fare_trans = mm_scaler.fit_transform(df_train[['Fare']])
#幅度缩放,标准化
from sklearn.propressing import StandarScaler
std_scaler = StandardScaler()
fare_std_trans = std_scaler.fit_transfrom(df_train[['Fare']])

1.2.1.2 统计值

  • max , min
  • quantile
#最大值最小值
max_age = df_train['Age'].max()
min_age =  df_train['Age'].min()
#分位数
age_quarter_1 = df_train['Age'].quantile(0.25)
age_quarter_3 = df_train['Age'].quantile(0.75)
age_quarter_1 
10
age_quarter_3
11

1.2.1.3 四则运算

df_train.head()
12
df_train.loc[:,'family_size'] = df_train['SibSp'] + df_train['Parch'] +1 
df_train.head()
13
df_train.loc[:,'tmp'] = df_train['Age'] * df_train['Pclass'] +4*df_train['familiy_size']
df_train.head()
14

1.2.1.4 高次特征与交叉特征

  • preprocessing.PolynomialFeatures

[x1 x2 x3] => [x1^2 x3^3 x1*x2 x1*x3]

from sklearn.preprocessing import PolynomialFeatures
poly = PloynomialFeatrues(degree = 2)
df_train[['SibSp' ,'Parch']] .head()
15
poly_fea = ploy.fit_transform(df_train[['SibSp' , 'Parch']])
poly_fea
16

1.2.1.5 离散化/分箱/分桶

  • pandas cut
  • pandas qcut
#等距切分
df_train.loc[:,'fare_cut'] = pd.cut(df_train['Fare'] , 5)
df_train.head()
17
df_train['fare_cut'].unique()
18
#等频切分
df_train.loc[: , 'fare_cut'] = pd.qcut(df_train['Fare'] , 5)
df_train.head()
19

1.2.2类别型(离散型)

1.2.2.1 OneHot encoding/独热向量编码

  • pandas get_dummies
  • OneHotEncoder()
df_train.info()
20
embarked_oht = pd.get_dummies(df_train[['Embarked']])
embarked_oht.head()
21
fare_qcut_oht = pd.get_dummies(df_train[['fare_cut']])
fare_qcut_oht.head()
21

1.2.3 组合特征

df_train.head()
22
#借助条件去判断获取组合特征
df_train.loc[:,'alone'] = (df_train['SibSp'] == 0) &(df_train['Parch'] == 0)
23

1.2.4时间型

1.2.4.1日期处理

  • pandas to_datetime
car_sales = pd.read_csv('car_data.csv')
car_sales.head()
23
car_sales.info()
23
car_sales.describe()
24
car_sales['date_t'].dtype
25
car_sales.loc[:,'date'] = pd.to_datetime(car_sales['date_t'])
car_sales.info()
26
car_sales.head()
27

1.2.4.2 取出关键时间信息

  • dt.month
  • dt.dayofweek
  • dt.dayofyear
  • ...
#取出几月份
car_sales.loc[:,'month'] = car_sales['date'].dt.month
car_sales.head()
28
tmp_date = car_sales['date'].dt
#取出来是几号
car_sales.loc[:,'dom'] = car_sales['date'].dt.day
car_sales.loc[:,'doy'] = car_sales['date'].dt.dayofyear
car_sales.loc[:,'dow'] = car_sales['date'].dt.dayofweek
car_sales.head()
29
car_sales.loc[:,'is_weekend'] = car_sales['dow'].apply(lambda x: 1 if (x==0 or x==6) else 0)
car_sales.head()
30

1.2.5 文本型

1.2.5.1 词袋模型

  • CountVectorizer


    31
from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer()
corpus = [
    '欢迎 大家 学习 这 个 课程',
    '机器学习 需要 一定 的 数学 基础',
    '课程 里 的 内容 会 涉及 机器学习 和 数学 原理',
    '希望 大家 都 能 消化 课程 内容'
]
X = vectorizer.fit_transfrom(corpus)
X
32
vectorizer.get_feature_names()
33
X.toarray()
34
vec = CountVectorizer(ngram_range = (1,3))
x_ngram = vec.fit_transform(corpus)
vec.get_feature_names()
33
X_ngram.toarry()
34

1.2.5.2

  • TFidfVectorizer


    35
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf_vec = TfidfVectorizer()
tfidf_X = tfidf_vec.fit_transform(corpus)
tfidf_vec.get_feature_names()
36
tfidf_X.toarray()
37

1.3 特征选择

1.3.1 过滤式/Filter

  • SelectKBest
  • 通常在线性模型中会使用
from sklearn.feature_selection import SelectKBest
from sklearn.datasets import load_iris

iris = load_iris()
X , y  = iris.data , iris.target
X.shape
38
X[:5,:]
39
y
40
X_new = SelectKBest(k=2).fit_transform(X , y)
X_new.shape
41
X_new[:5,:]
42

1.3.2 包裹型/wrapper

  • RFE
from sklearn.feature_selection import RFE
from sklearn.ensamble import RandomForesClassifier
rf  = RandomForestClassifier()

rfe = RFE(estimator = rf , n_features_to_select =2 )
X_rfe = rfe.fit_transform(X,y)
X_rfe.shape
43
X_rfe[:5,:]
44

1.3.3 嵌入式Embedding

  • SelectFromModel
from sklearn.feature_selection import SelectFromModel
from sklearn.svm import LinearSVC

lsvc = linearSVC(C = 0.01 , penalty = 'l1' , dual = False).fit(X , y)
model = SelectFromModel(lsvc , preft = True)
X_embed = model.transform(X)
X_embed.shape
45
X_embed[:5,:]
46
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,923评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,154评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,775评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,960评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,976评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,972评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,893评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,709评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,159评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,400评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,552评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,265评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,876评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,528评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,701评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,552评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,451评论 2 352

推荐阅读更多精彩内容