其他分享传送门 : 机器学习高度复用代码总结*综合版
1. 检查全部的特征类型
for i in train.columns:
print(i , train[i].dtype)
2. 抽取非 object 类型的特征
train.select_dtypes(exclude=['object']).columns.to_list()
3. baseline 常用 : 均值快速填充
numerical_fea 是数值型特征list
train[numerical_fea] = train[numerical_fea].fillna(train[numerical_fea].median())
4. 手动为 object 编码
1) 全手工
为train里面的字段全部手动编码。优点是后续自己调整时候显得灵活,尽在掌握之中;缺点是有点累。
for data in [train]:
data['issueDate'] = pd.to_datetime(data['issueDate'],format='%Y-%m-%d')
data['grade'] = data['grade'].map({'A':1,'B':2,'C':3,'D':4,'E':5,'F':6,'G':7})
data['employmentLength'] = data['employmentLength'].map({'1 year':1,'2 years':2,'3 years':3,'4 years':4,'5 years':5,'6 years':6,'7 years':7,'8 years':8,'9 years':9,'10+ years':10,'< 1 year':0})
data['subGrade'] = data['subGrade'].map({'E2':1,'D2':2,'D3':3,'A4':4,'C2':5,'A5':6,'C3':7,'B4':8,'B5':9,'E5':10,
'D4':11,'B3':12,'B2':13,'D1':14,'E1':15,'C5':16,'C1':17,'A2':18,'A3':19,'B1':20,
'E3':21,'F1':22,'C4':23,'A1':24,'D5':25,'F2':26,'E4':27,'F3':28,'G2':29,'F5':30,
'G3':31,'G1':32,'F4':33,'G4':34,'G5':35})
data['earliesCreditLine'] = data['earliesCreditLine'].apply(lambda s: int(s[-4:]))
2) 半自动
通过函数逻辑定义,传入函数名自动完成。
def workYearDIc(x):
if str(x)=='nan':
return -1
x = x.replace('< 1','0')
return int(re.search('(\d+)', x).group())
train_data['work_year'] = train_data['work_year'].map(workYearDIc)
5. 发现缺失数据
Pandas的count()函数可以统计不为空的个数,shape函数可以统计数据样本的个数。
将shape与count作差,差值除以总数就是缺失率。
(user_info.shape[0]-user_info['age_range'].count()) / user_info.shape[0]
6. 缺失值的处理思路
1. 对于数据缺失特别严重的数据,我们一般将其删除处理。
2. 对于缺失值较少的情况,一般采用以下方法
1.统计量填充
连续值:推荐中位数填充,排除特别大的或是特别小的异常值影响。
离散值: 推荐使用众数,不能用均值和中位数。2.特殊值填充 : 填一个不在正常取值范围的数值,如使用 -999 , 0 表示缺失值
3.XGB和LGB对缺失值不敏感,算法有一套缺失值处理方法。含缺失值的data喂给它们问题不大。
方法 使用场景
类均值插补 低缺失率首选
类随机插补 低缺失
多重插补MCMC 高缺失率首选
Em插补 高缺失率