本文主要从 单特征分析,多特征筛选,特征监控,外部特征评估的几个方面对特征数据进行阐述。
来源 : 特征筛选_特征覆盖度怎么算_adamyoungjack的博客-CSDN博客
好特征可以从几个角度衡量:覆盖度,区分度,相关性,稳定性
1. 应用场景
2. 分类
3. 计算
4. 衍生
1. 简介
2. 应用场金
3. 计算



4. 注意
1. 简介
对线性回归模型,有一条基本假设是自变量x1,x2,…,xp之间不存在严格的线性关系
2. 分类
需要对相关系数较大的特征进行筛选,只保留其中对标签区分贡献度最大的特征,即保留IV较大的
皮尔逊相关系数,斯皮尔曼相关系数,肯德尔相关系数
3. 选择
总结:就适用性来说,kendall > spearman > pearson
4. 计算
- import pandas as pd
- df = pd.DataFrame({'A':[5,91,3],'B':[90,15,66],'C':[93,27,3]})
- df.corr() # 皮尔逊
- df.corr('spearman')#斯皮尔曼
- df.corr('kendall')#肯德尔
- import pandas as pd
- import toad data = pd.read_csv('data/germancredit.csv')
- data.replace({'good':0,'bad':1},inplace=True)
- data.shape
- #缺失率大于0.5,IV值小于0.05,相关性大于0.7来进行特征筛选
- selected_data, drop_list= toad.selection.select(data,target = 'creditability', empty = 0.5, iv = 0.05, corr = 0.7, return_drop=True)
- print('保留特征:',selected_data.shape[1],'缺失删除:',len(drop_list['empty']),'低iv删 除:',len(drop_list['iv']),'高相关删除:',len(drop_list['corr']))

1. 简介
当构建了大量特征时,接下来的调整就是筛选出合适的特征进行模型训练
过多的特征会导致模型训练变慢,学习所需样本增多,计算特征和存储特征成本变高
2. 方法
1. 简介
星座是公认没用的特征,区分度低于星座的特征可以认为是无用特征
2. 步骤
1. 简介
2.原理

3. 应用
- import numpy as np
- import pandas as pd
- import joblib
- from sklearn.ensemble import RandomForestClassifier
- from boruta import BorutaPy
- #加载数据
- pd_data = joblib.load('data/train_woe.pkl') pd_data
- #处理数据,去掉id 和 目标值
- pd_x = pd_data.drop(['SK_ID_CURR', 'TARGET'], axis=1)
- x = pd_x.values # 特征
- y = pd_data[['TARGET']].values # 目标
- y = y.ravel() # 将多维数组降位一维
- # 先定义一个随机森林分类器
- rf = RandomForestClassifier(n_jobs=-1, class_weight='balanced', max_depth=5)
- '''
- BorutaPy function
- estimator : 所使用的分类器
- n_estimators : 分类器数量, 默认值 = 1000
- max_iter : 最大迭代次数, 默认值 = 100
- '''
- feat_selector = BorutaPy(rf, n_estimators='auto', random_state=1, max_iter=10)
- feat_selector.fit(x, y)
- dic_ft_select = dict()
- # feat_selector.support_ # 返回特征是否有用,false可以去掉
- for ft, seleted in zip(pd_x.columns.to_list(), feat_selector.support_):
- dic_ft_select[ft] = seleted
- pd_ft_select = pd.DataFrame({'feature':pd_x.columns.to_list(), "selected": feat_selector.support_})
- pd_ft_selec

2. 计算

- import numpy as np
- import pandas as pd
- import joblib
- from statsmodels.stats.outliers_influence import variance_inflation_factor
- pd_data = joblib.load('./train_woe.pkl') #去掉ID和目标值
- pd_x = pd_data.drop(['SK_ID_CURR', 'TARGET'], axis=1)
- #定义计算函数
- def checkVIF_new(df):
- lst_col = df.columns
- x = np.matrix(df)
- VIF_list = [variance_inflation_factor(x,i) for i in range(x.shape[1])]
- VIF = pd.DataFrame({'feature':lst_col,"VIF":VIF_list})
- max_VIF = max(VIF_list) print(max_VIF)
- return VIF
- df_vif = checkVIF_new(pd_x)
- df_vif
df_vif[df_vif['VIF'] > 3]
sklearn.feature_selection.RFE
- import numpy as np
- import pandas as pd
- import joblib from sklearn.feature_selection
- import RFE from sklearn.svm
- import SVR pd_data = joblib.load('data/final_data.pkl')
- pd_data
- pd_x = pd_data.drop(['SK_ID_CURR', 'TARGET'], axis=1)
- x = pd_x.values
- y = pd_data[['TARGET']].values
- y = y.ravel()
- #定义分类器
- estimator = SVR(kernel="linear")
- selector = RFE(estimator, 3, step=1) # step 一次去掉几个特征
- selector = selector.fit(x, y)
- #展示选择参数
- dic_ft_select = dict()
- for ft, seleted in zip(pd_x.columns.to_list(), selector.support_):
- dic_ft_select[ft] = seleted
- pd_ft_select = pd.DataFrame({'feature':pd_x.columns.to_list(), "selected": selector.support_})
- pd_ft_select
1. 简介
- from sklearn.svm import LinearSVC
- from sklearn.datasets import load_iris
- from sklearn.feature_selection import SelectFromModel
- iris = load_iris() X, y = iris.data, iris.target
- X.shape
- lsvc = LinearSVC(C=0.01, penalty="l1", dual=False).fit(X, y)
- model = SelectFromModel(lsvc, prefit=True)
- X_new = model.transform(X)
- X_new.shape


分箱样本比例:

分箱风险区分:要重视每个特征的风险趋势单调性

1. 避免未来信息
2. 外部数据覆盖度计算
3. 避免内部数据泄露

4. 避免三方公司对结果美化
5. 评分型外部数据
6. 模型效果
7. 黑名单型外部数据


8. 回溯性