一周算法实践进阶day2:特征工程
数据说明
本次数据与之前数据不同: 下载
这份数据集是金融数据(非原始数据,已经处理过了),我们要做的是预测贷款用户是否会逾期。表格中 “status” 是结果标签:0表示未逾期,1表示逾期。
1任务
- 特征选择:分别用IV值和随机森林进行特征选择。再用【算法实践】中的7个模型(逻辑回归、SVM、决策树、随机森林、GBDT、XGBoost和LightGBM),进行模型评估。
2概念介绍
2.1IV值进行特征选择
2.1.1基本介绍
在二分类问题中,IV值(Information Value)主要用来对输入变量进行编码和预测能力评估。
IV 值的取值范围是[0, ∞ \infty∞),其大小表示该变量预测能力的强弱。通常认为:
IV值 | ** 预测 能力** |
---|---|
<0.02 | 无用 |
0.02-0.1 | 弱预测 |
0.1-0.3 | 中等预测 |
0.3-0.5 | 强预测 |
>0.5 | 可疑 |
一般选择中等和强预测能力的变量用于模型开发,一些学派也只提倡具有中等IV值的变量来进行模型开发。
2.1.2计算公式
(1)WOE(weight of evidence,证据权重),是对原始变量的一种编码形式。
(2)IV值:IV值的计算以WOE为基础,相当于是WOE值的一个加权求和。IV值主要用于特征选择,如果想对变量的预测能力进行排序,可以按 IV 值从高到低筛选。
IV在WOE前多乘了一个因子:
1)保证了IV的值不是负数;
2)很好的考虑了分组中样本占整体的比例(比例越低,这个分组对变量整体预测能力的贡献越低)。
这两者的详细介绍及公式请见参考1
2.2随机森林进行特征选择
用随机森林进行特征重要性评估的思想比较简单,主要是看每个特征在随机森林中的每棵树上做了多大的贡献,然后取平均值,最后比较不同特征之间的贡献大小。
贡献度的衡量指标包括:基尼指数(gini)、袋外数据(OOB)错误率作为评价指标来衡量。
特征筛选(随机森林)的详细介绍请见参考2
3完整代码及注释
#导入包
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score,roc_auc_score
import math
import numpy as np
from scipy import stats#包括统计工具和随机过程的概率过程
from sklearn.utils.multiclass import type_of_target#可以检查变量类型,连续或二分类等
from sklearn.model_selection import GridSearchCV#网格搜索(grid search)。
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import LinearSVC
from xgboost import XGBClassifier
from lightgbm import LGBMClassifier
from sklearn.ensemble import GradientBoostingClassifier
import warnings
warnings.filterwarnings("ignore")
#加载数据
data = pd.read_csv('data.csv',encoding='unicode_escape')#编码格式要注意
data.drop_duplicates(inplace=True)#是直接对原data进行操作,去除data中重复的行
print("数据行列数",data.shape)
#划分数据集
X = data.drop(['status','Unnamed: 0'],axis=1)
X_num = X.select_dtypes(include='number').copy()#数值型
X_str = X.select_dtypes(exclude='number').copy()#非数值型
y = data['status']
#缺失值处理
#发现缺失值方法:缺失个数、缺失率
#查看每列是否有缺失值
#print(data.isnull().sum())
# 使用缺失率(可以了解比重)并按照值降序排序 ascending=False
X_num_miss = (X_num.isnull().sum() / len(X_num)).sort_values(ascending=False)
#print(X_num_miss.head())
#print('----------' * 5)
X_str_miss = (X_str.isnull().sum() / len(X_str)).sort_values(ascending=False)
#print(X_str_miss.head())
#缺失值较多的列student_feature进行删除
X_num = X_num.drop(['student_feature'],axis = 1)
#高缺失率特征处理:EM插补、多重插补。这里先将缺失值归为一类。可以用平均数、中位数、众数、固定值(比如0)填充