scikit-learn库学习-特征工程

特征工程

  • 一、分类特征
    • 1、pandas库
    • 2、scikit-learn库
      • 2.1 DictVectorizer
      • 2.2 OneHotEncoder
      • 2.3 FeatureHasher
  • 二、特征管道
    • 1、优点
    • 2、用法(串行化)

一、分类特征

常用的解决方法是独热编码( One-Hot 编码)。 它可以有效增加额外的列, 让 0 和 1 出现在对应的列分别表示每个分类值有或无。

1、pandas库

pd.get_dummies()

pandas.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, sparse=False, drop_first=False, dtype=None)

参数说明

  • data:array-like, Series, or DataFrame
  • prefix:给输出的列添加前缀,如prefix=“A”,输出的列会显示类似
  • prefix_sep:设置前缀跟分类的分隔符sepration,默认是下划线"_"

实例解释

在这里插入代码片

2、scikit-learn库

2.1 DictVectorizer

可以用于处理对象是符号化(非数字化)的但是具有一定结构的特征数据,如字典等。
DictVectorizer对非数字化的处理方式是,借助原特征的名称,组合成新的特征,并采用0/1的方式进行量化,而数值型的特征转化比较方便,一般情况维持原值即可。

from sklearn.feature_extraction import DictVectorizer

data = [{'price': 850000, 'rooms': 4, 'neighborhood': 'Queen Anne'},
        {'price': 700000, 'rooms': 3, 'neighborhood': 'Fremont'},
        {'price': 650000, 'rooms': 3, 'neighborhood': 'Wallingford'},
        {'price': 600000, 'rooms': 2, 'neighborhood': 'Fremont'}]
vec = DictVectorizer(sparse=False, dtype=int)			# sparse=False意思是不产生稀疏矩阵
a = vec.fit_transform(data)
print(vec.get_feature_names())					# 查看转换后的列名

out:
['neighborhood=Fremont', 'neighborhood=Queen Anne', 'neighborhood=Wallingford', 'price', 'rooms']

如果分类特征有许多枚举值, 那么数据集的维度就会急剧增加。因此用稀疏矩阵表示会非常高效,这时可以sparse=True
Scikit-Learn 的许多评估器都支持稀疏矩阵输入

2.2 OneHotEncoder

处理数值型字段。

from sklearn.preprocessing import OneHotEncoder

OneHotEncoder(n_values=’auto’, categorical_features=all,dtype=<type ‘numpy.float64’>, sparse=True,handle_unknown=’error’)

参数说明

  • n_values:每个特征的取值个数,可以为auto、整数或整数数组。①若为auto时,从训练集中获取特征的取值范围;②若为整数时,则特征的取值必须在range(n_values)范围内;③若为整数数组,则X[:,i]对应的分类特征有n_values[i]个取值值,特征的取值在range(n_values[i])内。
  • categorical_features:可能取值为all、indices数组或mask。①若为all时,代表所有的特征都被视为分类特征;②若为indices数组时,表示分类特征的indices值;③若mask时,表示特征长度数组。
  • sparse:若为True时,返回稀疏矩阵,否则返回数组。
  • handle_unknown:可以为字符串、error、ignore,在转换过程中,如果出现位置的分类特征时,是抛出错误或直接忽略。

PS:具体参数名称随着版本升级有所改变。

实例解释

from sklearn.preprocessing import OneHotEncoder
import numpy as np

a = np.array([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])
enc = OneHotEncoder(dtype=int)
data = enc.fit_transform(a).toarray()
print(data)

out:
[[1 0 1 0 0 0 0 0 1]
 [0 1 0 1 0 1 0 0 0]
 [1 0 0 0 1 0 1 0 0]
 [0 1 1 0 0 0 0 1 0]]

以[0, 0, 3]为例,第一个维度有2种(分别为0和1),因此前输出的前两个 [1 0] 表示0,第二个维度有3(1 0 0 表示0),第三个维度有4(0 0 0 1 表示3)。

2.3 FeatureHasher

此类将符号特性名称(字符串)的序列转换为scipy.sparse矩阵,使用哈希函数计算与名称对应的矩阵列。
是DictVectorizer和CountVectorizer的低内存替代品,用于大规模(在线)学习和内存紧张的情况,例如在嵌入式设备上运行预测代码时。

from sklearn.feature_extraction import FeatureHasher

FeatureHasher(n_features=1048576, input_type="dict", dtype=<class 'numpy.float64'>, alternate_sign=True, non_negative=False)

二、特征管道

Pipeline可以将许多算法模型串联起来,可以用于把多个estamitors级联成一个estamitor,比如将特征提取、归一化、分类组织在一起形成一个典型的机器学习问题工作流。

PS: pineline中除了最后一个之外的所有的estimators都必须是变换器(transformers)(也就是说必须要有一个transform方法)。最后一个estimator可以是任意的类型(transformer, classifier, regresser, etc)。

1、优点

  • 只需要一次fit和predict就可以在数据集上训练一组estimators。
  • 可以把grid search用在pipeline中所有的estimators的参数组合上面,对参数进行选择。

2、用法(串行化)

(1)通过steps参数,设定数据处理流程
格式为(‘key’,‘value’),其中key是一个标识步骤的名称字符串,是自己为这一step设定的名称,value是对应的estimator对象。最后通过list将这些step传入。前n-1个step中的类都必须有transform函数,最后一步可有可无,一般最后一步为模型。

from sklearn.pipeline import Pipeline
from sklearn.svm import SVC
from sklearn.decomposition import PCA  # 主成分分析

estimators = [('reduce_dim', PCA()), ('clf', SVC()) ]
pipe = Pipeline(estimators)
pipe.fit(X, y)

训练得到的是一个模型,可直接用来预测,预测时,数据会从step1开始进行转换,避免了模型用来预测的数据还要额外写代码实现。还可通过pipe.score(X,Y)得到这个模型在X训练集上的正确率。

(2)通过make_pipeline函数实现
它是Pipeline类的简单实现,只需传入每个step的类实例即可,不需自己命名,自动将类的小写设为该step的名。

from sklearn.linear_model import Lasso
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import RobustScaler 		#用来解决离群点

p=make_pipeline(RobustScaler(), Lasso(alpha =0.0005, random_state=1))

你可能感兴趣的:(学习记录,sklearn库)