例如,性别中的’男‘和’女‘,处理时可以将其分别转换为数字1和0
python中主要包括get_dummies哑变量处理,LabelEncoding处理以及replace()替换
import pandas as pd
df = pd.Dataframe({'客户编号':[1,2,3],'性别':['男','女','男']})
df1 = pd.get_dummies(df,columns=['性别'])
df1 = df1.drop(columns='性别_女')#‘性别_男’和‘性别_女’这两列存在多重共线性,删除‘性别_女’这一列
df2 = df1.rename(columns={'性别_男':'性别'})#更改列名
经过get_dummies处理后得到的df1
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:
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:
df = pd.Dataframe({'编号':[1,2,3,4,5],'城市':['北京','上海','广州','深圳','北京']})
df['城市'].value_counts()
df['城市'] = df['城市'].replace({'北京':0,'上海':1,'广州':2,'深圳':3})
经过replace()处理后得到的df:
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.异常值处理
删除异常值
将异常值视为缺失值
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值,可以根据其值的高低排序,即可以筛选出需要的特征变量:



