算法实践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?