特征工程之数据预处理

一、非数值型数据处理

例如,性别中的’男‘和’女‘,处理时可以将其分别转换为数字1和0
python中主要包括get_dummies哑变量处理,LabelEncoding处理以及replace()替换

1.1、get_dummies(二分类)

import pandas as pd
df = pd.DataFrame({'客户编号':[1,2,3],'性别':['男','女','男']})
df1 = pd.get_dummies(df,columns=['性别'])#其中使用sparse=True可以生成一个稀疏矩阵
df1 = df1.drop(columns='性别_女')#‘性别_男’和‘性别_女’这两列存在多重共线性,删除‘性别_女’这一列
df2 = df1.rename(columns={'性别_男':'性别'})#更改列名

经过get_dummies处理后得到的df1
在这里插入图片描述

1.2、get_dummies(多分类)

import pandas as pd
df = pd.DataFrame({'房屋编号':[1,2,3,4,5],'朝向':['东','南','西','北','南']})
df1 = pd.get_dummies(df,columns=['朝向'])
df2 = df1.drop(columns='朝向_西')#可根据3列朝向的数字就能判断第4个朝向的数字,存在多重共线性,可删除其中一列,例如'朝向_西'

经过get_dummies处理后得到的df1
在这里插入图片描述

2、LabelEncoding处理

import pandas as pd
from sklearn.preprocessing import LabelEncoder
df = pd.DataFrame({'编号':[1,2,3,4,5],'城市':['北京','上海','广州','深圳','北京']})
le = LabelEncoder()
label = le.fit_transform(df['城市'])
df['城市'] = label

经过LabelEncoding处理后得到的df
在这里插入图片描述

3、replace()替换

df = pd.DataFrame({'编号':[1,2,3,4,5],'城市':['北京','上海','广州','深圳','北京']})
df['城市'].value_counts()
df['城市'] = df['城市'].replace({'北京':0,'上海':1,'广州':2,'深圳':3})

经过replace()处理后得到的df
在这里插入图片描述

二、重复值,缺失值以及异常值处理

1.重复值

data = pd.DataFrame([[1,2,3],[1,2,3],[4,5,6]],columns=['c1','c2','c3'])
data[data.duplicated()]#筛选出重复行
data.duplicated().sum()#统计重复行的数量
data = data.drop_duplicates()#删除重复行

2.缺失值处理

import numpy as np
data = pd.DataFrame([[1,np.nan,3],[np.nan,2,np.nan],[1,np.nan,0]],columns=['c1','c2','c3'])
data.isnull()#查看空值,也可以使用data.isna()
a = data.dropna()#只要含有空值的行都会被删除
aa = data.dropna(thresh=2)#一行的非空值少于2个则删除该行
b = data.fillna(data.mean())#每列的空值都会被该列的均值填充
c = data.fillna(method='pad')#空值上方的值填充,上方为空或不存在,则不替换
cc = data.fillna(method='backfill')#也可使用method='bfill',空值下方的值填充,下方为空或不存在,则不替换

3.异常值处理

删除异常值
将异常值视为缺失值

三、数据标准化

1.min-max标准化

X^*=(x-min)/(max-min)

import pandas as pd
from sklearn.preprocessing import MinMaxScaler
x = pd.DataFrame({'酒精含量(%)':[50,60,40,80,100],'苹果酸含量(%)':[2,1,1,3,2]})
y = [0,0,0,1,1]
x_new = MinMaxScaler().fit_transform(x)

2.Z-score标准化

在这里插入图片描述

from sklearn.preprocessing import StandardScaler
x_new = StandardScaler().fit_transform(x)

四、数据分箱

data = pd.DataFrame([[22,1],[25,1],[20,0],[35,0],[32,1],[38,0],[50,0],[46,1]],columns=['年龄','是否违约'])
data_cut = pd.cut(data['年龄'],3)#对年龄这一列 分成3箱操作
data['年龄'].groupby(data_cut).count()#获取每个分箱中的样本数

五、特征筛选:WOE值与IV值

#构造数据
data = pd.DataFrame([[22,1],[25,1],[20,0],[35,0],[32,1],[38,0],[50,0],[46,1]],columns=['年龄','是否违约'])
data_cut = pd.cut(data['年龄'],3)#对年龄这一列 分成3箱操作
#数据分箱
data['年龄'].groupby(data_cut).count()#获取每个分箱中的样本数
#统计各个分箱的总样本数,坏样本数和好样本数
cut_group_all = data['是否违约'].groupby(data_cut).count()#统计总客户数
cut_y = data['是否违约'].groupby(data_cut).sum()#统计违约客户数
cut_n = cut_group_all - cut_y#统计未违约客户数

df = pd.DataFrame()
df['总数'] = cut_group_all
df['坏样本'] = cut_y
df['好样本'] = cut_n

df['坏样本%'] =df['坏样本'] / df['坏样本'].sum()
df['好样本%'] =df['好样本'] / df['好样本'].sum()

#计算WOE值
import numpy as np
df['WOE'] = np.log(df['坏样本%'] / df['好样本%'])  
df = df.replace({'woe': {np.inf:0,-np.inf:0}})#替换可能存在的无穷大
#计算各个分箱的IV值
df['IV'] = df['WOE']*(df['坏样本%'] - df['好样本%'])  

#分类汇总各个分箱的IV值,获得特征变量的IV值
iv = df['IV'].

通过计算各个特征变量的IV值,可以根据其值的高低排序,即可以筛选出需要的特征变量:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值