算法实践2.1数据预处理

任务:数据预处理

对数据进行探索和分析:

  • 数据类型的分析

  • 无关特征删除

  • 数据类型转换

  • 缺失值处理

  • ...以及你能想到和借鉴的数据分析处理

1.查看数据

首先读入数据,查看数据的维度,并且输出5行感受一下~

import pandas as pd
data = pd.read_csv('./data_all.csv', engine='python')
print(data.shape)
data.head()

输出:

(4754, 85)

low_volume_percent

middle_volume_percent

take_amount_in_later_12_month_highest

trans_amount_increase_rate_lately

trans_activity_month

trans_activity_day

transd_mcc

trans_days_interval_filter

trans_days_interval

regional_mobility

...

consfin_product_count

consfin_max_limit

consfin_avg_limit

latest_query_day

loans_latest_day

reg_preference_for_trad

latest_query_time_month

latest_query_time_weekday

loans_latest_time_month

loans_latest_time_weekday

0

0.01

0.99

0

0.90

0.55

0.313

17.0

27.0

26.0

3.0

...

2.0

1200.0

1200.0

12.0

18.0

0

4.0

2.0

4.0

3.0

1

0.02

0.94

2000

1.28

1.00

0.458

19.0

30.0

14.0

4.0

...

6.0

22800.0

9360.0

4.0

2.0

0

5.0

3.0

5.0

5.0

2

0.04

0.96

0

1.00

1.00

0.114

13.0

68.0

22.0

1.0

...

1.0

4200.0

4200.0

2.0

6.0

0

5.0

5.0

5.0

1.0

3

0.00

0.96

2000

0.13

0.57

0.777

22.0

14.0

6.0

3.0

...

5.0

30000.0

12180.0

2.0

4.0

1

5.0

5.0

5.0

3.0

4

0.01

0.99

0

0.46

1.00

0.175

13.0

66.0

42.0

1.0

...

2.0

8400.0

8250.0

22.0

120.0

0

4.0

6.0

1.0

6.0

5 rows × 85 columns

可见一共是4754行,85列。所有的列似乎都是数值型的,为了更确定,我们用info()函数看看数据类型:

输出:

85列属性中,有73列是float型,12列是int型,并没有字符串型的属性,所以无需做额外处理。

而且可以看到每个特征都没有缺失值。也可以用另一个函数查看数据中缺失值的个数:

输出:

由于属性太多,这里没有显示全,可以将上述结果存起来,然后只输出有缺失值的列:

输出:

series为空,说明所有列都是无缺失值的。

2.属性转换

虽然读取的数据中所有属性的数据类型都是数值型的,但实际上可能存在一些类别型属性,比如status是0和1两个类别,但是pandas会将其处理成数值的0和1。需要对这种情况进行额外处理。

对于这种类型的数据有两种处理方式,一种是one-hot encoding,把属性的每个取值对应成类似于00001这种形式。比如status有两个取值0和1,那么就可以编码成01和10。sklearn中有相应的函数,也可以用pandas的get_dummies(df)函数。另一种方式是label encoding,只要给每个属性的取值一个唯一的数字即可,比如某个属性是weekday,可以取周一到周日七个值,用label encoding就是0-7这七个数字即可。sklearn中也有相应的函数。

下面我们来看看这个数据中有没有需要转换的属性。

一般这种属性都是int型的,所以我们只看int型的那些属性都有多少个取值。在第一步中我们看到数据类型就是两种:float64和int64,可以用select_dtypes函数选出那些int64的列:

输出:

根据属性的取值个数和属性名称大致可以判定该属性是否需要转换。看起来is_high_user和reg_preference_for_trad可能需要转换。

is_high_user只有两个取值,用value_counts函数看看每个取值有多少个:

输出:

is_high_user取值是0和1,只有两个取值的属性其实也无需转换。

再来看看另一个属性reg_preference_for_trad:

reg_preference_for_trad有5个取值,如果要用one-hot encoding方式就要转换,如果用label encoding方式就无需转换。为了展示one-hot encoding的用法,这里我们用one-hot方式。

代码如下:

这样就多出了5列,分别代表0-4这4种取值。

3.剔除不相关特征

由于属性列太多,不方便一一解释说明(况且我也不知道每个字段的含义ε=(´ο`*))))。属性列这么多,是不是都有用呢?这就跟我们的目标有关了。从之前的实验可以知道,我们希望预测用户贷款是否会逾期(对应的字段就是status),所以可以看每个属性跟status是否有关。

在这之前需要将X和y提取出来:

sklearn提供了特征选择的模块feature_selection,里面包含了一些函数,这里使用的是特征方差提取方式,默认方差为0的特征会删除。

输出:

没有剔除任何特征。。说明这里面每个特征多少还是有点用处,只是用处大小的不同罢了。

可以输出每个特征的方差看看:

有些特征的方差很大,有些特征的方差很小,其实看看特征的范围就大概能理解这一点了,方差大的特征大多是因为取值范围大,也不能完全靠这个说明特征与标签的相关性大小。可以设置阈值剔除一些不重要的特征,这里就不剔除了。

4.模型应用

根据之前的实验,选出一个模型看看效果即可。这里选择用虽然简单但效果好的逻辑回归模型。

输出:

Last updated

Was this helpful?