文章目录
- 一、概述
-
- 1.1数据预处理和特征工程
- 1.2sklearn中数据预处理和特征工程
- 二、数据预处理
-
- 2.1数据无量纲化
- 2.2缺失值
一、概述
1.1数据预处理和特征工程
1、数据挖掘五大流程:
- 获取数据
-
数据预处理
(1)定义:数据预处理是从数据中检测,纠正或删除损坏,不准确或不适用于模型的记录的过程
(2)可能面对的问题有:数据类型不同,比如有的是文字,有的是数字,有的含时间序列,有的连续,有的间断。也可能,数据的质量不行,有噪声,有异常,有缺失,数据出错,量纲不一,有重复,数据是偏态,数据量太大或太小
(3)数据预处理的目的:让数据适应模型,匹配模型的需求
-
特征工程:
(1)定义:特征工程是将原始数据转换为更能代表预测模型的潜在问题的特征的过程,可以通过挑选最相关的特征,提取特征以及创造特征来实现。其中创造特征又经常以降维算法的方式实现。
(2)可能面对的问题有:特征之间有相关性,特征和标签无关,特征太多或太小,或者干脆就无法表现出应有的数据现象或无法展示数据的真实面貌
(3)特征工程的目的:降低计算成本,提升模型上限
- 建模,测试模型并预测出结果
- 上线,验证模型效果
1.2sklearn中数据预处理和特征工程
- 模块preprocessing:几乎包含数据预处理的所有内容
- 模块Impute:填补缺失值专用
- 模块feature_selection:包含特征选择的各种方法的实践
- 模块decomposition:包含降维算法
二、数据预处理
2.1数据无量纲化
1、定义:我们往往有着将不同规格的数据转换到同一规格,或不同分布的数据转换到某个特定分布
的需求,这种需求统称为将数据“无量纲化”。
注意:树的算法不需要无量纲化,树可以将任意数据处理的非常好。
2、分类:线性和非线性。
线性的无量纲化包括中心化和缩放处理。
- 中心化的本质是让所有记录减去一个固定值,即让数据样本数据平移到某个位置。
- 缩放的本质是通过除以一个固定值,将数据固定在某个范围之中,取对数也算是一种缩放处理。
3、sklearn中的函数
(1)preprocessing.MinMaxScaler
- 定义:当数据(x)按照最小值中心化后,再按极差(最大值 - 最小值)缩放,数据移动了最小值个单位,并且会被收敛到[0,1]之间,而这个过程,就叫做数据归一化。
- 在sklearn当中,我们使用preprocessing.MinMaxScaler来实现这个功能。MinMaxScaler有一个重要参数,feature_range,控制我们希望把数据压缩到的范围,默认是[0,1]。
from sklearn.preprocessing import MinMaxScaler
import pandas as pd
data=[[-1,2],
[-0.5,6]
,[0,10]
,[1,18]]
pd.DataFrame(data)
#归一化1
scaler=MinMaxScaler()#实例化
scaler=scaler.fit(data)#生成min(x)和max(x)
result=scaler.transform(data)#通过接口导出结果
print(result)
result_=scaler.fit_transform(data)#一步达成
scaler.inverse_transform(result)#将归一化的结果逆转
#归一化2
scaler1=MinMaxScaler(feature_range=[5,10])
result1=scaler1.fit_transform(data)
print(result1)
(2)preprocessing.StandardScaler
- 当数据(x)按均值(μ)中心化后,再按标准差(σ)缩放,数据就会服从为均值为0,方差为1的正态分布(即标准正态分布),而这个过程,就叫做数据标准化
#标准化
from sklearn.preprocessing import StandardScaler
data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
scaler = StandardScaler() #实例化
scaler.fit(data) #fit,本质是生成均值和方差
scaler.mean_ #查看均值的属性mean_
scaler.var_ #查看方差的属性var_
x_std = scaler.transform(data) #通过接口导出结果
x_std.mean() #导出的结果是一个数组,用mean()查看均值
x_std.std() #用std()查看方差
scaler.fit_transform(data) #使用fit_transform(data)一步达成结果
scaler.inverse_transform(x_std) #使用inverse_transform逆转标准化
(3)如何选择标准化和归一化
标准化:在PCA,聚类,逻辑回归,支持向量机,神经网络。
归一化:对异常值敏感,数字图像处理中量化像素强度
(4)其他数据无量纲方法
2.2缺失值
在这里我们使用titanic的部分数据进行。
1、读入数据
import pandas as pd
data=pd.read_csv("E:/21国赛/Titannic/Narrativedata.csv",index_col=0)
data.info()
data.head()
年龄和舱门具有缺失值。
2、填补缺失值:impute.SimpleImputer
(1)格式:
class sklearn.impute.SimpleImputer (missing_values=nan, strategy=’mean’, fill_value=None, verbose=0,
copy=True)
(2)参数
参数 | 含义 |
---|---|
missing_values | 告诉SimpleImputer,数据中的缺失值长什么样,默认空值np.nan |
strategy | 我们填补缺失值的策略,默认均值。输入“mean”使用均值填补(仅对数值型特征可用;输入“median"用中值填补(仅对数值型特征可用;输入"most_frequent”用众数填补(对数值型和字符型特征都可用);输入“constant"表示请参考参数“fill_value"中的值(对数值型和字符型特征都可用 |
fill_value | 当参数startegy为”constant"的时候可用,可输入字符串或数字表示要填充的值,常用0 |
copy | 默认为True,将创建特征矩阵的副本,反之则会将缺失值填补到原本的特征矩阵中去。 |
#填补年龄
Age=data.loc[:,"Age"].values.reshape(-1,1)
#print(Age[:20])
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)
data.loc[:,"Age"]=imp_median
data.info()
输出结果:
同理对Embarked进行填补
Embarked=data.loc[:,"Embarked"].values.reshape(-1,1)
imp_mode=SimpleImputer(strategy='most_frequent')
imp_mode=imp_mode.fit_transform(Embarked)
data.loc[:,"Embarked"]=imp_mode
data.info()
输出结果:
3、处理分类特征:编码和哑变量
编码:将文字型数据转换为数值型。
preprocessing.LabelEncoder:标签专用,能够将分类转换为分类数值
#分类变量
y=data.iloc[:,-1]
le=LabelEncoder()
le=le.fit(y)#导入数据
label=le.transform(y)
le.classes_
label
#le.fit_transform(y) 一步到位
data.iloc[:,-1] = label
输出结果
preprocessing.OrdinalEncoder:特征专用,能够将分类特征转换为分类数值
#分类变量:专为特征分类
from sklearn.preprocessing import OrdinalEncoder
data_=data.copy()
data_.head()
OrdinalEncoder().fit(data_.iloc[:,1:-1]).categories_
data_.iloc[:,1:-1]=OrdinalEncoder().fit_transform(data_.iloc[:,1:-1])
print(data_.head())
preprocessing.OneHotEncoder:独热编码,创建哑变量。
三种分类数据:
- 三种取值S,C,Q是相互独立的,彼此之间完全没有联系,表达的是S≠C≠Q的概念。这是名义变量
- 三种取值不是完全独立的,举例:在性质上可以有高中>初中>小学这样的联系,学历有高低,但是学历取值之间却不是可以计算的,我们不能说小学 + 某个取值 = 初中。这是有序变量
-
各个取值之间有联系,且是可以互相计算的,比如体重(>45kg,>90kg,>135kg),其中120kg - 45kg = 90kg,分类之间可以通过数学计算互相转换。这是有距变量
对于名义变量我们需要使用哑变量进行变换。
#独热编码
from sklearn.preprocessing import OneHotEncoder
X=data.iloc[:,1:-1]
enc=OneHotEncoder(categories='auto').fit(X)
result=enc.transform(X).toarray()
#print(result)
print(enc.get_feature_names())
#合并
newdata=pd.concat([data,pd.DataFrame(result)],axis=1)
print(newdata.head())
newdata.drop(["Sex","Embarked"],axis=1,inplace=True)
newdata.columns=["Age","Survived","Female","Male","Embarked_C","Embarked_Q","Embarked_S"]
print(newdata.head())
输出结果:
总结: