0%

sklearn入门-数据预处理

sklearn.preprocessing

数据填充(sklearn.preprocessing.Imputer)

收集到的数据总会遇到一些残缺值,如果不想丢弃这个样本,就只能想办法最数据进行填充了,一般的填充方法有:向上填充、向下填充、均值填充、中位数填充等等。填充数据可以使用sklearn中的类,也可以使用pandas里面的方法~

Imputer(missing_values=’NaN’, strategy=’mean’, axis=0, verbose=0, copy=True)
missing_values='NaN' 用于匹配缺失值
strategy='mean' 填充策略,[‘mean’, ‘median’, ‘most_frequent’],均值、中位数、众数。
axis=0 填充方向,默认为列
verbose=0 控制imputer的详细程度
copy=True 是否拷贝

数据标准化(skleaarn.preprocessing.StandardScaler)

z = (x - u) / s ,转换使得数据均值为0,方差为1。

StandardScaler(copy=True, with_mean=True, with_std=True)
with_mean=True 若为False,则 u=0
with_std=True 若为False,则 z=1

数据归一化(sklearn.preprocessing.MinMaxScaler)

缩放数据到一定范围。

MinMaxScaler(feature_range=(0, 1), copy=True)

独热编码

对非数值型的数据进行编码,根据数据每一特征的值的种类,将其生成向量。1~k

  1. sklearn.preprocessing.OneHotEncoder()

    OneHotEncoder(n_values=’auto’, categorical_features=’all’, categories=’auto’, dtype=<class‘numpy.float64’>, sparse=True, handle_unknown=’error’)
    n_values 每个特征使用几维数据,默认由数据集自动决定
    categorial_features 指定对哪些特征进行编码,默认为传入的所有值,通过bool值或索引进行指定(e.g. [True, True, False] / [0, 1])
    categories 每个特征的类别
    dtype 编码数值格式
    sparse 默认返回稀疏矩阵,设置为False可直接返回array,否则需要.toarray()转换
    handle_unknown ‘error’/‘ignore’,遇到未知类别,返回错误/忽略

1
2
3
4
5
6
7
8
9
10
from sklearn.preprocessing import OneHotEncoder
OneHot_enc = OneHotEncoder(sparse=False)

#第一次对数据进行编码直接使用 fit_transform()
data1_coded = OneHot_enc.fit_transform(data1)
#对相同结构数据集再次编码,仅需 transform()
data2_coded = OneHot_enc.transform(data2)

array.reshape(-1, 1) #数据仅包含一个特征,转化为n×1维矩阵
array.reshape(1, -1) #数据仅包含一个样本,转化为1×n维矩阵

使用OneHotEncoder编码后,返回为一个数组(np.array),且编码后的数据会丢失原来的列名称。

  1. pandas.get_dummies()
    get_dummies()只对输入数据中类型为 object 的数据进行独热编码 (故使用该方法进行独热编码时可以不分离出数值型特征) 。对数据进行编码后,返回 pd.DataFrame ,并且可以根据特征中不同的值自动生成列名称。

    getdummies(data, prefix=None, prefix_sep=’‘, dummy_na=False, columns=None, sparse=False, drop_first=False, dtype=None)
    prefix 列表或这字符串用于添加列名称
    prefix_sep 字符串/列表/字典,基于prefix,用作分隔符
    dummy_na 默认’False’忽略空值,设置为’True’则新增列用于指示空值
    columns 需要编码的列名称
    drop_first 是否删除特征的第一类

1
2
import pandas as pd
data_coded = pd.get_dummies(data) #不改参数就可以表现的很优秀啦

标签编码(sklearn.preprocessing.OrdinalEncoeder)

对非数值型的数据进行编码,根据数据每一特征的值的种类,将其生成向量。1~1

若使用 LabelEncoder,则每次只能对一列数据进行编码,输入的数据也需要是一维,本身是适用于对样本标签进行编码。

特征降维-主成分分析法PCA(sklearn.decomposition.PCA)

特征降维能在尽可能多的保留数据信息的情况下减少特征的数量,在数据样本不足而特征值过多的时可以是模型得到较好的解,还能提高模型泛化能力……此外,还能减少模型的训练成本,加快运算速度。

PCA(n_components=None, copy=True, whiten=False, svd_solver=’auto’, tol=0.0, iterated_power=’auto’, random_state=None)
n_components=None 期望保留的主成分个数。为整数时,即为保留的个数;若为小于1的正整数,则保留使得方差百分比大于该值的最少数目的成分。还可以传入字符型参数,比如’mle’,将自动选取特征个数n,使得满足所要求的方差百分比。
copy=True 是否复制原始数据。
whiten=False 白化,是否要使得每个特征具有相同的方差。
svd_solver='auto' string {‘auto’,’full’,’arpack’,’randomized’}.
(老实说,下面这一段是谷歌翻译得来的,还没有时间细究,因为我也还不太明白)
auto:解析器由基于X.shape和n_components的默认策略选择:如果输入数据大于500x500且要提取的组件数低于数据最小维数的80%,那么效率更高’随机化’方法已启用。否则,计算精确的完整SVD并随后截断。
full:运行完全完整的SVD通过scipy.linalg.svd调用标准LAPACK解算器并通过后处理选择组
arpack:运行SVD截断为n_components通过scipy.sparse.linalg.svds调用ARPACK解算器。它严格要求0 = 0,或’auto’,由svd_solver ==’randomized’计算的幂方法的迭代次数。
random_state=None (略)

1
2
3
4
5
6
7
from sklearn.decomposition import PCA
pca = PCA(n_components=None) #这里最好要指定一个数的啊,可能小数会比较方便
pca.fit_transform(data) #对数据进行训练并降维
components = pca.components_ #可获得方差比由大到小排列的所有主成分
var = pca.explained_variance_ #转换后个主成分的方差
var_atio = pca.explained_variance_ratio_ #转换后个主成分的方差比
n_components = pca.n_components_ #可返回需要的特征数

(完)