特征工程(上)「金融风控实战笔记」

目录[1]

  本文以 kaggle 入门赛的 Titanic 数据集为例,讲解一些特征工程中通用的方法,主要是数据预处理这部分。

预览数据

import pandas as pd
import numpy as np
df_train = pd.read_csv('train.csv')
df_train.shape
df_train.info()
df_train.describe()
#变量的百分位以及离群点
%matplotlib inline
df_train.boxplot(column='Age')
%matplotlib inline
import seaborn as sns
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "distributions")))
sns.distplot(df_train.Age, kde=True, bins=20, rug=True)
特征工程(上)「金融风控实战笔记」

Kde

数据预处理

缺失值处理

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

数值型

数值缩放

# 取对数等变换
import numpy as np
log_age = df_train['Age'].apply(lambda x:np.log(x))
df_train.loc[:,'log_age'] = log_age
# 幅度缩放,最大最小值缩放到[0,1]区间内
from sklearn.preprocessing import MinMaxScaler
mm_scaler = MinMaxScaler()
fare_trans = mm_scaler.fit_transform(df_train[['Fare']])
# 幅度缩放,将每一列的数据标准化为正态分布的
from sklearn.preprocessing import StandardScaler
std_scaler = StandardScaler()
fare_std_trans = std_scaler.fit_transform(df_train[['Fare']])
#中位数或者四分位数去中心化数据,对异常值不敏感
from sklearn.preprocessing import robust_scale
fare_robust_trans = robust_scale(df_train[['Fare','Age']])
#将同一行数据规范化,前面的同一变为1以内也可以达到这样的效果
from sklearn.preprocessing import Normalizer
normalizer = Normalizer()
fare_normal_trans = normalizer.fit_transform(df_train[['Age','Fare']])
fare_normal_trans

统计值

# 最大最小值
max_age = df_train['Age'].max()
min_age = df_train["Age"].min()
# 分位数,极值处理,我们最粗暴的方法就是将前后1%的值抹去
age_quarter_01 = df_train['Age'].quantile(0.01)
age_quarter_99 = df_train['Age'].quantile(0.99)
# 四则运算
df_train.loc[:,'family_size'] = df_train['SibSp']+df_train['Parch']+1
# 多项式特征生成
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=2)
df_train[['SibSp','Parch']].head()
poly_fea = poly.fit_transform(df_train[['SibSp','Parch']])

离散化/分箱/分桶

#等距切分
df_train.loc[:, 'fare_cut'] = pd.cut(df_train['Fare'], 20)
# 等频切分
df_train.loc[:,'fare_qcut'] = pd.qcut(df_train['Fare'], 10)
#OneHot encoding/独热向量编码
embarked_oht = pd.get_dummies(df_train[['Embarked']])

特征选择

一般可以从两个方面考虑来选择特征:

  1. 特征是否发散 如果一个特征不发散,例如方差接近于 0,也就是说样本在这个特征上基本上没有差异,这个特征对于样本的区分并没有什么用。
  2. 特征与目标的相关性 这点比较显见,与目标相关性高的特征,应当优选选择。除移除低方差法外,本文介绍的其他方法均从相关性考虑。

特征选择可以分为 3 种:

  1. Filter:过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。
  • Wrapper:包装法,根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征。
  • Embedded:嵌入法,先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。类似于 Filter 方法,但是是通过训练来确定特征的优劣。
  • Filter

    1. 移除低方差的特征
    from sklearn.feature_selection import VarianceThreshold
    X = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]]
    sel = VarianceThreshold(threshold=(.8 * (1 - .8)))
    sel.fit_transform(X)
    
    1. 单变量特征选择

    对于分类问题(y 离散),可采用:

    对于回归问题(y 连续),可采用:

    卡方(Chi2)检验

      经典的卡方检验是检验定性自变量对定性因变量的相关性。比如,我们可以对样本进行一次 chi2 测试来选择最佳的两项特征:

    from sklearn.datasets import load_iris
    from sklearn.feature_selection import SelectKBest
    from sklearn.feature_selection import chi2
    iris = load_iris()
    X, y = iris.data, iris.target
    X_new = SelectKBest(chi2, k=2).fit_transform(X, y)
    

    Pearson 相关系数

      皮尔森相关系数是一种最简单的,能帮助理解特征和响应变量之间关系的方法,该方法衡量的是变量之间的线性相关性。

    import numpy as np
    from scipy.stats import pearsonr
    np.random.seed(0)
    size = 300
    x = np.random.normal(0, 1, size)
    # pearsonr(x, y)的输入为特征矩阵和目标向量,能够同时计算 相关系数 和p-value.
    print("Lower noise", pearsonr(x, x + np.random.normal(0, 1, size)))
    print("Higher noise", pearsonr(x, x + np.random.normal(0, 10, size)))
    

    注意,使用 Pearson 相关系数主要是为了看特征之间的相关性,而不是和因变量之间的。

    Wrapper

    递归特征消除

      递归消除特征法使用一个基模型来进行多轮训练,每轮训练后,移除若干权值系数的特征,再基于新的特征集进行下一轮训练。

      对特征含有权重的预测模型(例如,线性模型对应参数 coefficients),RFE 通过递归减少考察的特征集规模来选择特征。首先,预测模型在原始特征上训练,每个特征指定一个权重。之后,那些拥有最小绝对值权重的特征被踢出特征集。如此往复递归,直至剩余的特征数量达到所需的特征数量。

       RFECV 通过交叉验证的方式执行 RFE,以此来选择最佳数量的特征:对于一个数量为 d 的 feature 的集合,他的所有的子集的个数是 2 的 d 次方减 1(包含空集)。指定一个外部的学习算法,比如 SVM 之类的。通过该算法计算所有子集的 validation error。选择 error 最小的那个子集作为所挑选的特征。

    from sklearn.feature_selection import RFE
    from sklearn.ensemble import RandomForestClassifier
    from sklearn.datasets import load_iris
    rf = RandomForestClassifier()
    iris=load_iris()
    X,y=iris.data,iris.target
    rfe = RFE(estimator=rf, n_features_to_select=3)
    X_rfe = rfe.fit_transform(X,y)
    X_rfe.shape
    

    Embedded

    基于 L1 的特征选择

      使用 L1 范数作为惩罚项的线性模型(Linear models)会得到稀疏解:大部分特征对应的系数为 0。当你希望减少特征的维度以用于其它分类器时,可以通过 feature_selection.SelectFromModel 来选择不为 0 的系数。

      特别指出,常用于此目的的稀疏预测模型有 linear_model.Lasso(回归), linear_model.LogisticRegression 和 svm.LinearSVC(分类)

    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, prefit=True)
    X_embed = model.transform(X)
    X_embed.shape
    

    >【作者】:Labryant

    >【原创公众号】:风控猎人

    >【简介】:某创业公司策略分析师,积极上进,努力提升。乾坤未定,你我都是黑马。

    >【转载说明】:转载请说明出处,谢谢合作!~

    展开阅读全文

    页面更新:2024-03-20

    标签:递归   因变量   特征   方差   子集   相关性   权重   缩放   线性   系数   数值   变量   实战   模型   笔记   方法   金融   数据   工程   科技

    1 2 3 4 5

    上滑加载更多 ↓
    推荐阅读:
    友情链接:
    更多:

    本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

    © CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
    闽公网安备35020302034903号

    Top