sklearn中的数据预处理

数据挖掘的五大流程
1、获取数据
2、数据预处理

数据预处理是从数据中检测,纠正或删除损坏,不准确或不适用于模型的记录的过程可能面对的问题有:数据类型不同,比如有的是文字,有的是数字,有的含时间序列,有的连续,有的间断。也可能,数据的质量不行,有噪声,有异常,有缺失,数据出错,量纲不一,有重复,数据是偏态,数据量太大或太小
数据预处理的目的:让数据适应模型,匹配模型的需求

3、特征工程
特征工程是将原始数据转换为更能代表预测模型的潜在问题的特征的过程,可以通过挑选最相关的特征,提取特征以及创造特征来实现。其中创造特征又经常以降维算法的方式实现。
可能面对的问题有:特征之间有相关性,特征和标签无关,特征太多或太小,或者干脆就无法表现出应有的数据现象或无法展示数据的真实面貌

特征工程的目的:1) 降低计算成本,2) 提升模型上限

4. 建模
测试模型并预测出结果

5. 上线
验证模型效果

  • 模块preprocessing:几乎包含数据预处理的所有内容
  • 模块Impute:填补缺失值专用
  • 模块feature_selection:包含特征选择的各种方法的实践
  • 模块decomposition:包含降维算法

数据预处理Preprocessing &Impute

数据无量纲化

1、中心化处理(Zero-centered或者Mean-subtraction)
2、缩放处理(Scale)
中心化的本质是让所有记录减去一个固定值,即让数据样本数据平移到某个位置。缩放的本质是通过除以一个固定值,将数据固定在某个范围之中,取对数也算是一种缩放处理。
数据归一化(Normalization)

分式上面:数据的中心化
上面除以下面:数据的缩放
在sklearn中,我们使用preprocessing.MinMaxScaler来实现。MinMaxScaler有一个重要参数:feature_range,控制我们希望把数据压缩到的范围,默认是[0,1]。

  • 数据归一化的过程
from sklearn.preprocessing import MinMaxScaler
data = [[-1,2],[-0.5,6],[0,10],[1,18]]   # 4行2列
# 实现归一化
scaler = MinMaxScaler()  #实例化
scaler = scaler.fit(data)  #这里的本质是生成min(x)和max(x)
# 当X中的特征数量非常多的时候,fit就会报错,表示数据量太大了我计算不了
# 此时使用partial_fit作为训练接口
# scaler = scaler.partial_fit(data)
result = scaler.transform(data)  #通过接口导出结果
result

array([[0. , 0. ],[0.25, 0.25],[0.5 , 0.5 ],[1. , 1. ]])

  • 也可以用inverse将归一化后的结果逆转
scaler.inverse_transform(result)   # 将归一化后的结果逆转
  • 可以使用MinMaxScaler的参数feature_range实现将数据归一化到[0,1]以外的范围中
data = [[-1,2],[-0.5,6],[0,10],[1,18]]
scaler = MinMaxScaler(feature_range=[5,10])   #实例化
result = scaler.fit_transform(data)

array([[ 5. , 5. ],[ 6.25, 6.25],[ 7.5 , 7.5 ],[10. , 10. ]])

数据的标准化(Standardization)
当数据按均值中心化后,再按标准差缩放,数据就会服从为均值为0,方差为1的正太分布(标准正太分布),而这个过程,就叫数据的标准化。
在这里插入图片描述

from sklearn.preprocessing import StandardScaler
data = [[-1,2],[-0.5,6],[0,10],[1,18]]
scaler = StandardScaler() #实例化
scaler.fit(data)
x_std = scaler.transform(data)
# 可以使用.mean()和.var()查看到x_std的均值和方差为0和1

x_std为
array([[-1.18321596, -1.18321596],[-0.50709255, -0.50709255],[ 0.16903085, 0.16903085],[ 1.52127766, 1.52127766]])


对于StandardScaler和MinMaxScaler来说,空值NaN会被当做是缺失值,在fit的时候忽略,在transform的时候保持缺失NaN的状态显示。并且,尽管去量纲化过程不是具体的算法,但在fit接口中,依然只允许导入至少二维数组,一维数组导入会报错。通常来说,我们输入的X会是我们的特征矩阵,现实案例中特征矩阵不太可能是一维所以不会存在这个问题。
在这里插入图片描述

缺失值的处理

  • impute.SimpleImputer

class sklearn.impute.SimpleImputer (missing_values=nan, strategy=’mean’, fill_value=None, verbose=0,copy=True)
在这里插入图片描述
读取数据

import pandas as pd
data = pd.read_csv(r"F:\data\Narrativedata.csv",index_col=0)   # index_col = 0 意思是把第0列当作索引
Age = data.loc[:,'Age'].values.reshape(-1,1)  # sklearn中的特征矩阵必须是二维
data.info()

data.info()的结果
<class ‘pandas.core.frame.DataFrame’>
Int64Index: 891 entries, 0 to 890
Data columns (total 4 columns):
Age 714 non-null float64
Sex 891 non-null object
Embarked 889 non-null object
Survived 891 non-null object
dtypes: float64(1), object(3)
memory usage: 34.8+ KB

填补年龄(按均值,按中位数,按0)

