一、缺失值处理
1.对数据进行对象类型和数据类型分类
numerical_fea = list(data_train.select_dtypes(exclude=['object']).columns)
category_fea = list(filter(lambda x: x not in numerical_fea,list(data_train.columns)))
label = 'isDefault'
numerical_fea.remove(label)
2.查看缺失值
data_train.isnull().sum()
3.按众数填充
data_train[category_fea] = data_train[category_fea].fillna(data_train[category_fea].mode())
data_test_a[category_fea] =data_test_a[category_fea].fillna(data_train[category_fea].mode())
4.按平均数填充
data_train[numerical_fea] =data_train[numerical_fea].fillna(data_train[numerical_fea].median())
data_test_a[numerical_fea] =data_test_a[numerical_fea].fillna(data_train[numerical_fea].median())
5.时间格式处理
for data in [data_train, data_test_a]:
data['issueDate'] = pd.to_datetime(data['issueDate'],format='%Y-%m-%d')
startdate = datetime.datetime.strptime('2007-06-01', '%Y-%m-%d')
6.对象类型特征转换到数值
7. 类别特征处理
等级这种类别特征,是有优先级的可以labelencode或者自映射
二、异常值处理
检测异常的方法一:均方差
在统计学中,如果一个数据分布近似正态,那么大约 68% 的数据值会在均值的一个标准差范围内,大约 95% 会在两个标准差范围内,大约 99.7% 会在三个标准差范围内。
def find_outliers_by_3segama(data,fea):
data_std = np.std(data[fea])
data_mean = np.mean(data[fea])
outliers_cut_off = data_std * 3
lower_rule = data_mean - outliers_cut_off
upper_rule = data_mean + outliers_cut_off
data[fea+'_outliers'] = data[fea].apply(lambda x:str('异常值') if x > upper_rule or x <
lower_rule else '正常值')
return data
检测异常的方法二:箱型图
四分位数会将数据分为三个点和四个区间,IQR = Q3 -Q1,下触须=Q1 − 1.5x IQR,上触须=Q3
+ 1.5x IQR;
三、数据分桶
1. 特征分箱的目的:
a. 从模型效果上来看,特征分箱主要是为了降低变量的复杂性,减少变量噪音对模型的影响,提高自变量和因变量的相关度。从而使模型更加稳定。
2. 数据分桶的对象:
a. 将连续变量离散化
b. 将多状态的离散变量合并成少状态
3. 分箱的原因:
a. 数据的特征内的值跨度可能比较大,对有监督和无监督中如k-均值聚类它使用欧氏距离作为相似度函数来测量数据点之间的相似度。都会造成大吃小的影响,其中一种解决方法是对计数值进行区间量化即数据分桶也叫做数据分箱,然后使用量化后的结果。
4. 分箱的优点:
a. 处理缺失值:当数据源可能存在缺失值,此时可以把null单独作为一个分箱。
b. 处理异常值:当数据中存在离群点时,可以把其通过分箱离散化处理,从而提高变量的鲁棒性(抗干扰能力)。例如,age若出现200这种异常值,可分入“age > 60”这个分箱里,排除影响。
c. 业务解释性:我们习惯于线性判断变量的作用,当x越来越大,y就越来越大。但实际x与y之间经常存在着非线性关系,此时可经过WOE变换。
5. 特别要注意一下分箱的基本原则:
a. (1)最小分箱占比不低于5%
b. (2)箱内不能全部是好客户
c. (3)连续箱单调
1. 固定宽度分箱
当数值横跨多个数量级时,最好按照 10 的幂(或任何常数的幂)来进行分组:09、1099、100999、10009999,等等。固定宽度分箱非常容易计算,但如果计数值中有比较大的缺口,就会产生很多没有任何数据的空箱子。
1) 通过除法映射到间隔均匀的分箱中,每个分箱的取值范围都是loanAmnt/1000
data['loanAmnt_bin1'] = np.floor_divide(data['loanAmnt'], 1000)
2)通过对数函数映射到指数宽度分箱
data['loanAmnt_bin2'] = np.floor(np.log10(data['loanAmnt']))
2. 分位数分箱
data['loanAmnt_bin3'] = pd.qcut(data['loanAmnt'], 10, labels=False)
3. 卡方分箱及其他分箱方法的尝试
四、特征交互
1. 交互特征的构造非常简单,使用起来却代价不菲。如果线性模型中包含有交互特征对,那它的训练时间和评分时间就会从 O(n) 增加到 O(n2),其中 n 是单一特征的数量。
五、特征编码
1. labelEncode 直接放入树模型中
2.逻辑回归等模型要单独增加的特征工程
1. 对特征做归一化,去除相关性高的特征
2. 归一化目的是让训练过程更好更快的收敛,避免特征大吃小的问题
3. 去除相关性是增加模型的可解释性,加快预测过程。
六、特征选择
1. 特征选择技术可以精简掉无用的特征,以降低最终模型的复杂性,它的最终目的是得到一个简约模型,在不降低预测准确率或对预测准确率影响不大的情况下提高计算速度。特征选择不是为了减少训练时间(实际上,一些技术会增加总体训练时间),而是为了减少模型评分时间。
特征选择的方法:
1. 1 Filter
a. 方差选择法
b. 相关系数法(pearson 相关系数)
c. 卡方检验
d. 互信息法
2. 2 Wrapper (RFE)
a. 递归特征消除法
3. 3 Embedded
a. 基于惩罚项的特征选择法
b. 基于树模型的特征选择
网友评论