用户贷款逾期预测特征工程

Contents

一、背景

这是一份关于用户借还贷款数据,以用户是否逾期为目标,进行特征处理,获取更好的训练数据特征,主要包括数据类型转换、缺失值处理和归一化处理

二、特征工程

1. 查看数据

# dataset.head()
dataset.describe()

image1

2. 删除无关变量

  • 对模型影响不大的数据及特征,比如固定的个人信息 custid、trade_no、bank_card_no、id_name
  • 单个值的数据特征:source列
    dataset = dataset.drop(["custid","trade_no","bank_card_no","id_name","first_transaction_time","latest_query_time","loans_latest_time","source"],axis=1)
    

    或使用函数进行判断,若值俩俩互不相同,则判断为无关变量,删除

    for i in dataset.columns:
      count = dataset[i].count()
      if len(list(dataset[i].unique())) in [1,count,count-1]:
          dataset.drop(i,axis = 1,inplace=True )
    

3. 偏度分析

# 先看看目标数据情况(status)
dataset.status.dtypes
print(dataset.status.skew())

输出结果

1.14924481556
# 然后查看所有特征偏度情况
np.abs(dataset.skew()).sort_values(ascending = False).head(20)

image2
可以看出前20个特征偏度都超过了 6,后期需要进行处理。

4. 缺失值分析

cols_missing_value = dataset.isnull().sum()/dataset.shape[0]
cols_missing_value = cols_missing_value[cols_missing_value>0]
print("特征缺失:",cols_missing_value.shape[0])
cols_missing_value.sort_values(ascending=False).head(10).plot.barh()

image3 有 74 个数据都有缺失值情况,需要进行处理,student_feature 特征缺失值较多,需要单独进行处理。
对于 student_feature 列,我们进行 NAN 转成 0,2转为 0

dataset["student_feature"] = dataset["student_feature"].fillna(0)
dataset["student_feature"] = dataset["student_feature"].replace([2],[0])

将object类型转成float

dataset = dataset.convert_objects(convert_numeric=True)

选取某个固定值/默认值填充缺失值

dataset.fillna(0,inplace=True)

或者用每一列的均值、中位数或众数,填充当列的缺失值
均值填充

dataset.fillna(data.mean(),inplace=True) # 受极端值影响较大

众数填充

dataset = dataset.fillna(0) # 使用 0 替换所有 NaN 的值
col = dataset.columns.tolist()[1:]
def missing(df, columns):
    """
    使用众数填充缺失值
    df[i].mode()[0] 获取众数第一个值
    """
    col = columns
    for i in col:
        df[i].fillna(df[i].mode()[0], inplace=True)
        df[i] = df[i].astype('float')
        
missing(dataset, col)

中位数填充

dataset.fillna(data.median(),inplace=True)

插值法拟合数据进行填充

for f in features: # 插值法填充
    dataset[f] = dataset[f].interpolate()
    
dataset.dropna(inplace=True)

5. 特征构建

5.1 对于城市类型数据reg_preference_for_trad
仅有两个缺失,用众数填充后分别使用编码的形式进行数据转换

# 众数填充
dataset['reg_preference_for_trad'] = dataset['reg_preference_for_trad'].fillna(dataset['reg_preference_for_trad'].mode()[0])
# 数字编码
data_map = dataset['reg_preference_for_trad'].map({'一线城市': 1, '二线城市': 2,'三线城市': 3,  '其他城市': 4, '境外':0})
#数字转码
n=set(dataset['reg_preference_for_trad'])
dic={}
for i,j in enumerate(n):
    dic[j]=i
dataset['reg_preference_for_trad'] = dataset['reg_preference_for_trad'].map(dic)

5.2 略。。。

这里暂时进行这样处理,之后会添加其他特征

6. 数据归一化和标准化

from sklearn.preprocessing import minmax_scale
# 归一化,缩放到0-1
X_train = minmax_scale(X_train)
X_test =  minmax_scale(X_test)
# 标准化数据,方差为1,均值为零
from sklearn.preprocessing import StandardScaler
standardScaler = StandardScaler()
X_train_fit = standardScaler.fit_transform(X_train)
X_test_fit = standardScaler.transform(X_test)

三、小结

。。。


转载请注明:yezuolin的博客 » 点击阅读原文