数据预处理

一、简介

数据预处理的主要目的在于对数据进行清洗,以更好的用于后续建模分析。
数据预处理一般包括:重复值处理、缺失值处理、异常值处理、数据无量纲化、字符型特征及数值型特征处理等。

二、字符型数据处理

无论是标签还是特征,原始数据都可能是字符型,需要转为数值型。

1、字符型标签的处理

import pandas as pd
# 加载数据
data = pd.read_csv(r'path')
# 删除无意义的列
data.drop(['name'], axis=1, inplace=True)
# 将文字型标签变量转为数值型
class_mapping = {'是':1, '否':0}
data['label'] = data['label'].map(class_mapping)

# 上述步骤也可以用sklearn中的LabelEncoder进行转换,但是个人比较喜欢上述自定义方法
from sklearn.preprocessing import LabelEncoder
data['label'] = LabelEncoder().fit_transform(data['label'])

2、字符型特征的处理

字符型特征变量分为两类,一是有序的变量(如身高:小于1.2,1.2-1.5,大于1.5)、二是无序的变量(如性别、学历等),对于有序的变量,可使用sklearn.preprocessing.OrdinalEncoder,对于无序变量,可使用sklearn.preprocessing.oneHotEncoder。

2.1 有序特征变量
from sklearn.preprocessing import OrdinalEncoder
data['feature'] = OrdinalEncoder().fit_transform(data['feature'])
# data.iloc[:,1:-1] = OrdinalEncoder().fit_transform(data.iloc[:,1:-1])
2.2 无序特征变量
from sklearn.preprocessing import oneHotEncoder
result = oneHotEncoder().fit_transform(data.iloc[:,1:-1]).toarray()
newdata = pd.concat([data, pd.DataFrame(result)], axis=1)

三、数值型特征处理

一般的数值型特征不需要特别处理,若需要处理,一般分两种类型,一是二值化(0和1),二是分段处理(数据分箱)。

3.1 二值化处理

from sklearn.preprocessing import Binarizer
import pandas as pd
df = pd.DataFrame({'身高':[150,160,170,155,180,5000],
	               '体重':[50,60,70,75,80,4000]
	              })

x = df.iloc[:,0].values.reshape(-1,1)  # 不能使用一维数组
transform = Binarizer(threshold=500).fit_transform(x) # 将500以下归为0,500以上归为1
print(transform)

3.2 数据分箱

from sklearn.preprocessing import KBinsDiscretizer
import pandas as pd
df = pd.DataFrame({'身高':[150,160,170,155,180,5000],
	               '体重':[50,60,70,75,80,4000]
	              })

x = df.iloc[:,0].values.reshape(-1,1)  # 不能使用一维数组
bins = KBinsDiscretizer(n_bins=5,encode='ordinal', strategy='uniform').fit_transform(x) # 分为5箱

KBinsDiscretizer主要有三个参数:
1、n_bins:每个特征中分箱的个数,默认5,一次会被运用到所有导入的特征。

2、encode:编码的方式,默认“onehot”
“onehot”:做哑变量,之后返回一个稀疏矩阵,每一列是一个特征中的一个类别,含有该类别的样本表示为1,不含的表示为0
“ordinal”:每个特征的每个箱都被编码为一个整数,返回每一列是一个特征,每个特征下含有不同整数编码的箱的矩阵
“onehot-dense”:做哑变量,之后返回一个密集数组。

3、strategy:用来定义箱宽的方式,默认"quantile"
“uniform”:表示等宽分箱,即每个特征中的每个箱的最大值之间的差为(特征.max() -特征.min())/(n_bins)
“quantile”:表示等位分箱,即每个特征中的每个箱内的样本数量都相同
“kmeans”:表示按聚类分箱,每个箱中的值到最近的一维K均值聚类的簇心的距离都相同。

四、重复值数据处理

重复值数据处理
对于重复值数据,一般直接剔除重复值,仅保留一条数据。

import pandas as pd
df = pd.DataFrame({'身高':[150,160,170,155,180,5000,5000],
	               '体重':[50,60,70,75,80,4000,4000]
	              })
df.drop_duplicates(inplace=True)

五、缺失值处理

对于缺失值数据,若缺失率低,则可直接剔除,否则就需要填补,可使用均值、0、中位数、众数或随机森林等模型进行填补,但若只使用决策树、随机森林(将缺失值作为分布的一种状态,并参与到建模流程)或KNN(缺失值不参与距离计算)进行分类或预测则不需要处理缺失值。
填补缺失值一般使用sklearn.impute.SimpleImputer,当然也可以直接使用pandas的fillna(个人偏爱第一种)
查看数据是否存在缺失值

data.shape # 查看特征个数
data.info() # 查看是否有缺失值

使用sklearn.impute.SimpleImputer补全缺失值
#使用均值、中位数填充

from sklearn.impute import SimpleImputer
imp_mean = SimpleImputer(strategy='mean').fit_transform(data.loc[: , 'age'])
data.loc[: , 'age'] = imp_mean 

注:strategy可以等于mean\median\most_frequent\constant。

#使用常数,如0填充

from sklearn.impute import SimpleImputer
imp_0 = SimpleImputer(strategy='constant', fill_value=0).fit_transform(data.loc[: , 'age'])
data.loc[: , 'age'] = imp_0

六、异常值处理

6.1 检查是否存在异常值

使用箱线图检查

import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({'身高':[150,160,170,155,180,500],
	               '体重':[50,60,70,75,80,400]
	              })
df.plot.box(title="Consumer spending in each country")
plt.grid(linestyle="--", alpha=0.3)
plt.show()

使用Z-score检查是否有异常值

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame({'身高': [150, 160, 170, 155, 180, 5000],
                   '体重': [50, 60, 70, 75, 80, 4000]
                   })

df_zscore = df.copy()
for col in df.columns:
    z_score = (df[col] - df[col].mean()) / df[col].std()
    print(z_score)
    df_zscore[col] = z_score.abs() < 2  # Z-score标准化得分一般大于2.2,就是相对异常的表现值,这里阈值为2
# 剔除身高的异常值,将整条数据删除
df[df_zscore['身高']==True]

七、数据无量纲化

数据无量纲化指将不同规格的数据转换到统一规格或不同分布的数据转换到某个特定范围,以减少规模、特征、分布差异等对模型的影响。
常见的无量纲化方法如下:
在这里插入图片描述

7.1 归一化

若明确需要数据范围时,可以使用标准化,该方法缺点在于容易受异常值影响。数据范围为[0,1],代码如下:

import pandas as pd
from sklearn.preprocessing import MinMaxScaler
df = pd.DataFrame({'身高': [150, 160, 170, 155, 180, 500],
                   '体重': [50, 60, 70, 75, 80, 4000]
                   })

scaler = MinMaxScaler().fit_transform(df)
df_scaler = pd.DataFrame(scaler,columns=df.columns)
print(df_scaler)

7.2 标准化

最常用的无量纲化方法,使数据满足正太分布。

import pandas as pd
from sklearn.preprocessing import MinMaxScaler,StandardScaler
df = pd.DataFrame({'身高': [150, 160, 170, 155, 180, 500],
                   '体重': [50, 60, 70, 75, 80, 4000]
                   })

scaler = StandardScaler().fit_transform(df)
df_scaler = pd.DataFrame(scaler,columns=df.columns)
print(df_scaler)

7.3 MaxabsScaler

常用于对稀疏矩阵进行无量纲化,数据范围为【-1,1】,不会破坏数据的稀疏性。

import pandas as pd
from sklearn.preprocessing import MinMaxScaler,StandardScaler,MaxAbsScaler
df = pd.DataFrame({'身高': [0,150, 160, 170, 155, 180, 500],
                   '体重': [0,50, 60, 70, 75, 80, 4000]
                   })

scaler = MinMaxScaler().fit_transform(df)
df_scaler = pd.DataFrame(scaler,columns=df.columns)
print(df_scaler)

7.4 RobustScaler

假如数据有异常值,可以使用Z-Score进行标准化。但是标准化之后的数据并不理想,因为异常点的特征往往在标准化之后容易失去离群特征。此时,可以使用RobustScaler针对离群点做标准化处理,该方法对数据中心化和数据的缩放鲁棒性有更强的参数控制。

import pandas as pd
from sklearn.preprocessing import MinMaxScaler,StandardScaler,MaxAbsScaler,RobustScaler
df = pd.DataFrame({'身高': [0,150, 160, 170, 155, 180, 500],
                   '体重': [0,50, 60, 70, 75, 80, 4000]
                   })

scaler = RobustScaler().fit_transform(df)
df_scaler = pd.DataFrame(scaler,columns=df.columns)
print(df_scaler)
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值