intro

一般包自带的数据都是经过筛选,预测效果好,没有缺失等问题。

数据挖掘的五大流程:

  • 获取数据
  • 数据预处理:让数据适应模型,匹配模型的需求。
  • 特征工程:将原始数据转换为更能代表预测模型的潜在问题的特征的过程,可以通过挑选最相关的特征,提取特征以及创造特征来实现。其中创造特征又经常以降维算法的方式实现。

可能面对的问题:特征之间有相关性,特征和标签无关,特征太多或太小,或者干脆就无法表现出应有的数据现象或无法展示数据的真实面貌。

### sklearn中的数据预处理和特征工程

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

数据预处理

数据无量纲化

  • 梯度和矩阵为核心的算法中(逻辑回归,支持向量机,神经网络),无量纲化可以加快求解速度;
  • 距离类模型(K近邻,K-Means聚类)无量纲化可以提升模型精度

无量纲化包括线性和非线性。

线性无量纲化包括中心化处理和缩放处理。

归一化Normalization

归一化服从正态分布。

在sklearn中,使用preprocessing.MinMaxScaler来实现这个功能。参数feature_range控制目标压缩范围,默认[0,1]

标准化Standardization

preprocessing.StandardScaler

对于StandardScaler和MinMaxScaler来说,空值NaN会被当做是缺失值,在fit的时候忽略,在transform的时候保持缺失NaN的状态显示。

一般选择StandardScaler来进行缩放,MinMaxScaler对异常值敏感。

代码

MinMaxScaler

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from sklearn.preprocessing import MinMaxScaler
data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
import pandas as pd
pd.DataFrame(data)
#实现归一化
scaler = MinMaxScaler() #实例化
scaler = scaler.fit(data) #fit,在这里本质是生成min(x)和max(x)
result = scaler.transform(data) #通过接口导出结果result



result_ = scaler.fit_transform(data) #训练和导出结果一步达成
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) #fit_transform一步导出结果result

StandardScaler

1
2
3
4
5
6
7
8
9
10
11
12

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逆转标准化

缺失值

以泰坦尼克号数据为例:一个数值型,两个字符型。

1
2
3
import pandas as pd
data = pd.read_csv(r"D:\Sklearn\Narrativedata.csv",index_col=0)#第一列作为索引不作为数据
data.head()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
data.info()
#填补年龄
Age = data.loc[:,"Age"].values.reshape(-1,1) #sklearn当中特征矩阵必须是二维
Age[:20]
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) #fit_transform一步完成调取结果
imp_median = imp_median.fit_transform(Age)
imp_0 = imp_0.fit_transform(Age)
imp_mean[:20]
imp_median[:20]
imp_0[:20]
#在这里我们使用中位数填补Age
data.loc[:,"Age"] = imp_median
data.info()
#使用众数填补Embarked
Embarked = data.loc[:,"Embarked"].values.reshape(-1,1)
imp_mode=SimpleImputer(strategy="most_frequent")
data.loc[:,"Embarked"]=imp_mode.fit_transform(Embarked)
data.info()

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

sklearn中必须导入数值型

文字型转化为数值型

preprocessing

  • preprocessing.LabelEncoder:标签专用,能够将分类转换为分类数值
  • preprocessing.OrdinalEncoder:特征专用,能够将分类特征转换为分类数值
  • preprocessing.OneHotEncoder:独热编码,创建哑变量

不同性质的分类数据: - 取值互相独立 - 有序变量:例如大学、高中、小学 - 有距变量:可计算

OrdinalEncoder用来处理有序变量,对于名义变量,要使用独热编码

1
2
3
4
5
6
7
8
9
10
11
12
from sklearn.preprocessing import LabelEncoder
y = data.iloc[:,-1] #要输入的是标签,不是特征矩阵,所以允许一维
le = LabelEncoder() #实例化
le = le.fit(y) #导入数据
label = le.transform(y) #transform接口调取结果
le.classes_ #属性.classes_查看标签中究竟有多少类别
label #查看获取的结果label
le.fit_transform(y) #也可以直接fit_transform一步到位
le.inverse_transform(label) #使用inverse_transform可以逆转
data.iloc[:,-1] = label #让标签等于我们运行出来的结果
data.head()

1
2
3
4
5
6
7
from sklearn.preprocessing import OrdinalEncoder
#接口categories_对应LabelEncoder的接口classes_,一模一样的功能
data_ = data.copy()
data_.head()
OrdinalEncoder().fit(data_.iloc[:,1:-1]).categories_
data_.iloc[:,1:-1] = OrdinalEncoder().fit_transform(data_.iloc[:,1:-1])
data_.head()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
data.head()
from sklearn.preprocessing import OneHotEncoder
X = data.iloc[:,1:-1]
enc = OneHotEncoder(categories='auto').fit(X)
result = enc.transform(X).toarray()
result

OneHotEncoder(categories='auto').fit_transform(X).toarray()

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

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

preprocessing.Binarizer

二值化是对文本计数数据的常见操作,分析人员可以决定仅考虑某种现象的存在与否。它还可以用作考虑布尔随机变量的估计器的预处理步骤(eg.使用贝叶斯设置中的伯努利分布建模)

1
2
3
4
5
6
#将年龄二值化
data_2 = data.copy()
from sklearn.preprocessing import Binarizer
X = data_2.iloc[:,0].values.reshape(-1,1) #类为特征专用,所以不能使用一维数组
transformer = Binarizer(threshold=30).fit_transform(X)
transformer