from sklearn.impute import SimpleImputer
imp_mean = SimpleImputer() # 默认用均值填补
imp_median = SimpleImputer(strategy='median') #用中位数填补
imp_0 = SimpleImputer(strategy='constant',fill_value=0)  # 用0填补
imp_mean = imp_mean.fit_transform(Age)
imp_median = imp_median.fit_transform(Age)
imp_0 = imp_0.fit_transform(Age)

使用众数填补Embarked

# 使用众数填补Embarked
Embarked = data.loc[:,'Embarked'].values.reshape(-1,1)
imp_mode = SimpleImputer(strategy='most_frequent')
data.loc[:,'Embarked'] = imp_mode.fit_transform(Embarked)

对于想丢弃的数据,可以使用pandas里的dropna来操作

data.dropna(axis=0,inplace=True)
#.dropna(axis=0)删除所有有缺失值的行,.dropna(axis=1)删除所有有缺失值的列
#参数inplace,为True表示在原数据集上进行修改,为False表示生成一个复制对象,不修改原数据,默认False
data = data.dropna(axis=0,inplace=False)

处理分类型特征:编码与哑变量

将文字型数据转换为字符型

  • preprocessing.LabelEncoder:标签专用,能够将分类标签转换为分类数值
from sklearn.preprocessing import LabelEncoder
y = data.iloc[:,-1]  # 要输入的是标签,不是特征矩阵,所以允许一维
le = LabelEncoder() #实例化
le = le.fit(y) #导入数据
label = le.transform(y) # transform接口调取结果
data.iloc[:,-1] = label #将data里的数据进行转变

查看标签中究竟有多少类别

le.classes_ # 属性.classes_ 查看标签中究竟有多少类别

以上代码是可以直接写成一句话的

from sklearn.preprocessing import LabelEncoder
data.iloc[:,-1] = LabelEncoder().fit_transform(data.iloc[:,-1])
  • preprocessing.OrdinalEncoder:特征专用,能够将分类特征转换为分类数值(必须是二维数组)
from sklearn.preprocessing import OrdinalEncoder
data_ = data.copy()

接口 categories_对应LabelEncoder的接口classes_,一模一样的功能

OrdinalEncoder().fit(data_.iloc[:,1:-1]).categories_

代码结果为:
[array([‘female’, ‘male’], dtype=object), array([‘C’, ‘Q’, ‘S’], dtype=object)]
数据的处理其实也是一行代码就可以处理完

data_.iloc[:,1:-1] = OrdinalEncoder().fit_transform(data_.iloc[:,1:-1])
  • preprocessing.OneHotEncoder:独热编码,创造哑变量
    在这里插入图片描述
    类别OrdinalEncoder可以用来处理有序变量,但对于名义变量,我们只有使用哑变量的方式来处理,才能够尽量向算法传达最准确的信息:
    在这里插入图片描述
    这样的变化,让算法能够彻底领悟,原来三个取值是没有可计算性质的,是“有你就没有我”的不等概念。在我们的数据中,性别和舱门,都是这样的名义变量。因此我们需要使用独热编码,将两个特征都转换为哑变量。
from sklearn.preprocessing import OneHotEncoder
X = data.iloc[:,1:-1]
enc = OneHotEncoder(categories='auto').fit(X)
result = enc.transform(X).toarray()

可以用.get_feature_names()查看对应的特征名称

enc.get_feature_names()

输出的结果是这样的:
array([‘x0_female’, ‘x0_male’, ‘x1_C’, ‘x1_Q’, ‘x1_S’],dtype=object)
还有一种更加直观的做法

import pandas as pd
# axis = 1 ,表示跨行进行合并,也就是将两表左右相连,如果是axis=0,就是将量表上下相连
newdata = pd.concat([data,pd.DataFrame(result)],axis=1)
newdata.drop(["Sex","Embarked"],axis=1,inplace=True)  # 删除 Sex和Embarked这两列
newdata.columns = ["Age","Survived","Female","Male","Embarked_C","Embarked_Q","Embarked_S"]
newdata.head()

运行结果如下,是不是一目了然?
在这里插入图片描述
最后一张图,总结一下以上三种~的用法
在这里插入图片描述
这张表是变量的分类
在这里插入图片描述

处理连续性特征:二值化与分段

  • sklearn.preprocessing.Binarizer
    根据阈值将数据二值化(将特征值设置为0或1),用于处理连续型变量。大于阈值的值映射为1,而小于或等于阈值的值映射为0。默认阈值为0时,特征中所有的正值都映射到1。
from sklearn.preprocessing import Binarizer
data_2.iloc[:,0]=Binarizer(threshold=30).fit_transform(data_2.iloc[:,0].values.reshape(-1,1))  #30以上的为1,30以下的为0
  • preprocessing.KBinsDiscretizer
    这是将连续型变量划分为分类变量的类,能够将连续型变量排序后按顺序分箱后编码。总共包含三个重要参数:
    在这里插入图片描述
from sklearn.preprocessing import KBinsDiscretizer
X = data.iloc[:,0].values.reshape(-1,1)
est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform')
est.fit_transform(X)
set(est.fit_transform(X).ravel()) # 把数据全都导进来,有重复的就去掉

在这里插入图片描述
如果采用独热编码

est = KBinsDiscretizer(n_bins=3, encode='onehot', strategy='uniform')
est.fit_transform(X).toarray()# 可以看到他变成了哑变量

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值