一、非数值型数据处理
例如,性别中的’男‘和’女‘,处理时可以将其分别转换为数字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标准化
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值,可以根据其值的高低排序,即可以筛选出需要的特征变量: