栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

特征工程之数据预处理

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

特征工程之数据预处理

一、非数值型数据处理

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/269652.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号