本文主要从 单特征分析,多特征筛选,特征监控,外部特征评估的几个方面对特征数据进行阐述。
来源 : 特征筛选_特征覆盖度怎么算_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. 回溯性